ESP32 použití RTC

30.12.2022 Arduino #esp32 #rtc #arduino

Způsoby, jak používat RTC s ESP32.


ESP32 používá dva hardwarové časovače za účelem udržení systémového času. Systémový čas lze udržovat pomocí jednoho nebo obou hardwarových časovačů v závislosti na účelu aplikace a požadavcích na přesnost systémového času. Dva hardwarové časovače jsou:

  • RTC timer: Tento časovač umožňuje udržování času v různých režimech spánku a může také udržovat čas během všech resetů (s výjimkou resetů při zapnutí, které resetují časovač RTC). Odchylka frekvence závisí na zdrojích hodin časovače RTC a ovlivňuje přesnost pouze v režimech spánku, v takovém případě bude čas měřen s rozlišením 6,6667 μs.

  • Časovač s vysokým rozlišením: Tento časovač není k dispozici v režimech spánku a nezůstane po resetování zachován, ale má větší přesnost. Časovač využívá zdroj hodin APB_CLK (typicky 80 MHz), který má frekvenční odchylku menší než ±10 ppm. Čas bude měřen s rozlišením 1 μs.

Možné kombinace hardwarových časovačů používaných k udržení systémového času jsou uvedeny níže:

  • RTC a časovač s vysokým rozlišením (výchozí)
  • RTC
  • Časovač s vysokým rozlišením
  • Žádný

Zdroje hodin časovače RTC

Časovač RTC má následující zdroje hodin:

  • Internal 150 kHz RC oscillator(výchozí): Vyznačuje se nejnižší spotřebou proudu v režimu hlubokého spánku a není závislý na žádných externích součástech. Frekvenční stabilita tohoto zdroje hodin je však ovlivněna kolísáním teploty, takže čas se může posunout jak v režimu hlubokého spánku, tak v režimu lehkého spánku.
  • External 32 kHz crystal: Vyžaduje připojení krystalu 32 kHz k kolíkům 32K_XP a 32K_XN. Tento zdroj poskytuje lepší frekvenční stabilitu na úkor mírně vyšší (o 1 μA) spotřeby proudu v hlubokém spánku.
  • External 32 kHz oscillator at 32K_XN pin: Umožňuje použití hodin 32 kHz generovaných externím obvodem. Externí hodinový signál musí být připojen na pin 32K_XN. Amplituda by měla být menší než 1,2 V pro sinusový signál a menší než 1 V pro obdélníkový signál. Napětí v běžném režimu by mělo být v rozsahu 0,1 < Vcm < 0,5xVamp, kde Vamp znamená amplitudu signálu. V tomto případě nelze pin 32K_XN použít jako pin GPIO.
  • Internal 8.5 MHz oscillator, divided by 256 (~33 kHz): Poskytuje lepší frekvenční stabilitu než na úkor vyšší (o 5 μA) spotřeby proudu v hlubokém spánku. Nevyžaduje ani externí komponenty. Internal 150 kHz RC oscillator

Výběr závisí na vašich požadavcích na přesnost systémového času a spotřebu energie v režimech spánku. Chcete-li upravit zdroj hodin RTC, nastavte CONFIG_RTC_CLK_SRC v konfiguraci projektu.

Další podrobnosti o požadavcích na zapojení externího krystalu nebo externího oscilátoru naleznete v pokynech pro návrh hardwaru ESP32.

Programování RTC pomocí ESP32Time

Pro programování RTC na ESP32, lze využít knihovnu ESP32Time.h. Tato knihovna jednoduchým zajistí vše potřebné a přístup k časovým údajům je také snadný.

#include "ESP32Time.h"
ESP32Time rtc(3600);

String getDateTime;

void setup() {
  rtc.setTime(00, 50, 17, 24, 07, 2022);   // Setting time - seconds, minutes,  hours, day, mounth, year
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    getDateTime=rtc.getTime("%F %H:%M:%S");    // Actual time
    String wData=getDateTime;
    Serial.println(wData);
    previousMillis = currentMillis;
  }
}

Nevýhodou tohoto přístupu je, že při každém restartu se RTC vynulují a ve funkci setup() se nastaví zadané hodnoty. Tento problém řeší použít externího modulu RTC, např. DS3231

Programování RTC pomocí DS3231

DS3231 je  modul RTC (Real Time Clock). Používá se k udržování data a času u většiny projektů v oblasti elektroniky. Tento modul má vlastní napájení z knoflíkových článků, pomocí kterého uchovává datum a čas, i když je odpojeno hlavní napájení nebo MCU prošel tvrdým resetem. Jakmile tedy v tomto modulu nastavíme datum a čas, bude jej modul vždy sledovat. Existuje několik typů integrovaných obvodů RTC, jako jsou DS1307, DS3231 atd.

Piny a jejich funkce modulu DS3231.

Číslo PIN Název PIN Ostatní jména Používání
1 Gnd Přízemní Zemnící pin modulu
2 Vdd Vcc, 5V Napájecí pin (tolerované 3-5V)
3 SCK D0,SCL,CLK Funguje jako hodinový pin. Používá se pro I2C i SPI
4 SDA D1,MOSI Datový pin modulu. Používá se pro IIC i SPI
5 RES RST,RESET Resetuje modul (užitečné během SPI)
6 DC A0 Pin příkazu dat. Používá se pro protokol SPI
7 CS Výběr čipu Užitečné, když se používá více než jeden modul pod protokolem SPI

Pro programování RTC s využitím modulu DS3231 se pro programování s ESP32 použije knihovna RTClib.h.

#include "RTClib.h"
RTC_DS3231 rtc;
String getDateTime;

int Year, Month, Day, Hour, Minute, Second;

void setup() {
  Serial.begin(115200);

  // Time
  rtc.begin();
  rtc.adjust(DateTime(2022, 12, 01, 10, 25, 00));  // Setting time - year, mounth, day, hours, minutes, seconds
}

void loop() {
  
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    DateTime now = rtc.now();
    getDateTime = String(now.year())+"-" + String(now.month()) + "-"+now.day()+" "+now.hour()+":"+now.minute()+":"+now.second();
    String wData=getDateTime;
    Serial.println(wData);
    previousMillis = currentMillis;
  }
  
}