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;
}
}