Sådan bruges DS3231 Real-Time Clock-modulet (RTC) med en ESP32

Sadan Bruges Ds3231 Real Time Clock Modulet Rtc Med En Esp32



ESP32 er et smart mikrocontrollerkort med indbygget Wi-Fi og Bluetooth-funktioner. ESP32 kommer med en intern RTC, men dens funktion er afhængig af strøm. Så hvis du vil designe projekter eller kredsløb, som du vil køre, selv når der ikke er strøm, skal du bruge et hvilket som helst eksternt RTC-modul som DS1307 eller DS3231.

Vi har allerede lavet en tutorial om DS1307 interface med ESP32-modulet . I dag vil vi diskutere det grundlæggende i DS3231 RTC-sensoren og kontrollere, hvordan man kan forbinde den med ESP32-kortet.

Indholdsfortegnelse:







1. Hvad er DS3231 RTC-modul



2. Sådan interfaces DS3231 med ESP32



3. Hardware





4. Kode

5. Output



6. Sådan viser du RTC DS3231-tiden på en OLED-skærm ved hjælp af ESP32

Konklusion

1. Hvad er DS3231 RTC-modulet

DS3231-modulet giver meget nøjagtig tidtagning. Den inkluderer en integreret temperaturkompenseret krystaloscillator (TCXO) for at give os tid med stor præcision. Modulet fungerer på I2C-protokollen ved hjælp af Master-Slave-konfigurationen. Den kan holde tid og dato med et backup-batteri, selv når der ikke er nogen hovedindgangsstrøm. Det bruges almindeligvis i enheder, der er tids- og datoafhængige.

DS3231 holder styr på sekunder, minutter og timer. Det kan også føre en registrering af datoer og ugedage. Når det drejer sig om skudår, justerer den automatisk tiden derefter. Den kan også vise tid i både 12-timers eller 24-timers format, komplet med en AM/PM-indikator.

1.1. DS3231 vs DS1307

Både DS3231 og DS1307 er tidsregistrerende moduler med batteribackup-understøttelse. DS3231 er dog mere præcis end DS1307. Hovedårsagen er, at DS1307 er afhængig af ekstern 32kHz krystal til tidtagning.

RTC DS3231 har dog en intern temperaturkompenseret krystaloscillator (TCXO). Dette gør den mindre påvirket af ydre temperatur og som et resultat, har den en nøjagtighedsfordel på få minutter om året end DS1307.

1.2. DS3231 Pinout

DS3231 fungerer ved hjælp af I2C-protokollen. I hjertet af dette RTC-modul har vi den nøjagtige RTC-chip designet af Maxim. Denne chip håndterer alle tidsfunktioner og kommunikerer ved hjælp af I2C med ESP32 eller Arduino-kort.

Hovedbenene på RTC DS3231-moduler er:

  • VCC: Tilslut denne pin til den positive terminal på din strømkilde.
  • GND: Jordforbindelse.
  • SDA: Seriel data-pin (bruges til I2C-kommunikation).
  • SCL: Seriel ur-pin (også en del af I2C-grænsefladen).
  • QW: Square Wave udgangsben (kan generere et periodisk signal, f.eks. til alarmer eller andre timingformål).
  • 32K: 32KHz oscillatorudgang (nyttigt til præcise timing-applikationer).

Følgende er de vigtigste indbyggede komponenter i RTC DS3231-modulet:

  • Batteriholder: Det gør det muligt for modulet at fortsætte med at køre, når den eksterne strøm er fraværende.
  • RTC-chip: Denne chip vedligeholder klokkeslæt og dato.
  • AT24C32 EEPROM: Det giver ikke-flygtig lagring til datalogning og andre formål med 1.000.000 skrivecyklusser.
  • TCXO: Temperaturkompenseret oscillator for at give den korrekte tid til et varierende temperaturområde.
  • Temperatur måler: Den tager temperaturaflæsninger og leverer dem som en del af modulets funktion.

2. Sådan interfaces DS3231 med ESP32

For at forbinde DS3231 med ESP32 skal du installere RTClib bibliotek først. Efter at have installeret dette Adafruit RTC-bibliotek, kan du forbinde dit ESP32-kort med DS3231 ved hjælp af I2C-protokollen. For at forbinde ESP32 I2C med RTC DS3231-modulet kan du bruge ESP32 D21- og D22-benene.

2.1. Ledningsdiagram for ESP32 med RTC DS3231

Først skal du forbinde ESP32 med dit I2C RTC DS3231-modul. Følg nedenstående pin-konfiguration for ledninger:

Efter at have tilsluttet ESP32 med RTC DS3231, skulle dit ledningsdiagram se sådan ud. Du kan også forsyne DS3231 med strøm fra VIN-stiften på ESP32. Driftsspændingerne for DS3231 er 3,3 til 5,5 VDC.

2.2. Installation af de nødvendige biblioteker

Når kredsløbet er klar, er næste trin at konfigurer dit ESP32-kort med Arduino IDE . For at forbinde DS3231 skal du installere RTClib bibliotek . Du kan installere det ved at bruge Arduino IDE bibliotekshåndtering.

3. Hardware

Du skal bruge følgende hardware til at designe det DS3231-baserede RTC-ur med ESP32:

  • ESP32 udviklingstavle
  • RTC DS3231 modul
  • CR2032 batteri
  • Jumper ledninger
  • Brødbræt

4. Kode

Efter installation af RTC-biblioteket er den næste del at skrive koden til DS3231 og uploade den til ESP32-kortet. Først skal du skrive koden for at indstille din aktuelle tid. Når du har indstillet tiden i DS3231, vil den huske tiden og fortsætte med at køre, selvom dit ESP32-kort bliver slukket.

Åbn nu Arduino IDE, kompilér og brænd koden til ESP32-kortet.

#include
#include

RTC_DS3231 rtc ; // Initialiser en forekomst af RTC_DS3231-klassen

ugyldig Opsætning ( ) {
Seriel. begynde ( 115200 ) ;
Tråd. begynde ( ) ;

hvis ( ! rtc. begynde ( ) ) {
Seriel. println ( 'RTC ikke fundet' ) ;
mens ( 1 ) ; // Hæng på ubestemt tid, hvis RTC ikke findes
}

//Fjern kommentering af linjen nedenfor for at indstille startdato og -klokkeslæt
//rtc.adjust(DateTime(__DATE__, __TIME__));
}

ugyldig sløjfe ( ) {
// Aflæs aktuel tid fra sensoren (DS3231)
DatoTid nu = rtc. nu ( ) ;

// Udskriv dato og klokkeslæt på samme linje med to cifre for timer, minutter og sekunder
Seriel. Print ( 'Nuværende dato: ' ) ;
Seriel. Print ( nu. år ( ) , DEC ) ;
Seriel. Print ( '/' ) ;
printToDigits ( nu. måned ( ) ) ;
Seriel. Print ( '/' ) ;
printToDigits ( nu. dag ( ) ) ;
Seriel. Print ( ' Nuværende tid: ' ) ;
printToDigits ( nu. time ( ) ) ;
Seriel. Print ( ':' ) ;
printToDigits ( nu. minut ( ) ) ;
Seriel. Print ( ':' ) ;
printToDigits ( nu. anden ( ) ) ;
Seriel. println ( ) ;

forsinke ( 1000 ) ; // Opdater hvert 1. sekund
}

ugyldig printToDigits ( int nummer ) {
hvis ( nummer < 10 ) {
Seriel. Print ( '0' ) ; // Tilføj et indledende nul for enkeltcifrede tal
}
Seriel. Print ( nummer ) ;
}

4.1. Kodeforklaring

Koden starter med at initialisere den serielle I2C-kommunikation ved hjælp af et ledningsbibliotek. Derefter inkluderede vi RTC-biblioteket fra Adafruit til grænseflade med DS3231-modulet. Dette bibliotek har en funktion til at interagere med RTC DS3231-modulet.

I den Opsætning del, startes I2C-bussen og kontrolleres for de tilgængelige I2C-enheder. Hvis det ikke findes, hænger programmet på ubestemt tid. Baudraten er også defineret, så du kan kontrollere outputtet på Arduino IDE-serieskærmen.

Indstilling af uret for første gang

Når du programmerer DS3231, skal du fjern kommentarer til denne linje . Dette vil få dit system tid og gemme det i RTC-hukommelsen. Ved at gøre dette bliver RTC-modulets ur synkroniseret med dit systemur.

//rtc.adjust(DateTime(__DATE__, __TIME__));

Når tiden er indstillet, skal du uploade ovenstående kode igen, men denne gang skal du kommentere rtc.adjust() funktionslinjen . Ellers vil dette overskrive din tidligere indstillede tid, og når din ESP32 er slukket, starter RTC igen fra det tidspunkt, du uploadede koden.

Ved at gøre dette vil din tid forblive til stede i RTC-modulets baggrund, så længe RTC-modulet har strøm i sin CR2032-celle.

I den sløjfe del, læses den aktuelle dato og klokkeslæt fra DS3231-modulet ved hjælp af rtc.now()-funktionen. Dato- og tidskomponenterne udtrækkes, og den formaterede dato udskrives på Arduino IDE-serieskærmen hvert sekund.

5. Output

Efter at have uploadet koden til ESP32-kortet, vil du se, at tiden begynder at udskrive på Arduino IDE-serieskærmen.

6. Sådan viser du RTC DS3231-tiden på OLED-skærmen ved hjælp af ESP32

Du kan også gå et skridt videre og vise tiden på din OLED-skærm efter at have læst den fra DS3231. Til dette skal du installere Adafruit GFX SSD1306 bibliotek i Arduino IDE.

Når den er installeret, skal du forbinde ESP32 med OLED- og RTC-modulet i følgende konfiguration.

Efter tilslutning af din sensor, vil du se kredsløbet se ud som nedenstående skematiske diagram.

Upload nu følgende DS3231-kode til ESP32-kortet.

#include
#include
#include
#include 'RTClib.h'

RTC_DS3231 rtc ;

char dage [ 7 ] [ 12 ] = { 'Søndag' , 'Mandag' , 'Tirsdag' , 'Onsdag' , 'Torsdag' , 'Fredag' , 'Lørdag' } ;

Adafruit_SSD1306 skærm = Adafruit_SSD1306 ( 128 , 64 , & Tråd , - 1 ) ;

ugyldig Opsætning ( ) {
Seriel. begynde ( 115200 ) ;

Skærm. begynde ( SSD1306_SWITCHCAPVCC , 0x3C ) ;

hvis ( ! rtc. begynde ( ) ) {
Seriel. println ( 'Kunne ikke finde RTC! Tjek kredsløb.' ) ;
mens ( 1 ) ;
}
//fjern kommentering af linjen nedenfor, mens du indstiller tiden for første gang
//rtc.adjust(DateTime(__DATE__, __TIME__));
Skærm. klart Display ( ) ;
Skærm. sætTekstFarve ( HVID ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( 0 , tyve ) ;
Skærm. Print ( 'RTC UR' ) ;
Skærm. Skærm ( ) ;
forsinke ( 5000 ) ;
}

ugyldig sløjfe ( ) {
DatoTid nu = rtc. nu ( ) ;

Skærm. klart Display ( ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( 75 , 0 ) ;
Skærm. println ( nu. anden ( ) , DEC ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( 25 , 0 ) ;
Skærm. println ( ':' ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( 65 , 0 ) ;
Skærm. println ( ':' ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( 40 , 0 ) ;
Skærm. println ( nu. minut ( ) , DEC ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( 0 , 0 ) ;
Skærm. println ( nu. time ( ) , DEC ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( 0 , 25 ) ;
Skærm. println ( nu. dag ( ) , DEC ) ;
Skærm. Print ( dage [ nu. dag i ugen ( ) ] ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( tyve , 25 ) ;
Skærm. println ( '-' ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( 35 , 25 ) ;
Skærm. println ( nu. måned ( ) , DEC ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( 60 , 25 ) ;
Skærm. println ( '-' ) ;
Skærm. sætTekstStørrelse ( 2 ) ;
Skærm. sætMarkør ( 75 , 25 ) ;
Skærm. println ( nu. år ( ) , DEC ) ;
Skærm. Skærm ( ) ;
}

Kodeforklaring

Koden startede med nogle vigtige biblioteker, der kræves til RTC- og OLED-skærme. OLED-skærmen er sat op ved hjælp af Adafruit SSD1306-biblioteket.

I loop-delen fås den aktuelle dato og klokkeslæt ved hjælp af rtc.now(). Derefter ryddes OLED-skærmen, og tidskomponenterne vises i digitalt urformat. Du kan også ændre koden for at justere dato- og tidsformatet.

Når koden er uploadet til dit board, får du den aktuelle tid på OLED-skærmen.

Bemærk: Ovenstående kode bruger 0x3C I2C-adresse til OLED. Dette er den mest almindelige I2C-adresse, der er tilgængelig på SSD1306 OLED-skærme. Hvis du vil finde I2C-adressen til din OLED-skærm, kan du køre I2C Scanner kode .

Konklusion

DS3231 er en RTC-sensor, der kan bruges til tidtagning. Den har en batteribackup, der kan holde tiden nøjagtig, selvom dit mikrocontrollerkort er slukket. For at forbinde ESP2 med DS3231 skal du installere RTClib-biblioteket i din Arduino IDE. Derefter skal du tilslutte RTC-modulet over I2C-protokollen ved hjælp af den digitale pin på ESP32. Når du er tilsluttet, skal du blot uploade koden og justere tiden. Nu vil RTC-sensoren holde tiden, og du kan læse den på din serielle skærm på designtidsbaserede projekter.