ESP32 Real Time Clock (RTC) z uporabo DS1307 in OLED zaslona

Esp32 Real Time Clock Rtc Z Uporabo Ds1307 In Oled Zaslona



ESP32 je opremljen z vgrajenim modulom RTC, vendar ta deluje samo, ko je napajanje. Če pride do izpada električne energije, se ura ponastavi in ​​ne more ohranjati točnega časa. Torej, če želite spremljati čas ali nadzorovati katero koli napravo, ki temelji na času, preizkusite senzor RTC DS1307. Vendar morda razmišljate o priključitvi rezervne baterije na ploščo ESP32, vendar to ni najboljši scenarij, če imate pomanjkanje energije. Najboljša alternativa je uporaba senzorja DS1307, saj ima vgrajeno baterijo, ki zdrži najmanj eno leto.

Da bi stvari bile jasne, lahko notranja ura v realnem času (RTC) ESP32 spremlja čas, tudi ko je glavni procesor izklopljen ali v stanju globokega spanja. ESP32 RTC lahko uporabite za spremljanje časa, ne da bi porabili veliko energije ali vplivali na glavni procesor. Ampak še vedno potrebuje energijo za delovanje, ne tako veliko, vendar je potrebna minimalna količina energije za delovanje notranjega RTC.

S tem nam torej preostane le še rešitev uporabe zunanjega modula RTC. Oglejmo si korake povezovanja plošče ESP32 z modulom DS1307 RTC.







Vsebina:

1. Kaj je modul RTC DS1307

DS1307 je naprava z nizko porabo energije, ki lahko natančno spremlja čas in datum. Uporablja binarno kodirano decimalno obliko (BCD). Lahko vam pove čas v podrobni obliki, kot so sekunde, minute in celo ure in dnevi. Datum lahko natisnete tudi v polni obliki, kot sta mesec in leto. Ve tudi, kdaj je prestopno leto, do 2100. Za komunikacijo z DS1307 lahko uporabite protokol I2C.





DS1307 ima vgrajeno baterijo, ki ga lahko napaja približno eno leto brez zunanjega 5V vira. Z uporabo te rezervne baterije lahko ohrani čas, tudi ko je glavno napajanje izklopljeno. Ima tudi 56 bajtov SRAM za shranjevanje nekaterih podatkov. DS1307 je priročna naprava, ki ima veliko aplikacij v kombinaciji s ploščo Arduino ali ESP32. Ti podatki so lahko na primer v pomoč pri beleženju podatkov, alarmnih sistemih ali industrijskem nadzoru. Če potrebujete zanesljivo merjenje časa, je DS1307 odlična možnost.





Specifikacije modula RTC DS1307

Modul RTC DS1307 je sestavljen iz RTC IC, EEPROM-a, kristalnega oscilatorja in držala baterije za rezervno napajanje.



Spodaj so podrobnosti teh delov:

DS1307 RTC IC : DS1307 RTC IC je 8-pinski čip, ki spremlja čas in datum z uporabo protokola I2C. Porabi zelo malo energije, manj kot 500nA. Lahko prikaže čas v sekundah, minutah in urah ter datum v dnevih, mesecih in letih. Prav tako lahko preklaplja med 24-urnim in 12-urnim formatom.

24C32 EEPROM IC : 24C32 EEPROM IC je 32-bajtni Atmelov čip, ki shranjuje nastavitve, čas in datum. Uporablja tudi protokol I2C.

32,768kHz kristal : Kristalni oscilator 32,768 kHz zagotavlja frekvenco ure za IC DS1307 RTC.

Nosilec baterije : Držalo za baterijo drži baterijo CR2032. Je 3V litijeva gumbasta celica. Zagotavlja neprekinjeno napajanje DS1307 RTC IC.

Zagotovitev senzorja DS18B20 : Senzor DS18B20 vam omogoča spajkanje in uporabo temperaturnega senzorja DS18B20. Ni predhodno spajkan. Paket s skoznjo luknjo lahko spajkate in temperaturo dobite iz zatiča DS modula.

Na spodnjem seznamu je nekaj hitrih specifikacij senzorja RTC DS1307:

  • Delovna napetost: 4,5–5,5 V, običajno 5 V
  • Trenutna poraba : Manj kot 1,5 mA
  • Natančnost : 0–40 °C, odvisno od kristala
  • Baterija : CR2032 (3 V kovanec)
  • Spomin : 56 bajtov obstojnega RAM-a
  • Vmesnik : Dvožilni (I2C) serijski vmesnik
  • Izhod : 1 Hz izhodni pin
  • Programabilni pravokotni izhod : Porabi manj kot 500 nA v načinu delovanja z baterijo
  • Zaznavanje izpada električne energije : Samodejno zaznavanje izpada električne energije in preklopno vezje
  • Vezje za zaznavanje moči : Lahko samodejno preklopi na rezervno napajanje ob pomanjkanju električne energije
  • Nadomestilo za prestopno leto : Velja do leta 2100

Pinout modula RTC DS1307

Modul ima več pinov z različnimi funkcijami.

  • VCC je pin, ki potrebuje enosmerno napetost med 3,3 V in 5,5 V za napajanje modula.
  • GND je pin za nizko napetost ali ozemljitev.
  • SDA in SCL so nožice, ki sporočajo podatke in signale ure prek vodila I2C.
  • DS je pin, ki meri temperaturo s senzorjem DS1307, če ga imate na RTC modulu.
  • SQ je nožica, ki generira kvadratni signal s frekvenco 1 Hz, 4 kHz, 8 kHz ali 32 kHz, odvisno od tega, kako ga programirate.
  • ENA je zatič, ki uporablja 3V baterijo za ohranjanje točnega časa, ko je glavno napajanje izklopljeno.

2. Kako povezati RTC DS1307 in zaslon OLED z ESP32

Za povezavo ESP32 z DS1307 in zaslonom OLED lahko uporabite vgrajene nožice I2C na plošči ESP32. Tako DS1307 kot zaslon OLED sta napravi, ki temeljita na I2C. Nato lahko komunicira z glavnim podrejenim protokolom I2C prek vodila I2C.

Preden se premaknemo k povezovanju ESP32 z DS1307 in zaslonom OLED, morate najprej namestiti nekaj potrebnih knjižnic.

Namestitev zahtevanih knjižnic

Potrebovali boste dve knjižnici, eno za modul RTC in eno za zaslon OLED. Z uporabo OLED z modulom RTC lahko ustvarite osupljive in interaktivne predoglede ure. Če nimate načrta za prikaz časa na zaslonu, lahko to namestitev knjižnice preskočite.

Sledita dve knjižnici, ki ju boste potrebovali:

  • RTClib (avtor Adafruit) je knjižnica Arduino IDE za nastavitev in pridobivanje časa iz RTC. Ponuja tudi razrede za manipulacijo datumov, ur in trajanja. S to knjižnico lahko povežete in programirate module ure realnega časa (RTC), kot sta DS1307 in DS3231.
  • S SD1306 (avtor Adafruit) je knjižnica za Arduino, s katero lahko povežete in programirate zaslone OLED z Arduino ali katero koli drugo mikrokontrolersko ploščo.

Če želite prenesti in namestiti obe knjižnici v Arduino IDE, najprej odprite Vodja knjižnice poiščite knjižnico RTClib in kliknite Namestite :

Dobili boste možnost namestitve samo knjižnice ali njenih odvisnosti. Kliknite na Namesti vse gumb za popolno namestitev knjižnice. Tako ne boste prejeli nobene napake, če spremenite kodo, ki je odvisna od odvisnosti te knjižnice.

Podobno poiščite knjižnico SSD1306. Ta knjižnica je potrebna za zaslon OLED. Kliknite Namestite nadaljevati.

Tudi tokrat boste prejeli isto potrditveno sporočilo. Kliknite na Namesti vse možnost.

Zdaj sta obe knjižnici za OLED in DS1307 nameščeni in pripravljeni za uporabo. Pred tem pa najprej poiščite naslov I2C za zaslon OLED.

3. Iskanje naslova I2C zaslona OLED

Naslov I2C je edinstven identifikator za vsako napravo na vodilu I2C. Omogoča, da glavna naprava komunicira z določeno podrejeno napravo s pošiljanjem podatkov na njen naslov. Namen naslova I2C je preprečiti konflikte in zmedo med več napravami na istem vodilu.

Če želite pridobiti naslov naprave I2C, lahko uporabite a preprosta skica, ki skenira vodilo in natisne naslove naprav, ki jih najde. Lahko pa tudi preverite podatkovni list naprave, da vidite njen privzeti ali nastavljiv naslov.

V našem primeru se po zagonu kode optičnega bralnika I2C na terminalu Arduino IDE prikaže naslednji naslov I2C zaslona OLED.

Največkrat obstaja velika verjetnost, da boste tudi vi dobili enako 0x3C naslov za vaš zaslon OLED.

4. Povezovanje modula OLED in RTC DS1307 z ESP32

1. Povežite zatiča SDA in SCL modula DS1307 in modula Zaslon OLED na zatiče I2C ESP32. običajno, to sta GPIO 21 in GPIO 22 , po potrebi pa lahko v kodi dodelite tudi druge pine.

2. Priključite VCC in GND DS1307 in zaslon OLED na 3,3 V in GND nožice ESP32.

3. Vstavite gumbasto baterijo CR2032 v modul DS1307, da zagotovite rezervno napajanje za uro realnega časa.

4. Naložite primer kode iz te vadnice na svojo ploščo ESP32. Spremenite kodo za izhode po meri.

Po nalaganju se bo ura začela od nastavljenega časa in prikazala čas na zaslonu OLED.

5. Shema vezja

Shema vezja ESP32 z DS1307 je preprosta, s samo štirimi žicami, ki jih je treba povezati. Žici I2C SDA in SCL senzorjev OLED in DS1307 lahko skrajšate. Podobno je za napajanje obeh senzorjev mogoče uporabiti zatič 3V3 in GND na plošči ESP32. Po potrebi lahko napajate tudi iz ločenega vira.

Opomba : Varno je napajati RTC DS1307 s 3,3 V nožice ESP32, če trenutna omejitev ESP32 ni presežena. Če pa želite biti na varnem mestu, lahko uporabite ločen vir napajanja za modul RTC ali poskusite senzor DS3231 z nizko porabo energije, katerega delovno območje je med 3,3 in 5,5 VDC.

Spodnja slika prikazuje povezavo ESP32 s senzorjem RTC DS1307.

Podobno, če želite povezati zaslon OLED za prikaz časa, lahko uporabite iste zatiče I2C in napajalne zatiče na plošči ESP32.

6. Koda

S pomočjo spodnje kode bomo na RTC nastavili trenutni datum in uro. Po nastavitvi časa bo koda prikazala čas na terminalu Arduino IDE. Preden naložite kodo, jo morate posodobiti s trenutnim datumom in uro.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char dnevi_tedna [ 7 ] [ 12 ] = { 'nedelja' , 'ponedeljek' , 'torek' , 'sreda' , 'četrtek' , 'petek' , 'sobota' } ;
nastavitev praznine ( ) {
Serial.begin ( 115200 ) ;
#ifndef ESP8266
medtem ( ! Serijski ) ;
#endif
če ( ! DS1307_RTC.začetek ( ) ) {
Serial.println ( 'Ni bilo mogoče najti RTC' ) ;
medtem ( 1 ) ;
}
DS1307_RTC.adjust ( Datum čas ( F ( __DATUM__ ) , F ( __TIME__ ) ) ) ;
}
prazna zanka ( ) {
DateTime zdaj = DS1307_RTC.now ( ) ;
Serijski.natis ( zdaj.leto ( ) , DEC ) ;
Serijski.natis ( '/' ) ;
Serijski.natis ( zdaj.mesec ( ) , DEC ) ;
Serijski.natis ( '/' ) ;
Serijski.natis ( zdaj.dan ( ) , DEC ) ;
Serijski.natis ( '(' ) ;
Serijski.natis ( Week_days [ now.dayOfTheWeek ( ) ] ) ;
Serijski.natis ( ')' ) ;
Serijski.natis ( zdaj.ura ( ) , DEC ) ;
Serijski.natis ( ':' ) ;
Serijski.natis ( zdaj.minut ( ) , DEC ) ;
Serijski.natis ( ':' ) ;
Serijski.natis ( zdaj.drugi ( ) , DEC ) ;
Serial.println ( ) ;
zamuda ( 1000 ) ;
}

Ta koda uporablja Knjižnica RTClib za povezavo z modulom ure v realnem času DS1307, ki spremlja datum in uro.

The nastaviti funkcija se je začela z inicializacijo hitrosti prenosa. Nato smo v tem razdelku definirali funkcijo za sinhronizacijo datuma in časa računalnika s senzorjem DS1307. To bo naložilo čas kompilacije kode v senzor RTC.

Lahko uporabite zanka funkcijo za pridobivanje datuma in časa iz RTC. Nato ga lahko prikažete na serijskem monitorju takole: leto/mesec/dan (dan v tednu) ura:minuta:sekunda. Ne pozabite dodati enosekundne zakasnitve po vsaki zanki, da se koda ne izvaja prehitro.

Prikaz trenutnega časa na OLED zaslonu

Za prikaz istega časa na zaslonu OLED moramo dodati dodaten del kode za zaslon OLED. Preprosto naložite podano kodo. Ta koda bo prikazala trenutni čas na vašem OLED zaslonu.

Ne pozabite, da tukaj uporabljamo 0,96-palčni 128×64 I2C SSD OLED zaslonski modul. Če uporabljate katero koli drugo velikost, ustrezno spremenite kodo. Preverite tudi naslov I2C in ga spremenite v podani kodi. V našem primeru imamo naslov I2C 0x3C za zaslon OLED.

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

Zaslon Adafruit_SSD1306 ( SCREEN_WIDTH, SCREEN_HEIGHT, & Žica, - 1 ) ;
RTC_DS1307 RTC;
char dni [ 7 ] [ 12 ] = { 'nedelja' , 'ponedeljek' , 'torek' , 'sreda' , 'četrtek' , 'petek' , 'sobota' } ;
nastavitev praznine ( ) {
Serial.begin ( 115200 ) ;
če ( ! RTC.begin ( ) ) {
Serial.println ( 'Ni bilo mogoče najti RTC' ) ;
medtem ( 1 ) ;
}
RTC.prilagodi ( Datum čas ( F ( __DATUM__ ) , F ( __TIME__ ) ) ) ;
če ( ! display.begin ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'Dodelitev SSD1306 ni uspela' ) ) ;
za ( ;; ) ;
}
zamuda ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( BELA ) ;
display.setCursor ( 30 , dvajset ) ;
display.println ( 'Linux' ) ;
prikaz.zaslon ( ) ;
zamuda ( 3000 ) ;
display.clearDisplay ( ) ;
}
prazna zanka ( ) {
DateTime zdaj = RTC.now ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
prikaz.natis ( zdaj.dan ( ) ) ;
prikaz.natis ( '/' ) ;
prikaz.natis ( zdaj.mesec ( ) ) ;
prikaz.natis ( '/' ) ;
prikaz.natis ( zdaj.leto ( ) ) ;
display.println ( dnevi [ now.dayOfTheWeek ( ) ] ) ;
display.println ( ' ' ) ;
display.setCursor ( 0 , 40 ) ;
če ( zdaj.ura ( ) < 10 )
prikaz.natis ( '0' ) ;
prikaz.natis ( zdaj.ura ( ) ) ;
prikaz.natis ( ':' ) ;
če ( zdaj.minut ( ) < 10 )
prikaz.natis ( '0' ) ;
prikaz.natis ( zdaj.minut ( ) ) ;
prikaz.natis ( ':' ) ;
če ( zdaj.drugi ( ) < 10 )
prikaz.natis ( '0' ) ;
display.println ( zdaj.drugi ( ) ) ;
prikaz.zaslon ( ) ;
}

Koda se je začela s knjižnicami, ki smo jih namestili za RTC in zaslon. Nato določi velikost zaslona in prikazni naslov. Inicializira matriko z imeni dni v tednu.

The nastaviti del se začne s serijsko komunikacijo. Preveri, ali RTC in zaslon delujeta ali ne. Po tem smo definirali besedilo niza »Linuxhint«, ki bo prikazano 3 sekunde. To je samo uvodno ali zagonsko sporočilo, to sporočilo lahko spremenite tudi z besedilom po meri.

The zanka funkcija pridobi datum in čas modula DS1307. Po tem počisti zaslon in formatirano natisne datum in čas. Koda doda tudi uvodne ničle uram, minutam in sekundam, če so njihove vrednosti manjše od 10.

7. Strojna oprema

Po nalaganju kode na ploščo ESP32 boste na zaslonu OLED videli naslednji izpis. Za strojno opremo smo uporabili zaslon OLED in modul I2C RTC DS1307. Uporabljena je plošča ESP32 s 30 pini. Eksperimentirate lahko tudi s katero koli drugo ploščo ESP32, vendar pazite, da pravilno povežete nožice I2C.

Zaključek

RTC DS1307 ima 56-bajtni SRAM s podporo za rezervno baterijo. Gre za 8-pinsko napravo, ki uporablja komunikacijski protokol I2C. Za povezovanje modula DS1307 RTC z ESP32 lahko uporabite zatiče I2C (GPIO 22 (SCL) in GPIO 21 (SDA)) plošče ESP32. Čas lahko natisnete na konzoli Arduino IDE ali uporabite kateri koli zaslon, kot sta OLED ali I2C LCD za prikaz časa. Modul DS1307 RTC je uporabna naprava za spremljanje časa in datuma v različnih aplikacijah. Nekatere glavne aplikacije vključujejo zapisovalnike podatkov, digitalne ure in pametne ure.