ESP32 Real Time Clock (RTC) Bruger DS1307 og OLED-skærm

Esp32 Real Time Clock Rtc Bruger Ds1307 Og Oled Skaerm



ESP32 kommer med et indbygget RTC-modul, men det virker kun, når der er strøm. Hvis der er strømtab, vil uret blive nulstillet og ude af stand til at holde den korrekte tid. Så hvis du vil holde styr på tiden eller kontrollere enhver tidsbaseret enhed, så prøv DS1307 RTC-sensoren. Du tænker dog måske på at tilslutte et backup-batteri til dit ESP32-kort, men det er ikke det bedste scenario at gøre, hvis du har en strømmangel. Det bedste alternativ er at bruge DS1307-sensoren, da den kommer med et indbygget batteri, der kan holde minimum et år.

For at få tingene klart, kan ESP32's interne realtidsur (RTC) holde styr på tiden, selv når hovedprocessoren er slukket eller i dyb søvn. Du kan bruge ESP32 RTC til at holde styr på tiden uden at bruge meget strøm eller påvirke hovedprocessoren. Men det kræver stadig strøm for at køre, ikke så meget, men der kræves et minimum af strøm for at intern RTC kan køre.

Så med dette står vi kun tilbage med løsningen med at bruge det eksterne RTC-modul. Lad os se trinene til at forbinde ESP32-kortet med DS1307 RTC-modulet.







Indhold:

1. Hvad er RTC DS1307-modulet

DS1307 er en energibesparende enhed, der kan holde styr på tid og dato nøjagtigt. Den bruger binært kodet decimal (BCD) format. Det kan fortælle dig tid i et detaljeret format som sekunder, minutter og endda timer og dage. Du kan også udskrive datoen i fuldt format som måned og år. Den ved også hvornår det er et skudår, op til 2100. For at kommunikere med DS1307 kan du bruge I2C-protokollen.





DS1307 har et indbygget batteri, der kan drive den i cirka et år uden en ekstern 5V-kilde. Ved at bruge denne batteribackup kan den beholde tiden, selv når hovedstrømmen er slukket. Den har også 56 bytes SRAM til at gemme nogle data. DS1307 er en praktisk enhed, der har mange applikationer, når den kombineres med et Arduino- eller ESP32-kort. For eksempel kan disse data være nyttige i datalogning, alarmsystemer eller industriel kontrol. Hvis du har brug for pålidelig tidtagning, er DS1307 en god mulighed.





RTC DS1307 modul specifikationer

RTC DS1307-modulet består af RTC IC, en EEPROM, en krystaloscillator og en batteriholder til backup.



Nedenfor er detaljerne i disse dele:

DS1307 RTC IC : DS1307 RTC IC er en 8-bens chip, der holder styr på tid og dato ved hjælp af I2C-protokollen. Den bruger meget lidt strøm, mindre end 500nA. Den kan vise tid i sekunder, minutter og timer og dato i dage, måneder og år. Den kan også skifte mellem 24-timers og 12-timers formater.

24C32 EEPROM IC : 24C32 EEPROM IC er en 32-byte chip fra Atmel, der gemmer indstillingerne, tid og dato. Den bruger også I2C-protokollen.

32,768 kHz krystal : 32,768 kHz krystaloscillatoren leverer klokfrekvensen til DS1307 RTC IC.

Batteriholder : Batteriholderen holder et CR2032-batteri. Det er en 3V lithium møntcelle. Det giver kontinuerlig strøm til DS1307 RTC IC.

DS18B20 sensorforsyning : DS18B20-sensoren giver dig mulighed for at lodde og bruge DS18B20-temperatursensoren. Den er ikke forloddet. Du kan lodde den gennemgående pakke og få temperaturen fra modulets DS-stift.

Nedenstående liste giver nogle hurtige specifikationer for DS1307 RTC-sensoren:

  • Driftsspænding: 4,5-5,5 V, typisk 5 V
  • Nuværende forbrug : Mindre end 1,5 mA
  • Nøjagtighed : 0–40 °C, afhænger af krystallen
  • Batteri : CR2032 (3 V mønt)
  • Hukommelse : 56 bytes ikke-flygtig RAM
  • Interface : To-leder (I2C) seriel interface
  • Produktion : 1 Hz udgangsben
  • Programmerbar firkantbølgeudgang : Forbruger mindre end 500 nA i batteribackup-tilstand
  • Detektering af strømsvigt : Automatisk detektering af strømsvigt og omskifterkredsløb
  • Power-sense kredsløb : Den kan automatisk skifte til backup af forsyning ved strømmangel
  • Skudårskompensation : Gælder frem til år 2100

RTC DS1307 Modul Pinout

Modulet har flere ben med forskellige funktioner.

  • VCC er stiften, der har brug for en jævnspænding mellem 3,3V og 5,5V for at drive modulet.
  • GND er stiften til lavspænding eller jord.
  • SDA og SCL er stifterne, der kommunikerer data og clock-signaler gennem I2C-bussen.
  • DS er stiften, der måler temperaturen med DS1307-sensoren, hvis du har en på RTC-modulet.
  • SQ er stiften, der genererer et firkantbølgesignal med en frekvens på 1 Hz, 4 kHz, 8 kHz eller 32 kHz, afhængigt af hvordan du programmerer det.
  • EN er stiften, der bruger et 3V batteri til at holde tiden nøjagtig, når hovedstrømmen er slukket.

2. Sådan interfaces RTC DS1307 og OLED-skærm med ESP32

For at forbinde ESP32 med DS1307 og OLED Display kan du bruge de indbyggede I2C-ben på ESP32-kortet. Både DS1307 og OLED-skærmen er I2C-baserede enheder. Derefter kan kommunikere ved hjælp af I2C master slave protokol over I2C bussen.

Før vi bevæger os mod grænsefladen mellem ESP32 med DS1307 og OLED-skærm, skal du først installere nogle nødvendige biblioteker.

Installation af de nødvendige biblioteker

Du skal bruge to biblioteker, et til RTC-modulet og et til OLED-skærmen. Ved at bruge OLED med et RTC-modul kan du skabe fantastiske og interaktive urforhåndsvisninger. Hvis du ikke har nogen plan om at vise tiden på skærmen, kan du springe denne biblioteksinstallation over.

Følgende er de to biblioteker, du får brug for:

  • RTClib (af Adafruit) er et Arduino IDE-bibliotek til at indstille og få tid fra en RTC. Det giver også klasser til at manipulere datoer, tidspunkter og varigheder. Ved at bruge dette bibliotek kan du interface og programmere real-time clock (RTC) modulerne, såsom DS1307 og DS3231.
  • S SD1306 (af Adafruit) er et bibliotek til Arduino, hvor du kan bruge interface og programmere OLED-skærmene med Arduino eller et hvilket som helst andet mikrocontrollerkort.

For at downloade og installere begge disse biblioteker i Arduino IDE skal du først åbne Biblioteksleder søg efter RTClib-biblioteket, og klik Installere :

Du får mulighed for kun at installere biblioteket eller dets afhængigheder. Klik på Installer alle knappen for at installere biblioteket fuldstændigt. På denne måde vil du ikke få nogen fejl, hvis du ændrer koden, som afhænger af dette biblioteks afhængigheder.

Søg på samme måde efter SSD1306-biblioteket. Dette bibliotek er nødvendigt for en OLED-skærm. Klik Installere at fortsætte.

Denne gang får du også den samme bekræftelsesmeddelelse. Klik på Installer alle mulighed.

Nu er både bibliotekerne til OLED og DS1307 installeret og klar til brug. Men før det skal du først finde ud af I2C-adressen til OLED-skærmen.

3. Find I2C-adressen på OLED-skærmen

I2C-adressen er en unik identifikator for hver enhed på I2C-bussen. Det giver masterenheden mulighed for at kommunikere med en specifik slaveenhed ved at sende data til dens adresse. Formålet med I2C-adressen er at undgå konflikter og forvirring mellem flere enheder på samme bus.

For at få adressen på en I2C-enhed kan du bruge en simpel skitse, der scanner bussen og udskriver adresserne af de enheder, den finder. Alternativt kan du tjekke enhedens dataark for at se dens standardadresse eller konfigurerbare adresse.

Her i vores tilfælde, efter at have kørt I2C-scannerkoden, vises følgende I2C-adresse på OLED-skærmen på Arduino IDE-terminalen.

Oftest er der stor chance for, at du også får det samme 0x3C adresse til din OLED-skærm.

4. Grænseflade mellem OLED- og RTC DS1307-modulet med ESP32

1. Tilslut SDA- og SCL-benene på både DS1307-modulet og OLED-skærm til I2C-benene af ESP32. Som regel, disse er GPIO 21 og GPIO 22 , men du kan også tildele andre pins i koden, hvis det er nødvendigt.

2. Tilslut både VCC og GND på DS1307 og OLED-skærmen til 3,3V- og GND-benene på ESP32.

3. Indsæt et CR2032 møntcellebatteri i DS1307-modulet for at levere backup-strøm til realtidsuret.

4. Upload eksempelkoden fra denne tutorial til dit ESP32-kort. Rediger koden for brugerdefinerede output.

Efter upload starter et ur fra den indstillede tid og viser tiden på OLED-skærmen.

5. Kredsløbsdiagram

Kredsløbsdiagrammet for ESP32 med DS1307 er enkelt, med kun fire ledninger, der skal tilsluttes. Du kan forkorte I2C-ledningerne SDA og SCL på både OLED- og DS1307-sensorerne. Tilsvarende kan 3V3- og GND-stiften på ESP32-kortet bruges til at tænde for begge disse sensorer. Du kan også strømforsyne fra en separat kilde, hvis det er nødvendigt.

Bemærk : Det er sikkert at strømforsyne RTC DS1307 fra en 3,3V-pin på ESP32, hvis strømgrænsen for ESP32 ikke overskrides. Men hvis du vil være på et sikkert sted, kan du enten bruge en separat strømkilde til RTC-modulet eller prøve DS3231-sensoren med lav effekt, hvis driftsområde er mellem 3,3 og 5,5 VDC.

Billedet nedenfor illustrerer forbindelsen mellem ESP32 og RTC DS1307-sensoren.

På samme måde, hvis du vil tilslutte OLED-skærmen for at vise klokkeslættet, kan du bruge de samme I2C-ben og strømbenene på ESP32-kortet.

6. Kode

Ved at bruge koden nedenfor, indstiller vi den aktuelle dato og tid på RTC. Efter indstilling af tiden, vil koden vise tiden på Arduino IDE-terminalen. Før du uploader koden, skal du opdatere den med din aktuelle dato og klokkeslæt.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Week_days [ 7 ] [ 12 ] = { 'Søndag' , 'Mandag' , 'Tirsdag' , 'Onsdag' , 'Torsdag' , 'Fredag' , 'Lørdag' } ;
ugyldig opsætning ( ) {
Serial.begin ( 115200 ) ;
#ifndef ESP8266
mens ( ! Seriel ) ;
#Afslut Hvis
hvis ( ! DS1307_RTC.begin ( ) ) {
Serial.println ( 'Kunne ikke finde RTC' ) ;
mens ( 1 ) ;
}
DS1307_RTC.adjust ( Dato tid ( F ( __DATO__ ) , F ( __TID__ ) ) ) ;
}
ugyldig løkke ( ) {
DatoTid nu = DS1307_RTC.now ( ) ;
Seriel.print ( nu.år ( ) , DEC ) ;
Seriel.print ( '/' ) ;
Seriel.print ( nu.måned ( ) , DEC ) ;
Seriel.print ( '/' ) ;
Seriel.print ( nu.dag ( ) , DEC ) ;
Seriel.print ( '(' ) ;
Seriel.print ( Uge_dage [ now.dayOfTheWeek ( ) ] ) ;
Seriel.print ( ') ' ) ;
Seriel.print ( nu.time ( ) , DEC ) ;
Seriel.print ( ':' ) ;
Seriel.print ( nu.minut ( ) , DEC ) ;
Seriel.print ( ':' ) ;
Seriel.print ( nu.sekund ( ) , DEC ) ;
Serial.println ( ) ;
forsinke ( 1000 ) ;
}

Denne kode bruger RTClib bibliotek til interface med et DS1307 realtidsur-modul, der holder styr på dato og klokkeslæt.

Det Opsætning funktion startede med initialisering af baudraten. Derefter definerede vi i dette afsnit funktionen til at synkronisere dato og klokkeslæt for computeren med DS1307-sensoren. Dette vil uploade tidspunktet for kodekompilering til RTC-sensoren.

Du kan bruge sløjfe funktion for at få dato og klokkeslæt fra RTC. Derefter kan du vise det på den serielle skærm sådan her: år/måned/dag (ugedag) time:minut:sekund. Husk at tilføje et sekunds forsinkelse efter hver løkke, så koden ikke kører for hurtigt.

Vis aktuel tid på OLED-skærm

For at vise den samme tid på OLED-skærmen, skal vi tilføje en ekstra kodedel til OLED-skærmen. Du skal blot uploade den givne kode. Denne kode viser den aktuelle tid på din OLED-skærm.

Husk, her bruger vi 0,96-tommer 128×64 I2C SSD OLED-skærmmodul. Hvis du bruger en anden størrelse, skal du ændre koden i overensstemmelse hermed. Tjek også I2C-adressen og modificer den i den givne kode. I vores tilfælde har vi en I2C-adresse 0x3C til OLED-skærmen.

#include
#include
#include
#include 'RTClib.h'
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 skærm ( SCREEN_WIDTH, SCREEN_HEIGHT, & Tråd, - 1 ) ;
RTC_DS1307 RTC;
char dage [ 7 ] [ 12 ] = { 'Søndag' , 'Mandag' , 'Tirsdag' , 'Onsdag' , 'Torsdag' , 'Fredag' , 'Lørdag' } ;
ugyldig opsætning ( ) {
Serial.begin ( 115200 ) ;
hvis ( ! RTC.begynd ( ) ) {
Serial.println ( 'Kunne ikke finde RTC' ) ;
mens ( 1 ) ;
}
RTC.juster ( Dato tid ( F ( __DATO__ ) , F ( __TID__ ) ) ) ;
hvis ( ! display.begynd ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'SSD1306-allokering mislykkedes' ) ) ;
til ( ;; ) ;
}
forsinke ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( HVID ) ;
display.setCursor ( 30 , tyve ) ;
display.println ( 'Linux' ) ;
display.display ( ) ;
forsinke ( 3000 ) ;
display.clearDisplay ( ) ;
}
ugyldig løkke ( ) {
DatoTid nu = RTC.nu ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
display.print ( nu.dag ( ) ) ;
display.print ( '/' ) ;
display.print ( nu.måned ( ) ) ;
display.print ( '/' ) ;
display.print ( nu.år ( ) ) ;
display.println ( dage [ now.dayOfTheWeek ( ) ] ) ;
display.println ( ' ' ) ;
display.setCursor ( 0 , 40 ) ;
hvis ( nu.time ( ) < 10 )
display.print ( '0' ) ;
display.print ( nu.time ( ) ) ;
display.print ( ':' ) ;
hvis ( nu.minut ( ) < 10 )
display.print ( '0' ) ;
display.print ( nu.minut ( ) ) ;
display.print ( ':' ) ;
hvis ( nu.sekund ( ) < 10 )
display.print ( '0' ) ;
display.println ( nu.sekund ( ) ) ;
display.display ( ) ;
}

Koden startede med de biblioteker, vi installerede til RTC'en og skærmen. Derefter definerer den skærmstørrelsen og visningsadressen. Det initialiserer arrayet med ugedagsnavne.

Det Opsætning del starter med seriel kommunikation. Den kontrollerer, om RTC'en og skærmen fungerer eller ej. Derefter har vi defineret en strengtekst 'Linuxhint', der vises i 3 sekunder. Dette er kun en åbnings- eller opstartsmeddelelse, du kan også ændre denne besked med din tilpassede tekst.

Det sløjfe funktionen henter DS1307-modulets dato og klokkeslæt. Derefter rydder den displayet og udskriver dato og klokkeslæt på en formateret måde. Koden tilføjer også indledende nuller til timer, minutter og sekunder, hvis deres værdier er mindre end 10.

7. Hardware

Efter at have uploadet koden til ESP32-kortet, vil du se følgende output på OLED-skærmen. Til hardware har vi brugt OLED-skærmen og et I2C RTC DS1307-modul. Der anvendes ESP32-kort med 30 ben. Du kan også eksperimentere med et hvilket som helst andet ESP32-kort, men sørg for at tilslutte I2C-benene korrekt.

Konklusion

RTC DS1307 har en 56-byte SRAM med batteribackup-understøttelse. Det er en 8-benet enhed, der bruger en I2C kommunikationsprotokol. For at forbinde DS1307 RTC-modulet med ESP32 kan du bruge I2C-benene (GPIO 22 (SCL) og GPIO 21 (SDA)) på ESP32-kortet. Du kan udskrive tiden på en Arduino IDE-konsol eller bruge en hvilken som helst skærm som OLED eller I2C LCD til at vise tiden. DS1307 RTC-modulet er en nyttig enhed til at holde styr på tid og dato i forskellige applikationer. Nogle hovedapplikationer omfatter dataloggere, digitale ure og smartwatches.