ESP32 sanntidsklokke (RTC) Bruker DS1307 og OLED-skjerm

Esp32 Sanntidsklokke Rtc Bruker Ds1307 Og Oled Skjerm



ESP32 kommer med en innebygd RTC-modul, men den fungerer kun når det er strøm. Hvis det er strømbrudd, vil klokken bli tilbakestilt og ikke i stand til å holde riktig tid. Så hvis du vil holde styr på tiden eller kontrollere en hvilken som helst tidsbasert enhet, så prøv DS1307 RTC-sensoren. Imidlertid tenker du kanskje på å koble et reservebatteri til ESP32-kortet ditt, men det er ikke det beste scenarioet å gjøre hvis du har strømmangel. Det beste alternativet er å bruke DS1307-sensoren, da den kommer med et innebygd batteri som kan vare i minimum ett år.

For å få ting klart, kan ESP32s interne sanntidsklokke (RTC) holde styr på tiden selv når hovedprosessoren er slått av eller i dyp søvn. Du kan bruke ESP32 RTC til å holde styr på tiden uten å bruke mye strøm eller påvirke hovedprosessoren. Men den krever fortsatt strøm for å kjøre, ikke så mye, men en minimumsmengde strøm kreves for at intern RTC skal kjøre.

Så med dette sitter vi bare igjen med løsningen med å bruke den eksterne RTC-modulen. La oss sjekke ut trinnene for å koble ESP32-kortet med DS1307 RTC-modulen.







Innhold:

1. Hva er RTC DS1307-modulen

DS1307 er en lavstrømsenhet som kan holde oversikt over tid og dato nøyaktig. Den bruker binærkodet desimal (BCD) format. Den kan fortelle deg tid i et detaljert format som sekunder, minutter og til og med timer og dager. Du kan også skrive ut datoen i fullformat som måned og år. Den vet også når det er et skuddår, opp til 2100. For å kommunisere med DS1307 kan du bruke I2C-protokollen.





DS1307 har et innebygd batteri som kan drive den i omtrent ett år uten en ekstern 5V-kilde. Ved å bruke denne batteribackupen kan den beholde tiden selv når hovedstrømmen er av. Den har også 56 byte med SRAM for å lagre noen data. DS1307 er en hendig enhet som har mange applikasjoner når den kombineres med et Arduino- eller ESP32-kort. Disse dataene kan for eksempel være nyttige i datalogging, alarmsystemer eller industriell kontroll. Hvis du trenger pålitelig tidtaking, er DS1307 et flott alternativ.





RTC DS1307-modulspesifikasjoner

RTC DS1307-modulen består av RTC IC, en EEPROM, en krystalloscillator og en batteriholder for backup.



Nedenfor er detaljene for disse delene:

DS1307 RTC IC : DS1307 RTC IC er en 8-pinners brikke som holder styr på tid og dato ved hjelp av I2C-protokollen. Den bruker svært lite strøm, mindre enn 500nA. Den kan vise tid i sekunder, minutter og timer, og dato i dager, måneder og år. Den kan også bytte mellom 24-timers og 12-timers formater.

24C32 EEPROM IC : 24C32 EEPROM IC er en 32-byte brikke fra Atmel som lagrer innstillingene, klokkeslettet og datoen. Den bruker også I2C-protokollen.

32,768 kHz krystall : 32,768 kHz krystalloscillatoren gir klokkefrekvensen for DS1307 RTC IC.

Batteriholder : Batteriholderen holder et CR2032-batteri. Det er en 3V litium myntcelle. Den gir kontinuerlig strøm til DS1307 RTC IC.

DS18B20 sensorforsyning : DS18B20-sensoren lar deg lodde og bruke DS18B20-temperatursensoren. Den er ikke forhåndsloddet. Du kan lodde den gjennomgående pakken og få temperaturen fra DS-pinnen på modulen.

Listen nedenfor gir noen raske spesifikasjoner for DS1307 RTC-sensoren:

  • Driftsspenning: 4,5–5,5 V, typisk 5 V
  • Dagens forbruk : Mindre enn 1,5 mA
  • Nøyaktighet : 0–40 °C, avhenger av krystallen
  • Batteri : CR2032 (3 V mynt)
  • Hukommelse : 56 byte med ikke-flyktig RAM
  • Grensesnitt : To-leder (I2C) seriell grensesnitt
  • Produksjon : 1 Hz utgangspinne
  • Programmerbar firkantbølgeutgang : Forbruker mindre enn 500 nA i batteribackup-modus
  • Deteksjon av strømbrudd : Automatisk strømbrudddeteksjon og bryterkretser
  • Power-sense krets : Den kan automatisk bytte for å sikkerhetskopiere forsyning ved strømmangel
  • Skuttårskompensasjon : Gyldig til år 2100

RTC DS1307 Modul Pinout

Modulen har flere pinner med ulike funksjoner.

  • VCC er pinnen som trenger en likespenning mellom 3,3V og 5,5V for å drive modulen.
  • GND er pinnen for lavspenning eller jord.
  • SDA og SCL er pinnene som kommuniserer data og klokkesignaler gjennom I2C-bussen.
  • DS er pinnen som måler temperaturen med DS1307-sensoren hvis du har en på RTC-modulen.
  • SQ er pinnen som genererer et firkantbølgesignal med en frekvens på 1 Hz, 4 kHz, 8 kHz eller 32 kHz, avhengig av hvordan du programmerer det.
  • EN er pinnen som bruker et 3V batteri for å holde tiden nøyaktig når hovedstrømmen er av.

2. Hvordan grensesnitt mellom RTC DS1307 og OLED-skjerm med ESP32

For å koble ESP32 til DS1307 og OLED-skjerm, kan du bruke de innebygde I2C-pinnene på ESP32-kortet. Både DS1307 og OLED-skjermen er I2C-baserte enheter. Deretter kan kommunisere ved hjelp av I2C master slave-protokollen over I2C-bussen.

Før vi går mot grensesnittet til ESP32 med DS1307 og OLED-skjerm, må du først installere noen nødvendige biblioteker.

Installere de nødvendige bibliotekene

Du trenger to biblioteker, ett for RTC-modulen og ett for OLED-skjermen. Ved å bruke OLED med en RTC-modul kan du lage fantastiske og interaktive forhåndsvisninger av klokken. Hvis du ikke har noen planer om å vise tiden på skjermen, kan du hoppe over denne bibliotekinstallasjonen.

Følgende er de to bibliotekene du trenger:

  • RTClib (av Adafruit) er et Arduino IDE-bibliotek for å stille inn og få tid fra en RTC. Det gir også klasser for å manipulere datoer, klokkeslett og varigheter. Ved å bruke dette biblioteket kan du koble til og programmere sanntidsklokkemodulene (RTC), for eksempel DS1307 og DS3231.
  • S SD1306 (av Adafruit) er et bibliotek for Arduino, som du kan bruke som grensesnitt og programmere OLED-skjermene med Arduino eller et hvilket som helst annet mikrokontrollerkort.

For å laste ned og installere begge disse bibliotekene i Arduino IDE, åpne først Biblioteksjef søk etter RTClib-biblioteket, og klikk Installere :

Du vil få muligheten til å installere bare biblioteket eller dets avhengigheter. Klikk på Installer alle knappen for å installere biblioteket fullstendig. På denne måten vil du ikke få noen feil hvis du endrer koden som avhenger av avhengighetene til dette biblioteket.

Søk på samme måte etter SSD1306-biblioteket. Dette biblioteket er nødvendig for en OLED-skjerm. Klikk Installere å fortsette.

Denne gangen vil du også få den samme bekreftelsesmeldingen. Klikk på Installer alle alternativ.

Nå er både bibliotekene for OLED og DS1307 installert og klare til bruk. Men før det, finn først ut I2C-adressen for OLED-skjermen.

3. Finne I2C-adressen til OLED-skjermen

I2C-adressen er en unik identifikator for hver enhet på I2C-bussen. Den lar masterenheten kommunisere med en spesifikk slaveenhet ved å sende data til adressen. Hensikten med I2C-adressen er å unngå konflikter og forvirring mellom flere enheter på samme buss.

For å få adressen til en I2C-enhet kan du bruke en enkel skisse som skanner bussen og skriver ut adressene av enhetene den finner. Alternativt kan du sjekke dataarket til enheten for å se dens standard eller konfigurerbare adresse.

Her i vårt tilfelle, etter å ha kjørt I2C-skannerkoden, vises følgende I2C-adresse til OLED-skjermen på Arduino IDE-terminalen.

Som oftest er det stor sjanse for at du også får det samme 0x3C adresse for OLED-skjermen.

4. Forbind OLED- og RTC DS1307-modulen med ESP32

1. Koble til SDA- og SCL-pinnene til både DS1307-modulen og OLED-skjerm til I2C-pinnene av ESP32. Som oftest, disse er GPIO 21 og GPIO 22 , men du kan tilordne andre pinner også i koden om nødvendig.

2. Koble både VCC og GND på DS1307 og OLED-skjermen til 3,3V og GND pinnene på ESP32.

3. Sett inn et CR2032-knappcellebatteri i DS1307-modulen for å gi reservestrøm til sanntidsklokken.

4. Last opp eksempelkoden fra denne opplæringen til ESP32-kortet ditt. Endre koden for egendefinerte utganger.

Etter opplasting starter en klokke fra innstilt tid og viser tiden på OLED-skjermen.

5. Kretsdiagram

Kretsskjemaet til ESP32 med DS1307 er enkelt, med bare fire ledninger som må kobles til. Du kan forkorte I2C-ledningene SDA og SCL til både OLED- og DS1307-sensorene. Tilsvarende, for å slå på begge disse sensorene, kan 3V3- og GND-pinnen til ESP32-kortet brukes. Du kan også strømme fra en separat kilde om nødvendig.

Merk : Det er trygt å drive RTC DS1307 fra en 3,3V pin på ESP32 hvis strømgrensen på ESP32 ikke overskrides. Men hvis du vil være på et trygt sted, kan du enten bruke en separat strømkilde for RTC-modulen eller prøve laveffekts DS3231-sensoren hvis driftsområde er mellom 3,3 til 5,5 VDC.

Bildet nedenfor illustrerer tilkoblingen av ESP32 med RTC DS1307-sensoren.

På samme måte, hvis du vil koble til OLED-skjermen for å vise tiden, kan du bruke de samme I2C-pinnene og strømpinnene til ESP32-kortet.

6. Kode

Ved å bruke koden nedenfor vil vi angi gjeldende dato og klokkeslett på RTC. Etter å ha stilt inn tiden, vil koden vise tiden på Arduino IDE-terminalen. Før du laster opp koden, må du oppdatere den med gjeldende dato og klokkeslett.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
røye Uke_dager [ 7 ] [ 12 ] = { 'Søndag' , 'Mandag' , 'Tirsdag' , 'Onsdag' , 'Torsdag' , 'Fredag' , 'Lørdag' } ;
ugyldig oppsett ( ) {
Serial.begin ( 115200 ) ;
#ifndef ESP8266
samtidig som ( ! Seriell ) ;
#slutt om
hvis ( ! DS1307_RTC.begin ( ) ) {
Serial.println ( 'Kunne ikke finne RTC' ) ;
samtidig som ( 1 ) ;
}
DS1307_RTC.adjust ( Dato tid ( F ( __DATO__ ) , F ( __TID__ ) ) ) ;
}
ugyldig sløyfe ( ) {
DatoTid nå = DS1307_RTC.now ( ) ;
Serial.print ( nå.år ( ) , DES ) ;
Serial.print ( '/' ) ;
Serial.print ( nå.måned ( ) , DES ) ;
Serial.print ( '/' ) ;
Serial.print ( nå dag ( ) , DES ) ;
Serial.print ( '(' ) ;
Serial.print ( Uke_dager [ now.dayOfTheWeek ( ) ] ) ;
Serial.print ( ') ' ) ;
Serial.print ( nå.time ( ) , DES ) ;
Serial.print ( ':' ) ;
Serial.print ( nå.minutt ( ) , DES ) ;
Serial.print ( ':' ) ;
Serial.print ( nå.sekund ( ) , DES ) ;
Serial.println ( ) ;
forsinkelse ( 1000 ) ;
}

Denne koden bruker RTClib-bibliotek til grensesnitt med en DS1307 sanntidsklokkemodul som holder styr på dato og klokkeslett.

De oppsett funksjonen startet med initialisering av overføringshastigheten. Etter det, inne i denne delen, definerte vi funksjonen for å synkronisere dato og klokkeslett for datamaskinen med DS1307-sensoren. Dette vil laste opp tidspunktet for kodekompilering til RTC-sensoren.

Du kan bruke Løkke funksjon for å hente dato og klokkeslett fra RTC. Deretter kan du vise den på den serielle skjermen slik: år/måned/dag (ukedag) time:minutt:sekund. Husk å legge til en forsinkelse på ett sekund etter hver sløyfe, slik at koden ikke kjører for fort.

Vis gjeldende tid på OLED-skjerm

For å vise samme tid på OLED-skjermen, må vi legge til en ekstra kodedel for OLED-skjermen. Bare last opp den gitte koden. Denne koden vil vise gjeldende tid på OLED-skjermen.

Husk, her bruker vi 0,96-tommers 128×64 I2C SSD OLED-skjermmodul. Hvis du bruker en annen størrelse, endre koden tilsvarende. Sjekk også I2C-adressen og endre den i den gitte koden. I vårt tilfelle har vi en I2C-adresse 0x3C for OLED-skjermen.

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

Adafruit_SSD1306-skjerm ( SCREEN_WIDTH, SCREEN_HEIGHT, & ledning, - 1 ) ;
RTC_DS1307 RTC;
røye dager [ 7 ] [ 12 ] = { 'Søndag' , 'Mandag' , 'Tirsdag' , 'Onsdag' , 'Torsdag' , 'Fredag' , 'Lørdag' } ;
ugyldig oppsett ( ) {
Serial.begin ( 115200 ) ;
hvis ( ! RTC.begin ( ) ) {
Serial.println ( 'Kunne ikke finne RTC' ) ;
samtidig som ( 1 ) ;
}
RTC.juster ( Dato tid ( F ( __DATO__ ) , F ( __TID__ ) ) ) ;
hvis ( ! display.begin ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'SSD1306-tildeling mislyktes' ) ) ;
til ( ;; ) ;
}
forsinkelse ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( HVIT ) ;
display.setCursor ( 30 , tjue ) ;
display.println ( 'Linux' ) ;
display.display ( ) ;
forsinkelse ( 3000 ) ;
display.clearDisplay ( ) ;
}
ugyldig sløyfe ( ) {
DatoTid nå = RTC.now ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
display.print ( nå dag ( ) ) ;
display.print ( '/' ) ;
display.print ( nå.måned ( ) ) ;
display.print ( '/' ) ;
display.print ( nå.år ( ) ) ;
display.println ( dager [ now.dayOfTheWeek ( ) ] ) ;
display.println ( ' ' ) ;
display.setCursor ( 0 , 40 ) ;
hvis ( nå.time ( ) < 10 )
display.print ( '0' ) ;
display.print ( nå.time ( ) ) ;
display.print ( ':' ) ;
hvis ( nå.minutt ( ) < 10 )
display.print ( '0' ) ;
display.print ( nå.minutt ( ) ) ;
display.print ( ':' ) ;
hvis ( nå.sekund ( ) < 10 )
display.print ( '0' ) ;
display.println ( nå.sekund ( ) ) ;
display.display ( ) ;
}

Koden startet med bibliotekene vi installerte for RTC og skjermen. Etter det definerer den skjermstørrelsen og visningsadressen. Den initialiserer matrisen med ukedagnavn.

De oppsett delen starter med seriell kommunikasjon. Den sjekker om RTC og skjermen fungerer eller ikke. Etter det har vi definert en strengtekst 'Linuxhint' som vises i 3 sekunder. Dette er kun en åpnings- eller oppstartsmelding, du kan også endre denne meldingen med din egendefinerte tekst.

De Løkke funksjonen henter DS1307-modulens dato og klokkeslett. Etter det tømmer den skjermen og skriver ut dato og klokkeslett på en formatert måte. Koden legger også innledende nuller til timer, minutter og sekunder, i tilfelle verdiene deres er mindre enn 10.

7. Maskinvare

Etter å ha lastet opp koden til ESP32-kortet, vil du se følgende utgang på OLED-skjermen. For maskinvare har vi brukt OLED-skjermen og en I2C RTC DS1307-modul. Det brukes ESP32-kort med 30 pinner. Du kan eksperimentere med et hvilket som helst annet ESP32-kort også, men sørg for å koble I2C-pinnene riktig.

Konklusjon

RTC DS1307 har en 56-byte SRAM med batteristøtte. Det er en 8-pinners enhet som bruker en I2C kommunikasjonsprotokoll. For å koble DS1307 RTC-modulen til ESP32, kan du bruke I2C-pinnene (GPIO 22 (SCL) og GPIO 21 (SDA)) på ESP32-kortet. Du kan skrive ut tiden på en Arduino IDE-konsoll eller bruke hvilken som helst skjerm som OLED eller I2C LCD for å vise tiden. DS1307 RTC-modulen er en nyttig enhet for å holde styr på tid og dato i ulike applikasjoner. Noen hovedapplikasjoner inkluderer dataloggere, digitale klokker og smartklokker.