ESP32 realiojo laiko laikrodis (RTC), naudojant DS1307 ir OLED ekraną

Esp32 Realiojo Laiko Laikrodis Rtc Naudojant Ds1307 Ir Oled Ekrana



ESP32 yra su įmontuotu RTC moduliu, tačiau jis veikia tik tada, kai yra maitinimo. Jei dings maitinimas, laikrodis bus nustatytas iš naujo ir negalės išlaikyti teisingo laiko. Taigi, jei norite sekti laiką arba valdyti bet kurį laiką pagrįstą įrenginį, išbandykite DS1307 RTC jutiklį. Tačiau galite galvoti apie atsarginės baterijos prijungimą prie ESP32 plokštės, tačiau tai nėra geriausias scenarijus, jei trūksta energijos. Geriausia alternatyva yra naudoti DS1307 jutiklį, nes jame yra įmontuota baterija, kuri gali veikti mažiausiai metus.

Kad viskas būtų aišku, ESP32 vidinis realiojo laiko laikrodis (RTC) gali sekti laiką net tada, kai pagrindinis procesorius yra išjungtas arba miega giliai. Galite naudoti ESP32 RTC, kad galėtumėte sekti laiką nenaudodami daug energijos ir nepaveikdami pagrindinio procesoriaus. Bet vis tiek reikia energijos, kad veiktų, bet ne tiek daug, bet reikia minimalaus energijos kiekio, kad veiktų vidinis RTC.

Taigi, mums belieka tik sprendimas naudoti išorinį RTC modulį. Pažiūrėkime ESP32 plokštės sujungimo su DS1307 RTC moduliu veiksmus.







Turinys:

1. Kas yra RTC DS1307 modulis

DS1307 yra mažos galios įrenginys, galintis tiksliai sekti laiką ir datą. Jis naudoja dvejetainiu koduotą dešimtainį (BCD) formatą. Jis gali nurodyti laiką detaliu formatu, pvz., sekundėmis, minutėmis ir net valandomis bei dienomis. Taip pat galite spausdinti datą visu formatu, pvz., mėnesį ir metus. Jis taip pat žino, kada yra keliamieji metai, iki 2100. Norėdami susisiekti su DS1307, galite naudoti I2C protokolą.





DS1307 turi įmontuotą bateriją, kuri gali maitinti maždaug metus be išorinio 5 V šaltinio. Naudojant šią atsarginę bateriją, jis gali išlaikyti laiką, net kai pagrindinis maitinimas išjungtas. Jame taip pat yra 56 baitai SRAM kai kuriems duomenims saugoti. DS1307 yra patogus įrenginys, kurį galima naudoti kartu su Arduino arba ESP32 plokšte. Pavyzdžiui, šie duomenys gali būti naudingi registruojant duomenis, signalizacijos sistemas ar pramoninį valdymą. Jei jums reikia patikimo laiko matavimo, DS1307 yra puikus pasirinkimas.





RTC DS1307 modulio specifikacijos

RTC DS1307 modulis susideda iš RTC IC, EEPROM, kristalo generatoriaus ir baterijos laikiklio atsarginei kopijai.



Žemiau pateikiama šių dalių informacija:

DS1307 RTC IC : DS1307 RTC IC yra 8 kontaktų lustas, kuris seka laiką ir datą naudodamas I2C protokolą. Jis naudoja labai mažai energijos, mažiau nei 500 nA. Jis gali rodyti laiką sekundėmis, minutėmis ir valandomis, o datą dienomis, mėnesiais ir metais. Jis taip pat gali perjungti 24 valandų ir 12 valandų formatus.

24C32 EEPROM IC : 24C32 EEPROM IC yra 32 baitų Atmel lustas, kuriame saugomi nustatymai, laikas ir data. Jis taip pat naudoja I2C protokolą.

32,768 kHz kristalas : 32,768 kHz kristalų generatorius suteikia DS1307 RTC IC laikrodžio dažnį.

Baterijos laikiklis : Baterijos laikiklyje telpa CR2032 baterija. Tai 3 V ličio monetų elementas. Jis nuolat maitina DS1307 RTC IC.

DS18B20 jutiklis : DS18B20 jutiklis leidžia lituoti ir naudoti DS18B20 temperatūros jutiklį. Jis nėra iš anksto lituotas. Galite lituoti kiaurymę ir gauti temperatūrą iš modulio DS kaiščio.

Toliau pateiktame sąraše pateikiamos kelios greitos DS1307 RTC jutiklio specifikacijos:

  • Darbinė įtampa: 4,5–5,5 V, paprastai 5 V
  • Dabartinis suvartojimas : Mažiau nei 1,5 mA
  • Tikslumas : 0–40 °C, priklauso nuo kristalo
  • Baterija : CR2032 (3 V moneta)
  • Atmintis : 56 baitai nepastovios RAM
  • Sąsaja : Dviejų laidų (I2C) nuoseklioji sąsaja
  • Išvestis : 1 Hz išvesties kaištis
  • Programuojama kvadratinių bangų išvestis : sunaudoja mažiau nei 500 nA akumuliatoriaus atsarginio maitinimo režimu
  • Maitinimo gedimo aptikimas : Automatinis maitinimo sutrikimo aptikimas ir jungiklio grandinė
  • Galios jutimo grandinė : Jis gali automatiškai persijungti į atsarginį tiekimą, kai trūksta energijos
  • Keliamųjų metų kompensacija : Galioja iki 2100 m

RTC DS1307 modulio kaištis

Modulis turi kelis kaiščius su skirtingomis funkcijomis.

  • VCC yra kaištis, kuriam moduliui maitinti reikalinga nuolatinė įtampa nuo 3,3 V iki 5,5 V.
  • GND yra žemos įtampos arba įžeminimo kaištis.
  • SDA ir SCL yra kontaktai, perduodantys duomenis ir laikrodžio signalus per I2C magistralę.
  • DS yra kaištis, matuojantis temperatūrą su DS1307 jutikliu, jei tokį turite RTC modulyje.
  • SQ yra kaištis, generuojantis kvadratinės bangos signalą, kurio dažnis yra 1 Hz, 4 kHz, 8 kHz arba 32 kHz, priklausomai nuo to, kaip jį programuojate.
  • VIENA yra kaištis, kuriame naudojama 3 V baterija, kad laikas būtų tikslus, kai pagrindinis maitinimas išjungtas.

2. Kaip susieti RTC DS1307 ir OLED ekraną su ESP32

Norėdami susieti ESP32 su DS1307 ir OLED ekranu, galite naudoti integruotus ESP32 plokštės I2C kaiščius. Tiek DS1307, tiek OLED ekranai yra I2C pagrįsti įrenginiai. Tada gali bendrauti naudojant I2C pagrindinį vergo protokolą per I2C magistralę.

Prieš pereidami prie ESP32 sąsajos su DS1307 ir OLED ekranu, pirmiausia turite įdiegti kai kurias reikalingas bibliotekas.

Reikalingų bibliotekų diegimas

Jums reikės dviejų bibliotekų, vienos RTC moduliui ir kitos OLED ekranui. Naudodami OLED su RTC moduliu galite sukurti nuostabias ir interaktyvias laikrodžio peržiūras. Jei neplanuojate rodyti laiko ekrane, galite praleisti šį bibliotekos diegimą.

Toliau pateikiamos dvi bibliotekos, kurių jums prireiks:

  • RTClib (Adafruit) yra Arduino IDE biblioteka, skirta nustatyti ir gauti laiką iš RTC. Jame taip pat pateikiamos pamokos, skirtos manipuliuoti datomis, laiku ir trukme. Naudodami šią biblioteką galite susieti ir programuoti realaus laiko laikrodžio (RTC) modulius, tokius kaip DS1307 ir DS3231.
  • S SD1306 (Adafruit) yra Arduino biblioteka, kurią naudodami galite susieti ir programuoti OLED ekranus su Arduino ar bet kuria kita mikrovaldiklio plokšte.

Norėdami atsisiųsti ir įdiegti abi šias bibliotekas Arduino IDE, pirmiausia atidarykite Bibliotekos vedėja suraskite RTClib biblioteką ir spustelėkite Diegti :

Jūs gausite galimybę įdiegti tik biblioteką arba jos priklausomybes. Spustelėkite Įdiegti viską mygtuką, kad visiškai įdiegtumėte biblioteką. Tokiu būdu jūs negausite jokių klaidų, jei pakeisite kodą, kuris priklauso nuo šios bibliotekos priklausomybių.

Panašiai ieškokite SSD1306 bibliotekos. Ši biblioteka reikalinga OLED ekranui. Spustelėkite Diegti Pereiti.

Šį kartą taip pat gausite tą patį patvirtinimo pranešimą. Spustelėkite ant Įdiegti viską variantas.

Dabar tiek OLED, tiek DS1307 bibliotekos yra įdiegtos ir paruoštos naudoti. Tačiau prieš tai pirmiausia išsiaiškinkite OLED ekrano I2C adresą.

3. OLED ekrano I2C adreso radimas

I2C adresas yra unikalus kiekvieno įrenginio, esančio I2C magistralėje, identifikatorius. Tai leidžia pagrindiniam įrenginiui susisiekti su konkrečiu pagalbiniu įrenginiu, siunčiant duomenis jo adresu. I2C adreso tikslas yra išvengti konfliktų ir painiavos tarp kelių toje pačioje magistralėje esančių įrenginių.

Norėdami gauti I2C įrenginio adresą, galite naudoti a paprastas eskizas, kuris nuskaito magistralę ir spausdina adresus aptiktų įrenginių. Arba galite patikrinti įrenginio duomenų lapą, kad pamatytumėte numatytąjį arba konfigūruojamą adresą.

Mūsų atveju, paleidus I2C skaitytuvo kodą, Arduino IDE terminale rodomas šis OLED ekrano I2C adresas.

Daugeliu atvejų yra didelė tikimybė, kad jūs taip pat gausite tą patį 0x3C OLED ekrano adresą.

4. OLED ir RTC DS1307 modulio sąsaja su ESP32

1. Prijunkite DS1307 modulio ir SDA ir SCL kaiščius OLED ekranas prie I2C kaiščių ESP32. Paprastai, tai yra GPIO 21 ir GPIO 22 , bet jei reikia, kode galite priskirti ir kitus kaiščius.

2. Prijunkite DS1307 VCC ir GND ir OLED ekraną prie ESP32 3,3 V ir GND kaiščių.

3. Į DS1307 modulį įdėkite CR2032 monetų elementą, kad realiojo laiko laikrodis būtų aprūpintas atsargine energija.

4. Įkelkite pavyzdinį kodą iš šios pamokos į savo ESP32 plokštę. Pakeiskite pasirinktinių išėjimų kodą.

Įkėlus laikrodis pradės veikti nuo nustatyto laiko ir rodys laiką OLED ekrane.

5. Grandinės schema

ESP32 su DS1307 schema yra paprasta, reikia prijungti tik keturis laidus. Galite sutrumpinti OLED ir DS1307 jutiklių I2C laidus SDA ir SCL. Panašiai, norint įjungti abu šiuos jutiklius, galima naudoti ESP32 plokštės 3V3 ir GND kaiščius. Jei reikia, taip pat galite maitinti iš atskiro šaltinio.

Pastaba : Saugu maitinti RTC DS1307 iš 3,3 V ESP32 kaiščio, jei neviršijama ESP32 srovės riba. Bet jei norite būti saugioje vietoje, galite naudoti atskirą maitinimo šaltinį RTC moduliui arba išbandyti mažos galios DS3231 jutiklį, kurio veikimo diapazonas yra nuo 3,3 iki 5,5 VDC.

Žemiau pateiktame paveikslėlyje parodytas ESP32 sujungimas su RTC DS1307 jutikliu.

Panašiai, jei norite prijungti OLED ekraną, kad būtų rodomas laikas, galite naudoti tuos pačius I2C kaiščius ir ESP32 plokštės maitinimo kaiščius.

6. Kodas

Naudodami toliau pateiktą kodą nustatysime dabartinę datą ir laiką RTC. Nustačius laiką, kodas parodys laiką Arduino IDE terminale. Prieš įkeldami kodą, turite jį atnaujinti, nurodydami dabartinę datą ir laiką.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Week_days [ 7 ] [ 12 ] = { 'sekmadienis' , 'pirmadienis' , 'antradienis' , 'trečiadienis' , 'ketvirtadienis' , 'penktadienis' , 'šeštadienis' } ;
tuščias nustatymas ( ) {
Serialas.begin ( 115 200 ) ;
#ifndef ESP8266
kol ( ! Serijinis ) ;
#endif
jeigu ( ! DS1307_RTC.begin ( ) ) {
Serial.println ( „Nepavyko rasti RTC“ ) ;
kol ( 1 ) ;
}
DS1307_RTC.adjust ( DataLaikas ( F ( __DATA__ ) , F ( __LAIKAS__ ) ) ) ;
}
tuščia kilpa ( ) {
DataLaikas dabar = DS1307_RTC.now ( ) ;
Serial.print ( dabar.metai ( ) , gruodžio mėn ) ;
Serial.print ( '/' ) ;
Serial.print ( dabar.mėnuo ( ) , gruodžio mėn ) ;
Serial.print ( '/' ) ;
Serial.print ( dabar.dieną ( ) , gruodžio mėn ) ;
Serial.print ( '(' ) ;
Serial.print ( Darbo dienomis [ dabar.DayOfTheWeek ( ) ] ) ;
Serial.print ( ')' ) ;
Serial.print ( dabar.valanda ( ) , gruodžio mėn ) ;
Serial.print ( ':' ) ;
Serial.print ( dabar.minute ( ) , gruodžio mėn ) ;
Serial.print ( ':' ) ;
Serial.print ( dabar.antra ( ) , gruodžio mėn ) ;
Serial.println ( ) ;
delsimas ( 1000 ) ;
}

Šis kodas naudoja RTClib biblioteka sąsaja su DS1307 realaus laiko laikrodžio moduliu, kuris seka datą ir laiką.

The sąranka funkcija prasidėjo nuo perdavimo spartos inicijavimo. Po to šiame skyriuje apibrėžėme funkciją sinchronizuoti kompiuterio datą ir laiką su DS1307 jutikliu. Taip į RTC jutiklį bus įkeltas kodo sudarymo laikas.

Galite naudoti kilpa funkcija gauti datą ir laiką iš RTC. Tada galite jį rodyti serijiniame monitoriuje taip: metai / mėnuo / diena (savaitės diena) valanda: minutė: sekundė. Nepamirškite po kiekvienos kilpos pridėti vienos sekundės delsos, kad kodas nebūtų paleistas per greitai.

Rodyti esamą laiką OLED ekrane

Norėdami tą patį laiką rodyti OLED ekrane, turime pridėti papildomą kodo dalį OLED ekranui. Tiesiog įkelkite nurodytą kodą. Šis kodas parodys dabartinį laiką OLED ekrane.

Atminkite, kad čia mes naudojame 0,96 colio 128 × 64 I2C SSD OLED ekrano modulį. Jei naudojate kitą dydį, atitinkamai pakeiskite kodą. Taip pat patikrinkite I2C adresą ir pakeiskite jį nurodytame kode. Mūsų atveju OLED ekranui turime I2C adresą 0x3C.

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

Adafruit_SSD1306 ekranas ( SCREEN_WIDTH, SCREEN_HEIGHT, & Viela, - 1 ) ;
RTC_DS1307 RTC;
char dienos [ 7 ] [ 12 ] = { 'sekmadienis' , 'pirmadienis' , 'antradienis' , 'trečiadienis' , 'ketvirtadienis' , 'penktadienis' , 'šeštadienis' } ;
tuščias nustatymas ( ) {
Serialas.begin ( 115 200 ) ;
jeigu ( ! RTC.begin ( ) ) {
Serial.println ( „Nepavyko rasti RTC“ ) ;
kol ( 1 ) ;
}
RTC.reguliuoti ( DataLaikas ( F ( __DATA__ ) , F ( __LAIKAS__ ) ) ) ;
jeigu ( ! rodyti.pradėti ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'SSD1306 paskirstymas nepavyko' ) ) ;
dėl ( ;; ) ;
}
delsimas ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( BALTAS ) ;
display.setCursor ( 30 , dvidešimt ) ;
display.println ( 'Linux' ) ;
ekranas.parodymas ( ) ;
delsimas ( 3000 ) ;
display.clearDisplay ( ) ;
}
tuščia kilpa ( ) {
DataLaikas dabar = RTC.now ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
display.print ( dabar.dieną ( ) ) ;
display.print ( '/' ) ;
display.print ( dabar.mėnuo ( ) ) ;
display.print ( '/' ) ;
display.print ( dabar.metai ( ) ) ;
display.println ( dienų [ dabar.DayOfTheWeek ( ) ] ) ;
display.println ( '' ) ;
display.setCursor ( 0 , 40 ) ;
jeigu ( dabar.valanda ( ) < 10 )
display.print ( '0' ) ;
display.print ( dabar.valanda ( ) ) ;
display.print ( ':' ) ;
jeigu ( dabar.minute ( ) < 10 )
display.print ( '0' ) ;
display.print ( dabar.minute ( ) ) ;
display.print ( ':' ) ;
jeigu ( dabar.antra ( ) < 10 )
display.print ( '0' ) ;
display.println ( dabar.antra ( ) ) ;
ekranas.parodymas ( ) ;
}

Kodas prasidėjo nuo bibliotekų, kurias įdiegėme RTC ir ekranui. Po to jis apibrėžia ekrano dydį ir rodymo adresą. Jis inicijuoja masyvą savaitės dienų pavadinimais.

The sąranka dalis prasideda serijiniu ryšiu. Jis patikrina, ar RTC ir ekranas veikia, ar ne. Po to mes apibrėžėme eilutės tekstą „Linuxhint“, kuris bus rodomas 3 sekundes. Tai tik įžanginis arba paleidimo pranešimas. Taip pat galite pakeisti šį pranešimą naudodami pasirinktinį tekstą.

The kilpa funkcija gauna DS1307 modulio datą ir laiką. Po to jis išvalo ekraną ir spausdina datą bei laiką suformatuotu būdu. Kodas taip pat prideda priekinius nulius prie valandų, minučių ir sekundžių, jei jų reikšmės yra mažesnės nei 10.

7. Techninė įranga

Įkėlę kodą į ESP32 plokštę, OLED ekrane pamatysite tokią išvestį. Aparatinei įrangai naudojome OLED ekraną ir I2C RTC DS1307 modulį. Naudojama ESP32 plokštė su 30 kontaktų. Taip pat galite eksperimentuoti su bet kuria kita ESP32 plokšte, tačiau įsitikinkite, kad tinkamai prijungėte I2C kaiščius.

Išvada

RTC DS1307 turi 56 baitų SRAM su atsarginės baterijos palaikymu. Tai 8 kontaktų įrenginys, kuriame naudojamas I2C ryšio protokolas. Norėdami susieti DS1307 RTC modulį su ESP32, galite naudoti ESP32 plokštės I2C kaiščius (GPIO 22 (SCL) ir GPIO 21 (SDA)). Laiką galite atspausdinti naudodami „Arduino IDE“ konsolę arba naudoti bet kurį ekraną, pvz., OLED arba I2C LCD, kad būtų rodomas laikas. DS1307 RTC modulis yra naudingas įrenginys, leidžiantis sekti laiką ir datą įvairiose programose. Kai kurios pagrindinės programos yra duomenų kaupikliai, skaitmeniniai laikrodžiai ir išmanieji laikrodžiai.