ESP32 realtidsklocka (RTC) med DS1307 och OLED-skärm

Esp32 Realtidsklocka Rtc Med Ds1307 Och Oled Skarm



ESP32 kommer med en inbyggd RTC-modul, men den fungerar bara när det finns ström. Om det blir strömavbrott kommer klockan att nollställas och kan inte hålla rätt tid. Så om du vill hålla koll på tiden eller styra någon tidsbaserad enhet, testa då DS1307 RTC-sensorn. Men du kanske funderar på att ansluta ett reservbatteri till ditt ESP32-kort, men det är inte det bästa scenariot att göra om du har strömbrist. Det bästa alternativet är att använda sensorn DS1307, eftersom den kommer med ett inbyggt batteri som kan hålla i minst ett år.

För att få saker klart kan ESP32:s interna realtidsklocka (RTC) hålla reda på tiden även när huvudprocessorn är avstängd eller i djup sömn. Du kan använda ESP32 RTC för att hålla koll på tiden utan att använda mycket ström eller att påverka huvudprocessorn. Men det kräver fortfarande ström för att köras, inte så mycket men en minsta mängd ström krävs för att intern RTC ska fungera.

Så med detta har vi bara lösningen att använda den externa RTC-modulen. Låt oss kolla in stegen för att koppla ESP32-kortet med DS1307 RTC-modulen.







Innehåll:

1. Vad är RTC DS1307-modulen

DS1307 är en energisnål enhet som kan hålla reda på tid och datum exakt. Den använder binärkodat decimalformat (BCD). Den kan berätta om tiden i ett detaljerat format som sekunder, minuter och till och med timmar och dagar. Du kan också skriva ut datumet i fullformat som månad och år. Den vet också när det är ett skottår, upp till 2100. För att kommunicera med DS1307 kan du använda I2C-protokollet.





DS1307 har ett inbyggt batteri som kan driva den i ungefär ett år utan en extern 5V-källa. Genom att använda denna batteribackup kan den behålla tiden även när huvudströmmen är avstängd. Den har också 56 byte SRAM för att lagra vissa data. DS1307 är en behändig enhet som har många applikationer när den kombineras med ett Arduino- eller ESP32-kort. Till exempel kan dessa data vara till hjälp vid dataloggning, larmsystem eller industriell kontroll. Om du behöver pålitlig tidtagning är DS1307 ett utmärkt alternativ.





RTC DS1307-modulspecifikationer

RTC DS1307-modulen består av RTC IC, ett EEPROM, en kristalloscillator och en batterihållare för backup.



Nedan följer detaljerna för dessa delar:

DS1307 RTC IC : DS1307 RTC IC är ett 8-stifts chip som håller reda på tid och datum med hjälp av I2C-protokollet. Den använder väldigt lite ström, mindre än 500nA. Den kan visa tid i sekunder, minuter och timmar, och datum i dagar, månader och år. Den kan också växla mellan 24-timmars- och 12-timmarsformat.

24C32 EEPROM IC : 24C32 EEPROM IC är ett 32-byte-chip från Atmel som lagrar inställningar, tid och datum. Den använder också I2C-protokollet.

32,768 kHz kristall : Kristalloscillatorn på 32,768 kHz tillhandahåller klockfrekvensen för DS1307 RTC IC.

Batteri hållare : Batterihållaren rymmer ett CR2032-batteri. Det är en 3V litium myntcell. Den ger kontinuerlig ström till DS1307 RTC IC.

DS18B20 sensorförsörjning : DS18B20-sensorn gör att du kan löda och använda DS18B20-temperatursensorn. Den är inte förlödd. Du kan löda det genomgående hålpaketet och få temperaturen från DS-stiftet på modulen.

Listan nedan ger några snabba specifikationer för DS1307 RTC-sensorn:

  • Driftspänning: 4,5–5,5 V, vanligtvis 5 V
  • Nuvarande förbrukning : Mindre än 1,5 mA
  • Noggrannhet : 0–40 °C, beroende på kristallen
  • Batteri : CR2032 (3 V mynt)
  • Minne : 56 byte beständigt RAM
  • Gränssnitt : Tvåtråds (I2C) seriellt gränssnitt
  • Produktion : 1 Hz utgångsstift
  • Programmerbar fyrkantvågsutgång : Förbrukar mindre än 500 nA i batteribackup-läge
  • Detektering av strömavbrott : Automatisk detektering av strömavbrott och strömbrytare
  • Power-sense krets : Den kan automatiskt växla till säkerhetskopiering vid strömbrist
  • Skottårsersättning : Gäller fram till år 2100

RTC DS1307 Modul Pinout

Modulen har flera stift med olika funktioner.

  • VCC är stiftet som behöver en DC-spänning mellan 3,3V och 5,5V för att driva modulen.
  • GND är stiftet för lågspänning eller jord.
  • SDA och SCL är stiften som kommunicerar data och klocksignaler genom I2C-bussen.
  • DS är stiftet som mäter temperaturen med DS1307-givaren om du har en sådan på RTC-modulen.
  • SQ är stiftet som genererar en fyrkantsvågsignal med en frekvens på 1 Hz, 4 kHz, 8 kHz eller 32 kHz, beroende på hur du programmerar den.
  • ETT är stiftet som använder ett 3V-batteri för att hålla tiden exakt när huvudströmmen är avstängd.

2. Hur man gränssnitt RTC DS1307 och OLED Display med ESP32

För att koppla ESP32 till DS1307 och OLED-skärm kan du använda de inbyggda I2C-stiften på ESP32-kortet. Både DS1307 och OLED-skärmen är I2C-baserade enheter. Sedan kan kommunicera med hjälp av I2C-masterslavprotokollet över I2C-bussen.

Innan vi går mot gränssnittet av ESP32 med DS1307 och OLED-skärm måste du först installera några nödvändiga bibliotek.

Installera de nödvändiga biblioteken

Du kommer att behöva två bibliotek, ett för RTC-modulen och ett för OLED-skärmen. Genom att använda OLED med en RTC-modul kan du skapa fantastiska och interaktiva klockförhandsvisningar. Om du inte har någon plan för att visa tiden på skärmen kan du hoppa över den här biblioteksinstallationen.

Följande är de två bibliotek som du kommer att behöva:

  • RTClib (av Adafruit) är ett Arduino IDE-bibliotek för att ställa in och få tid från en RTC. Det tillhandahåller också klasser för att manipulera datum, tider och varaktigheter. Med hjälp av detta bibliotek kan du gränssnitt och programmera realtidsklocka (RTC) moduler, såsom DS1307 och DS3231.
  • S SD1306 (av Adafruit) är ett bibliotek för Arduino, med vilket du kan gränssnitt och programmera OLED-skärmarna med Arduino eller något annat mikrokontrollerkort.

För att ladda ner och installera båda dessa bibliotek i Arduino IDE, öppna först Bibliotekschef sök efter RTClib-biblioteket och klicka Installera :

Du kommer att få alternativet att bara installera biblioteket eller dess beroenden. Klicka på Installera alla knappen för att helt installera biblioteket. På så sätt kommer du inte att få något fel om du ändrar koden som beror på beroendet av detta bibliotek.

Sök på samma sätt efter SSD1306-biblioteket. Detta bibliotek behövs för en OLED-skärm. Klick Installera att fortsätta.

Den här gången får du också samma bekräftelsemeddelande. Klicka på Installera alla alternativ.

Nu är både biblioteken för OLED och DS1307 installerade och redo att användas. Men innan dess, först ta reda på I2C-adressen för OLED-skärmen.

3. Hitta I2C-adressen för OLED-skärmen

I2C-adressen är en unik identifierare för varje enhet på I2C-bussen. Det tillåter masterenheten att kommunicera med en specifik slavenhet genom att skicka data till dess adress. Syftet med I2C-adressen är att undvika konflikter och förvirring mellan flera enheter på samma buss.

För att få adressen till en I2C-enhet kan du använda en enkel skiss som skannar bussen och skriver ut adresserna av enheterna den hittar. Alternativt kan du kontrollera enhetens datablad för att se dess standardadress eller konfigurerbara adress.

Här i vårt fall efter att ha kört I2C-skannerkoden visas följande I2C-adress för OLED-skärmen på Arduino IDE-terminalen.

För det mesta är chansen stor att du också får samma 0x3C adress för din OLED-skärm.

4. Anslut OLED- och RTC DS1307-modulen till ESP32

1. Anslut SDA- och SCL-stiften på både DS1307-modulen och OLED-skärm till I2C-stiften av ESP32. Vanligtvis, dessa är GPIO 21 och GPIO 22 , men du kan tilldela andra stift även i koden om det behövs.

2. Anslut både VCC och GND på DS1307 och OLED-skärmen till 3,3V- och GND-stiften på ESP32.

3. Sätt i ett CR2032 knappcellsbatteri i DS1307-modulen för att ge reservkraft till realtidsklockan.

4. Ladda upp exempelkoden från denna handledning till ditt ESP32-kort. Ändra koden för anpassade utgångar.

Efter uppladdning startar en klocka från den inställda tiden och visar tiden på OLED-skärmen.

5. Kretsdiagram

Kretsschemat för ESP32 med DS1307 är enkelt, med bara fyra ledningar som behöver anslutas. Du kan förkorta I2C-kablarna SDA och SCL för både OLED- och DS1307-sensorerna. På liknande sätt, för att slå på båda dessa sensorer, kan 3V3- och GND-stiftet på ESP32-kortet användas. Du kan också driva från en separat källa om det behövs.

Notera : Det är säkert att driva RTC DS1307 från ett 3,3V-stift på ESP32 om strömgränsen för ESP32 inte överskrids. Men om du vill vara på en säker plats kan du antingen använda en separat strömkälla för RTC-modulen eller prova lågeffektssensorn DS3231 vars driftsområde är mellan 3,3 till 5,5 VDC.

Bilden nedan illustrerar anslutningen av ESP32 till RTC DS1307-sensorn.

På liknande sätt, om du vill ansluta OLED-skärmen för att visa tiden, kan du använda samma I2C-stift och strömstiften på ESP32-kortet.

6. Kod

Med hjälp av koden nedan kommer vi att ställa in aktuellt datum och tid på RTC. Efter att ha ställt in tiden kommer koden att visa tiden på Arduino IDE-terminalen. Innan du laddar upp koden måste du uppdatera den med ditt aktuella datum och tid.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Week_days [ 7 ] [ 12 ] = { 'söndag' , 'måndag' , 'tisdag' , 'onsdag' , 'torsdag' , 'Fredag' , 'lördag' } ;
ogiltig installation ( ) {
Serial.begin ( 115200 ) ;
#ifndef ESP8266
medan ( ! Serie ) ;
#endif
om ( ! DS1307_RTC.begin ( ) ) {
Serial.println ( 'Kunde inte hitta RTC' ) ;
medan ( 1 ) ;
}
DS1307_RTC.adjust ( Datum Tid ( F ( __DATUM__ ) , F ( __TID__ ) ) ) ;
}
tom slinga ( ) {
DateTime nu = DS1307_RTC.now ( ) ;
Serial.print ( nu.år ( ) , DEC ) ;
Serial.print ( '/' ) ;
Serial.print ( nu.månad ( ) , DEC ) ;
Serial.print ( '/' ) ;
Serial.print ( nu dag ( ) , DEC ) ;
Serial.print ( '(' ) ;
Serial.print ( Week_days [ now.dayOfTheWeek ( ) ] ) ;
Serial.print ( ') ' ) ;
Serial.print ( nu.timme ( ) , DEC ) ;
Serial.print ( ':' ) ;
Serial.print ( nu.minut ( ) , DEC ) ;
Serial.print ( ':' ) ;
Serial.print ( nu.andra ( ) , DEC ) ;
Serial.println ( ) ;
dröjsmål ( 1000 ) ;
}

Denna kod använder RTClib-bibliotek för gränssnitt med en DS1307 realtidsklockamodul som håller reda på datum och tid.

De uppstart funktionen startade med att initiera baudhastigheten. Efter det, i det här avsnittet, definierade vi funktionen för att synkronisera datum och tid för datorn med DS1307-sensorn. Detta kommer att ladda upp tiden för kodkompilering till RTC-sensorn.

Du kan använda slinga funktion för att hämta datum och tid från RTC. Sedan kan du visa det på den seriella monitorn så här: år/månad/dag (veckodag) timme:minut:sekund. Kom ihåg att lägga till en fördröjning på en sekund efter varje slinga, så att koden inte går för snabbt.

Visa aktuell tid på OLED-skärm

För att visa samma tid på OLED-skärmen måste vi lägga till en extra koddel för OLED-skärmen. Ladda bara upp den angivna koden. Denna kod kommer att visa aktuell tid på din OLED-skärm.

Kom ihåg att här använder vi 0,96-tums 128×64 I2C SSD OLED Display Module. Om du använder någon annan storlek, ändra koden därefter. Kontrollera också I2C-adressen och ändra den i den angivna koden. I vårt fall har vi en I2C-adress 0x3C för 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;
röding dagar [ 7 ] [ 12 ] = { 'söndag' , 'måndag' , 'tisdag' , 'onsdag' , 'torsdag' , 'Fredag' , 'lördag' } ;
ogiltig installation ( ) {
Serial.begin ( 115200 ) ;
om ( ! RTC.begin ( ) ) {
Serial.println ( 'Kunde inte hitta RTC' ) ;
medan ( 1 ) ;
}
RTC.justera ( Datum Tid ( F ( __DATUM__ ) , F ( __TID__ ) ) ) ;
om ( ! display.begin ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'SSD1306-allokering misslyckades' ) ) ;
för ( ;; ) ;
}
dröjsmål ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( VIT ) ;
display.setCursor ( 30 , tjugo ) ;
display.println ( 'Linux' ) ;
display.display ( ) ;
dröjsmål ( 3000 ) ;
display.clearDisplay ( ) ;
}
tom slinga ( ) {
DateTime nu = RTC.now ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
display.print ( nu dag ( ) ) ;
display.print ( '/' ) ;
display.print ( nu.månad ( ) ) ;
display.print ( '/' ) ;
display.print ( nu.år ( ) ) ;
display.println ( dagar [ now.dayOfTheWeek ( ) ] ) ;
display.println ( ' ' ) ;
display.setCursor ( 0 , 40 ) ;
om ( nu.timme ( ) < 10 )
display.print ( '0' ) ;
display.print ( nu.timme ( ) ) ;
display.print ( ':' ) ;
om ( nu.minut ( ) < 10 )
display.print ( '0' ) ;
display.print ( nu.minut ( ) ) ;
display.print ( ':' ) ;
om ( nu.andra ( ) < 10 )
display.print ( '0' ) ;
display.println ( nu.andra ( ) ) ;
display.display ( ) ;
}

Koden började med biblioteken vi installerade för RTC och displayen. Efter det definierar den skärmstorleken och visningsadressen. Den initierar arrayen med veckodagsnamn.

De uppstart del börjar med seriell kommunikation. Den kontrollerar om RTC och displayen fungerar eller inte. Efter det har vi definierat en strängtext 'Linuxhint' som kommer att visas i 3 sekunder. Detta är endast ett öppnings- eller startmeddelande, du kan också ändra detta meddelande med din anpassade text.

De slinga funktionen hämtar DS1307-modulens datum och tid. Efter det rensar den displayen och skriver ut datum och tid på ett formaterat sätt. Koden lägger också till inledande nollor till timmar, minuter och sekunder, om deras värden är mindre än 10.

7. Hårdvara

Efter att ha laddat upp koden till ESP32-kortet kommer du att se följande utdata på OLED-skärmen. För hårdvara har vi använt OLED-skärmen och en I2C RTC DS1307-modul. ESP32-kort med 30 stift används. Du kan experimentera med alla andra ESP32-kort också, men se till att ansluta I2C-stiften korrekt.

Slutsats

RTC DS1307 har ett 56-byte SRAM med batteribackupstöd. Det är en 8-stifts enhet som använder ett I2C-kommunikationsprotokoll. För att koppla ihop DS1307 RTC-modulen med ESP32 kan du använda I2C-stiften (GPIO 22 (SCL) och GPIO 21 (SDA)) på ESP32-kortet. Du kan skriva ut tiden på en Arduino IDE-konsol eller använda vilken skärm som helst som OLED eller I2C LCD för att visa tiden. DS1307 RTC-modulen är en användbar enhet för att hålla reda på tid och datum i olika applikationer. Vissa huvudapplikationer inkluderar dataloggrar, digitala klockor och smartklockor.