ESP32 reāllaika pulkstenis (RTC), izmantojot DS1307 un OLED displeju

Esp32 Reallaika Pulkstenis Rtc Izmantojot Ds1307 Un Oled Displeju



ESP32 ir aprīkots ar iebūvētu RTC moduli, taču tas darbojas tikai tad, ja ir jauda. Ja pazūd strāva, pulkstenis tiks atiestatīts un nevarēs saglabāt pareizo laiku. Tātad, ja vēlaties sekot līdzi laikam vai vadīt jebkuru uz laiku balstītu ierīci, izmēģiniet DS1307 RTC sensoru. Tomēr jūs varētu apsvērt iespēju pievienot rezerves akumulatoru ESP32 platei, taču tas nav labākais scenārijs, ko darīt, ja rodas strāvas trūkums. Labākā alternatīva ir izmantot sensoru DS1307, jo tam ir iebūvēts akumulators, kas var darboties vismaz gadu.

Lai viss būtu skaidrs, ESP32 iekšējais reāllaika pulkstenis (RTC) var sekot līdzi laikam pat tad, ja galvenais procesors ir izslēgts vai atrodas dziļā miega režīmā. Varat izmantot ESP32 RTC, lai sekotu līdzi laikam, neizmantojot daudz enerģijas un neietekmējot galveno procesoru. Bet tai joprojām ir nepieciešama jauda, ​​lai darbotos iekšējais RTC, nevis tik daudz, bet minimālais jaudas daudzums.

Tādējādi mums atliek tikai ārējā RTC moduļa izmantošanas risinājums. Apskatīsim ESP32 plates savienošanas darbības ar DS1307 RTC moduli.







Saturs:

1. Kas ir RTC DS1307 modulis?

DS1307 ir mazjaudas ierīce, kas var precīzi sekot līdzi laikam un datumam. Tas izmanto bināri kodētu decimālo (BCD) formātu. Tas var norādīt laiku detalizētā formātā, piemēram, sekundēs, minūtēs un pat stundās un dienās. Varat arī izdrukāt datumu pilnā formātā, piemēram, mēnesi un gadu. Tas arī zina, kad ir garais gads, līdz 2100. Lai sazinātos ar DS1307, varat izmantot I2C protokolu.





DS1307 ir iebūvēts akumulators, kas to var darbināt apmēram gadu bez ārēja 5 V avota. Izmantojot šo akumulatora dublējumu, tas var saglabāt laiku pat tad, ja galvenā barošana ir izslēgta. Tam ir arī 56 baiti SRAM, lai saglabātu dažus datus. DS1307 ir ērta ierīce, kurai ir daudz lietojumu, ja to apvieno ar Arduino vai ESP32 plati. Piemēram, šie dati var būt noderīgi datu reģistrēšanā, trauksmes sistēmās vai rūpnieciskajā kontrolē. Ja jums nepieciešama uzticama laika uzskaite, DS1307 ir lieliska iespēja.





RTC DS1307 moduļa specifikācijas

RTC DS1307 modulis sastāv no RTC IC, EEPROM, kristāla oscilatora un akumulatora turētāja dublēšanai.



Tālāk ir sniegta sīkāka informācija par šīm daļām:

DS1307 RTC IC : DS1307 RTC IC ir 8 kontaktu mikroshēma, kas seko līdzi laikam un datumam, izmantojot I2C protokolu. Tas patērē ļoti maz enerģijas, mazāk nekā 500 nA. Tas var parādīt laiku sekundēs, minūtēs un stundās un datumu dienās, mēnešos un gados. Tas var arī pārslēgties starp 24 stundu un 12 stundu formātiem.

24C32 EEPROM IC : 24C32 EEPROM IC ir 32 baitu mikroshēma no Atmel, kurā tiek saglabāti iestatījumi, laiks un datums. Tas izmanto arī I2C protokolu.

32,768 kHz kristāls : 32,768 kHz kristāla oscilators nodrošina DS1307 RTC IC takts frekvenci.

Akumulatora turētājs : Baterijas turētājā ir ievietota CR2032 baterija. Tā ir 3 V litija monētu šūna. Tas nodrošina nepārtrauktu barošanu DS1307 RTC IC.

DS18B20 sensora nodrošināšana : DS18B20 sensora nodrošinājums ļauj lodēt un izmantot DS18B20 temperatūras sensoru. Tas nav iepriekš pielodēts. Jūs varat pielodēt cauruma paketi un iegūt temperatūru no moduļa DS tapas.

Tālāk esošajā sarakstā ir sniegtas dažas ātras DS1307 RTC sensora specifikācijas:

  • Darba spriegums: 4,5–5,5 V, parasti 5 V
  • Pašreizējais patēriņš : mazāk nekā 1,5 mA
  • Precizitāte : 0–40 °C, atkarīgs no kristāla
  • Akumulators : CR2032 (3 V monēta)
  • Atmiņa : 56 baiti nepastāvīgas RAM
  • Interfeiss : Divu vadu (I2C) seriālais interfeiss
  • Izvade : 1 Hz izejas tapa
  • Programmējama kvadrātviļņu izeja : Akumulatora rezerves režīmā patērē mazāk par 500 nA
  • Strāvas padeves pārtraukuma noteikšana : automātiska strāvas padeves pārtraukuma noteikšana un slēdža shēma
  • Jaudas sensora ķēde : Tas var automātiski pārslēgties uz rezerves barošanu, ja trūkst strāvas
  • Garā gada kompensācija : Derīgs līdz 2100. gadam

RTC DS1307 moduļa spraudnis

Modulim ir vairākas tapas ar dažādām funkcijām.

  • VCC ir tapa, kurai nepieciešams līdzstrāvas spriegums no 3,3 V līdz 5,5 V, lai darbinātu moduli.
  • GND ir zemsprieguma vai zemējuma tapa.
  • SDA un SCL ir tapas, kas pārraida datus un pulksteņa signālus caur I2C kopni.
  • DS ir tapa, kas mēra temperatūru ar DS1307 sensoru, ja jums tāds ir RTC modulī.
  • SQ ir tapa, kas ģenerē kvadrātviļņu signālu ar frekvenci 1 Hz, 4 kHz, 8 kHz vai 32 kHz atkarībā no tā, kā jūs to programmējat.
  • VIENS ir tapa, kas izmanto 3 V akumulatoru, lai saglabātu precīzu laiku, kad galvenā strāva ir izslēgta.

2. Kā savienot RTC DS1307 un OLED displeju ar ESP32

Lai savienotu ESP32 ar DS1307 un OLED displeju, varat izmantot ESP32 plates iebūvētās I2C tapas. Gan DS1307, gan OLED displejs ir ierīces, kuru pamatā ir I2C. Pēc tam var sazināties, izmantojot I2C galveno vergu protokolu, izmantojot I2C kopni.

Pirms mēs virzāmies uz ESP32 saskarni ar DS1307 un OLED displeju, vispirms ir jāinstalē dažas nepieciešamās bibliotēkas.

Nepieciešamo bibliotēku instalēšana

Jums būs nepieciešamas divas bibliotēkas, viena RTC modulim un viena OLED displejam. Izmantojot OLED ar RTC moduli, varat izveidot pārsteidzošus un interaktīvus pulksteņu priekšskatījumus. Ja neplānojat parādīt laiku ekrānā, varat izlaist šo bibliotēkas instalēšanu.

Tālāk ir norādītas divas bibliotēkas, kas jums būs nepieciešamas:

  • RTClib (autors Adafruit) ir Arduino IDE bibliotēka, lai iestatītu un iegūtu laiku no RTC. Tas nodrošina arī nodarbības datumu, laiku un ilguma manipulēšanai. Izmantojot šo bibliotēku, varat saskarties un programmēt reāllaika pulksteņa (RTC) moduļus, piemēram, DS1307 un DS3231.
  • S SD1306 (autors Adafruit) ir Arduino bibliotēka, kurā varat saskarties un programmēt OLED displejus ar Arduino vai jebkuru citu mikrokontrollera plati.

Lai lejupielādētu un instalētu abas šīs bibliotēkas Arduino IDE, vispirms atveriet Bibliotēkas vadītājs atrodiet RTClib bibliotēku un noklikšķiniet uz Uzstādīt :

Jūs iegūsit iespēju instalēt tikai bibliotēku vai tās atkarības. Noklikšķiniet uz Instalējiet visu pogu, lai pilnībā instalētu bibliotēku. Tādā veidā jūs nesaņemsit nekādas kļūdas, ja modificēsit kodu, kas ir atkarīgs no šīs bibliotēkas atkarībām.

Līdzīgi meklējiet SSD1306 bibliotēku. Šī bibliotēka ir nepieciešama OLED displejam. Klikšķis Uzstādīt lai turpinātu.

Šoreiz arī saņemsit tādu pašu apstiprinājuma ziņojumu. Noklikšķiniet uz Instalējiet visu opciju.

Tagad gan OLED, gan DS1307 bibliotēkas ir instalētas un gatavas lietošanai. Bet pirms tam vispirms noskaidrojiet OLED displeja I2C adresi.

3. OLED displeja I2C adreses atrašana

I2C adrese ir unikāls identifikators katrai ierīcei I2C kopnē. Tas ļauj galvenajai ierīcei sazināties ar noteiktu palīgierīci, nosūtot datus uz tās adresi. I2C adreses mērķis ir izvairīties no konfliktiem un neskaidrībām starp vairākām ierīcēm vienā kopnē.

Lai iegūtu I2C ierīces adresi, varat izmantot a vienkārša skice, kas skenē autobusu un izdrukā adreses no atrastajām ierīcēm. Varat arī pārbaudīt ierīces datu lapu, lai redzētu tās noklusējuma vai konfigurējamo adresi.

Mūsu gadījumā pēc I2C skenera koda palaišanas Arduino IDE terminālī tiek parādīta šāda OLED ekrāna I2C adrese.

Lielāko daļu laika pastāv liela iespēja, ka arī jūs saņemsit to pašu 0x3C adrese jūsu OLED ekrānam.

4. OLED un RTC DS1307 moduļa savienošana ar ESP32

1. Savienojiet gan moduļa DS1307, gan SDA un SCL tapas OLED displejs pie I2C tapām no ESP32. Parasti, tie ir GPIO 21 un GPIO 22 , bet, ja nepieciešams, kodā varat piešķirt arī citus tapas.

2. Savienojiet gan DS1307 VCC un GND, gan OLED displeju ar ESP32 3,3 V un GND tapām.

3. Ievietojiet CR2032 monētu bateriju modulī DS1307, lai nodrošinātu reāllaika pulksteņa rezerves strāvu.

4. Augšupielādējiet šīs apmācības parauga kodu savā ESP32 platē. Mainiet pielāgoto izvadu kodu.

Pēc augšupielādes pulkstenis sāks darboties no iestatītā laika un rādīs laiku OLED ekrānā.

5. Shēmas shēma

ESP32 shēma ar DS1307 ir vienkārša, un tajā ir tikai četri vadi, kas jāpievieno. Varat saīsināt gan OLED, gan DS1307 sensoru I2C vadus SDA un SCL. Tāpat, lai ieslēgtu abus šos sensorus, var izmantot ESP32 plates 3V3 un GND tapu. Ja nepieciešams, varat arī barot no atsevišķa avota.

Piezīme : Ir droši darbināt RTC DS1307 no 3,3 V ESP32 kontakta, ja netiek pārsniegts ESP32 strāvas ierobežojums. Bet, ja vēlaties atrasties drošā vietā, varat izmantot atsevišķu barošanas avotu RTC modulim vai izmēģināt mazjaudas DS3231 sensoru, kura darbības diapazons ir no 3,3 līdz 5,5 VDC.

Zemāk esošajā attēlā ir parādīts ESP32 savienojums ar RTC DS1307 sensoru.

Tāpat, ja vēlaties pievienot OLED ekrānu, lai parādītu laiku, varat izmantot tās pašas I2C tapas un ESP32 plates barošanas tapas.

6. Kods

Izmantojot tālāk norādīto kodu, mēs iestatīsim pašreizējo datumu un laiku RTC. Pēc laika iestatīšanas kods parādīs laiku Arduino IDE terminālī. Pirms koda augšupielādes tas ir jāatjaunina, norādot pašreizējo datumu un laiku.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Week_days [ 7 ] [ 12 ] = { 'svētdiena' , 'pirmdiena' , 'otrdiena' , 'trešdiena' , 'ceturtdiena' , 'piektdiena' , 'sestdiena' } ;
tukša iestatīšana ( ) {
Sērija.sākt ( 115200 ) ;
#ifndef ESP8266
kamēr ( ! Seriāls ) ;
#endif
ja ( ! DS1307_RTC.begin ( ) ) {
Serial.println ( 'Nevarēja atrast RTC' ) ;
kamēr ( 1 ) ;
}
DS1307_RTC.adjust ( Datums Laiks ( F ( __DATUMS__ ) , F ( __LAIKS__ ) ) ) ;
}
tukša cilpa ( ) {
Datums un laiks tagad = DS1307_RTC.now ( ) ;
Serial.print ( tagad.gads ( ) , DEC ) ;
Serial.print ( '/' ) ;
Serial.print ( tagad.mēnesis ( ) , DEC ) ;
Serial.print ( '/' ) ;
Serial.print ( tagad.diena ( ) , DEC ) ;
Serial.print ( '(' ) ;
Serial.print ( Nedēļas dienas [ now.dayOfTheWeek ( ) ] ) ;
Serial.print ( ')' ) ;
Serial.print ( tagad.stunda ( ) , DEC ) ;
Serial.print ( ':' ) ;
Serial.print ( tagad.minūte ( ) , DEC ) ;
Serial.print ( ':' ) ;
Serial.print ( tagad.otrais ( ) , DEC ) ;
Serial.println ( ) ;
kavēšanās ( 1000 ) ;
}

Šis kods izmanto RTClib bibliotēka saskarnei ar DS1307 reāllaika pulksteņa moduli, kas seko datumam un laikam.

The uzstādīt funkcija sākās ar datu pārraides ātruma inicializāciju. Pēc tam šajā sadaļā mēs definējām funkciju, lai sinhronizētu datora datumu un laiku ar sensoru DS1307. Tādējādi RTC sensorā tiks augšupielādēts koda apkopošanas laiks.

Jūs varat izmantot cilpa funkcija, lai iegūtu datumu un laiku no RTC. Pēc tam varat to parādīt seriālajā monitorā šādi: gads/mēnesis/diena (nedēļas diena) stunda:minūte:sekunde. Atcerieties pēc katras cilpas pievienot vienas sekundes aizkavi, lai kods nedarbotos pārāk ātri.

Rādīt pašreizējo laiku OLED displejā

Lai OLED ekrānā parādītu vienu un to pašu laiku, mums ir jāpievieno papildu koda daļa OLED ekrānam. Vienkārši augšupielādējiet norādīto kodu. Šis kods OLED ekrānā parādīs pašreizējo laiku.

Atcerieties, ka šeit mēs izmantojam 0,96 collu 128 × 64 I2C SSD OLED displeja moduli. Ja izmantojat citu izmēru, attiecīgi mainiet kodu. Pārbaudiet arī I2C adresi un modificējiet to dotajā kodā. Mūsu gadījumā OLED ekrānam ir I2C adrese 0x3C.

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

Adafruit_SSD1306 displejs ( SCREEN_WIDTH, SCREEN_HEIGHT, & vads, - 1 ) ;
RTC_DS1307 RTC;
char dienas [ 7 ] [ 12 ] = { 'svētdiena' , 'pirmdiena' , 'otrdiena' , 'trešdiena' , 'ceturtdiena' , 'piektdiena' , 'sestdiena' } ;
tukša iestatīšana ( ) {
Sērija.sākt ( 115200 ) ;
ja ( ! RTC.begin ( ) ) {
Serial.println ( 'Nevarēja atrast RTC' ) ;
kamēr ( 1 ) ;
}
RTC.pielāgot ( Datums Laiks ( F ( __DATUMS__ ) , F ( __LAIKS__ ) ) ) ;
ja ( ! parādīt.sākt ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'SSD1306 piešķiršana neizdevās' ) ) ;
priekš ( ;; ) ;
}
kavēšanās ( 1000 ) ;
display.clearDisplejs ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( BALTS ) ;
display.setCursor ( 30 , divdesmit ) ;
display.println ( 'Linux' ) ;
displejs.displejs ( ) ;
kavēšanās ( 3000 ) ;
display.clearDisplejs ( ) ;
}
tukša cilpa ( ) {
Datums un laiks tagad = RTC.now ( ) ;
display.clearDisplejs ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
display.print ( tagad.diena ( ) ) ;
display.print ( '/' ) ;
display.print ( tagad.mēnesis ( ) ) ;
display.print ( '/' ) ;
display.print ( tagad.gads ( ) ) ;
display.println ( dienas [ now.dayOfTheWeek ( ) ] ) ;
display.println ( '' ) ;
display.setCursor ( 0 , 40 ) ;
ja ( tagad.stunda ( ) < 10 )
display.print ( '0' ) ;
display.print ( tagad.stunda ( ) ) ;
display.print ( ':' ) ;
ja ( tagad.minūte ( ) < 10 )
display.print ( '0' ) ;
display.print ( tagad.minūte ( ) ) ;
display.print ( ':' ) ;
ja ( tagad.otrais ( ) < 10 )
display.print ( '0' ) ;
display.println ( tagad.otrais ( ) ) ;
displejs.displejs ( ) ;
}

Kods sākās ar bibliotēkām, kuras instalējām RTC un displejam. Pēc tam tas nosaka ekrāna izmēru un displeja adresi. Tas inicializē masīvu ar nedēļas dienu nosaukumiem.

The uzstādīt daļa sākas ar seriālo komunikāciju. Tas pārbauda, ​​vai RTC un displejs darbojas vai nē. Pēc tam mēs esam definējuši virknes tekstu “Linuxhint”, kas tiks parādīts 3 sekundes. Šis ir tikai sākuma vai palaišanas ziņojums. Varat arī modificēt šo ziņojumu ar savu pielāgoto tekstu.

The cilpa funkcija iegūst DS1307 moduļa datumu un laiku. Pēc tam tas notīra displeju un izdrukā datumu un laiku formatētā veidā. Kods arī pievieno sākuma nulles stundām, minūtēm un sekundēm, ja to vērtības ir mazākas par 10.

7. Aparatūra

Pēc koda augšupielādes ESP32 platē OLED ekrānā redzēsit šādu izvadi. Aparatūrai esam izmantojuši OLED ekrānu un I2C RTC DS1307 moduli. Tiek izmantota ESP32 plate ar 30 tapām. Varat arī eksperimentēt ar jebkuru citu ESP32 plati, taču pārliecinieties, ka I2C tapas ir pievienotas pareizi.

Secinājums

RTC DS1307 ir 56 baitu SRAM ar akumulatora rezerves atbalstu. Tā ir 8 kontaktu ierīce, kas izmanto I2C sakaru protokolu. Lai savienotu moduli DS1307 RTC ar ESP32, varat izmantot ESP32 plates I2C tapas (GPIO 22 (SCL) un GPIO 21 (SDA)). Lai parādītu laiku, varat izdrukāt laiku Arduino IDE konsolē vai izmantot jebkuru ekrānu, piemēram, OLED vai I2C LCD. DS1307 RTC modulis ir noderīga ierīce laika un datuma uzskaitei dažādās lietojumprogrammās. Dažas galvenās lietojumprogrammas ietver datu reģistrētājus, digitālos pulksteņus un viedpulksteņus.