ESP32 Realtimeklok (RTC) met DS1307 en OLED-display

Esp32 Realtimeklok Rtc Met Ds1307 En Oled Display



ESP32 wordt geleverd met een ingebouwde RTC-module, maar die werkt alleen als er stroom is. Als er stroom uitvalt, wordt de klok gereset en kan deze de juiste tijd niet meer bijhouden. Dus als je de tijd wilt bijhouden of een op tijd gebaseerd apparaat wilt bedienen, probeer dan de DS1307 RTC-sensor. U overweegt echter misschien om een ​​reservebatterij aan te sluiten op uw ESP32-bord, maar dat is niet het beste scenario als u een stroomtekort heeft. Het beste alternatief is het gebruik van de DS1307-sensor, omdat deze wordt geleverd met een ingebouwde batterij die minimaal een jaar meegaat.

Om de zaken duidelijk te maken, kan de interne Real-Time Clock (RTC) van de ESP32 de tijd bijhouden, zelfs wanneer de hoofdprocessor is uitgeschakeld of in diepe slaap verkeert. U kunt de ESP32 RTC gebruiken om de tijd bij te houden zonder veel stroom te verbruiken of de hoofdprocessor te beïnvloeden. Maar er is nog steeds stroom nodig om te kunnen werken, niet zo veel, maar er is een minimale hoeveelheid stroom nodig om de interne RTC te laten werken.

Hiermee hebben we dus alleen nog de oplossing om de externe RTC-module te gebruiken. Laten we eens kijken naar de stappen voor het koppelen van het ESP32-bord met de DS1307 RTC-module.







Inhoud:

1. Wat is de RTC DS1307-module

DS1307 is een apparaat met laag vermogen dat tijd en datum nauwkeurig kan bijhouden. Het maakt gebruik van binair gecodeerd decimaal (BCD) formaat. Het kan u de tijd vertellen in een gedetailleerd formaat zoals seconden, minuten en zelfs uren en dagen. U kunt de datum ook in volledig formaat afdrukken, zoals maand en jaar. Hij weet ook wanneer het een schrikkeljaar is, tot 2100. Om met de DS1307 te communiceren, kunt u het I2C-protocol gebruiken.





DS1307 heeft een ingebouwde batterij die hem ongeveer een jaar van stroom kan voorzien zonder een externe 5V-bron. Met behulp van deze batterijback-up kan de tijd worden vastgehouden, zelfs als de hoofdstroom is uitgeschakeld. Het heeft ook 56 bytes SRAM om bepaalde gegevens op te slaan. De DS1307 is een handig apparaatje dat in combinatie met een Arduino- of ESP32-bord veel toepassingsmogelijkheden heeft. Deze gegevens kunnen bijvoorbeeld nuttig zijn bij datalogging, alarmsystemen of industriële controle. Als u betrouwbare tijdregistratie nodig heeft, is de DS1307 een geweldige optie.





RTC DS1307 Modulespecificaties

De RTC DS1307-module bestaat uit het RTC IC, een EEPROM, een kristaloscillator en een batterijhouder als back-up.



Hieronder vindt u de details van deze onderdelen:

DS1307 RTC-IC : De DS1307 RTC IC is een 8-pins chip die tijd en datum bijhoudt met behulp van het I2C-protocol. Het gebruikt zeer weinig stroom, minder dan 500 nA. Het kan de tijd weergeven in seconden, minuten en uren, en de datum in dagen, maanden en jaren. Het kan ook schakelen tussen 24-uurs- en 12-uursformaten.

24C32 EEPROM-IC : De 24C32 EEPROM IC is een 32-byte chip van Atmel die de instellingen, tijd en datum opslaat. Het maakt ook gebruik van het I2C-protocol.

32,768 kHz kristal : De kristaloscillator van 32,768 kHz levert de klokfrequentie voor de DS1307 RTC IC.

Batterijhouder : In de batterijhouder past een CR2032-batterij. Het is een 3V lithium knoopcel. Het levert continu vermogen aan de DS1307 RTC IC.

DS18B20 Sensorvoorziening : Met de DS18B20 sensorvoorziening kunt u de DS18B20 temperatuursensor solderen en gebruiken. Het is niet voorgesoldeerd. U kunt het through-hole-pakket solderen en de temperatuur verkrijgen via de DS-pin van de module.

De onderstaande lijst geeft enkele snelle specificaties van de DS1307 RTC-sensor:

  • Werkspanning: 4,5–5,5 V, typisch 5 V
  • Huidige consumptie : Minder dan 1,5 mA
  • Nauwkeurigheid : 0–40 °C, afhankelijk van het kristal
  • Accu : CR2032 (3 V-munt)
  • Geheugen : 56 bytes niet-vluchtig RAM
  • Koppel : Tweedraads (I2C) seriële interface
  • Uitvoer : 1 Hz uitgangspen
  • Programmeerbare blokgolfuitgang : Verbruikt minder dan 500 nA in de batterij-back-upmodus
  • Detectie van stroomstoringen : Automatische stroomuitvaldetectie en schakelcircuits
  • Power-sense-circuit : Het kan automatisch overschakelen naar een back-upvoorziening bij stroomtekort
  • Schrikkeljaarcompensatie : Geldig tot het jaar 2100

Pin-out van RTC DS1307-module

De module heeft meerdere pinnen met verschillende functies.

  • VCC is de pin die een gelijkspanning tussen 3,3V en 5,5V nodig heeft om de module van stroom te voorzien.
  • GND is de pin voor laagspanning of aarde.
  • SDA En SCL zijn de pinnen die gegevens en kloksignalen communiceren via de I2C-bus.
  • DS is de pin die de temperatuur meet met de DS1307-sensor als je die op de RTC-module hebt.
  • SQ is de pin die een blokgolfsignaal genereert met een frequentie van 1 Hz, 4 kHz, 8 kHz of 32 kHz, afhankelijk van hoe je het programmeert.
  • EEN is de pin die een 3V-batterij gebruikt om de tijd nauwkeurig te houden wanneer de hoofdstroom is uitgeschakeld.

2. Hoe RTC DS1307 en OLED-display te koppelen met ESP32

Om ESP32 te koppelen aan DS1307 en OLED-display, kunt u de ingebouwde I2C-pinnen van het ESP32-bord gebruiken. Zowel de DS1307 als het OLED-display zijn op I2C gebaseerde apparaten. Kan vervolgens communiceren met behulp van het I2C master-slave-protocol via de I2C-bus.

Voordat we overgaan tot de interface van ESP32 met DS1307 en OLED-display, moet je eerst enkele vereiste bibliotheken installeren.

De vereiste bibliotheken installeren

Je hebt twee bibliotheken nodig, één voor de RTC-module en één voor het OLED-display. Door OLED met een RTC-module te gebruiken, kunt u verbluffende en interactieve klokvoorbeelden maken. Als u geen plan heeft om de tijd op het scherm weer te geven, kunt u deze bibliotheekinstallatie overslaan.

Hieronder volgen de twee bibliotheken die u nodig heeft:

  • RTClib (door Adafruit) is een Arduino IDE-bibliotheek om de tijd van een RTC in te stellen en op te halen. Het biedt ook lessen voor het manipuleren van datums, tijden en duur. Met behulp van deze bibliotheek kunt u de real-time klokmodules (RTC), zoals DS1307 en DS3231, koppelen en programmeren.
  • S SD1306 (door Adafruit) is een bibliotheek voor Arduino, waarmee u de OLED-displays kunt koppelen en programmeren met Arduino of een ander microcontrollerbord.

Om beide bibliotheken in Arduino IDE te downloaden en te installeren, opent u eerst het Bibliotheekbeheerder zoek naar de RTClib-bibliotheek en klik Installeren :

U krijgt de optie om alleen de bibliotheek of de afhankelijkheden ervan te installeren. Klik op de Installeer alles om de bibliotheek volledig te installeren. Op deze manier krijgt u geen foutmelding als u de code wijzigt, afhankelijk van de afhankelijkheden van deze bibliotheek.

Zoek op dezelfde manier naar de SSD1306-bibliotheek. Deze bibliotheek is nodig voor een OLED-display. Klik Installeren verder gaan.

Deze keer krijgt u ook hetzelfde bevestigingsbericht. Klik op de Installeer alles keuze.

Nu zijn beide bibliotheken voor OLED en DS1307 geïnstalleerd en klaar voor gebruik. Maar zoek eerst eerst het I2C-adres voor het OLED-display.

3. Het I2C-adres van het OLED-scherm vinden

Het I2C-adres is een unieke identificatie voor elk apparaat op de I2C-bus. Hiermee kan het masterapparaat communiceren met een specifiek slave-apparaat door gegevens naar zijn adres te verzenden. Het doel van het I2C-adres is om conflicten en verwarring tussen meerdere apparaten op dezelfde bus te voorkomen.

Om het adres van een I2C-apparaat te achterhalen, kunt u een eenvoudige schets die de bus scant en de adressen afdrukt van de apparaten die het vindt. Als alternatief kunt u het gegevensblad van het apparaat raadplegen om het standaard- of configureerbare adres te zien.

Hier in ons geval wordt na het uitvoeren van de I2C-scannercode het volgende I2C-adres van het OLED-scherm weergegeven op de Arduino IDE-terminal.

Meestal is de kans groot dat u hetzelfde krijgt 0x3C adres voor uw OLED-scherm.

4. Interface van de OLED- en RTC DS1307-module met ESP32

1. Sluit de SDA- en SCL-pinnen van zowel de DS1307-module als de OLED-display op de I2C-pinnen van ESP32. Gebruikelijk, dit zijn GPIO 21 en GPIO 22 , maar u kunt indien nodig ook andere pinnen in de code toewijzen.

2. Sluit zowel de VCC als de GND van DS1307 en het OLED-display aan op de 3,3V- en GND-pinnen van ESP32.

3. Plaats een CR2032-knoopcelbatterij in de DS1307-module om back-upstroom te leveren voor de realtime klok.

4. Upload de voorbeeldcode uit deze tutorial naar uw ESP32-bord. Wijzig de code voor aangepaste uitvoer.

Na het uploaden start een klok vanaf de ingestelde tijd en geeft de tijd weer op het OLED-scherm.

5. Schakelschema

Het schakelschema van ESP32 met DS1307 is eenvoudig, er hoeven slechts vier draden te worden aangesloten. Je kunt de I2C-draden SDA en SCL van zowel de OLED- als DS1307-sensoren inkorten. Op dezelfde manier kunnen, om beide sensoren van stroom te voorzien, de 3V3- en GND-pin van het ESP32-bord worden gebruikt. Indien nodig kunt u ook stroom uit een afzonderlijke bron halen.

Opmerking : Het is veilig om de RTC DS1307 van stroom te voorzien vanaf een 3,3V-pin van ESP32 als de stroomlimiet van ESP32 niet wordt overschreden. Maar als u veilig wilt zijn, kunt u een aparte voedingsbron voor de RTC-module gebruiken of de DS3231-sensor met laag vermogen proberen, waarvan het werkbereik tussen 3,3 en 5,5 VDC ligt.

De onderstaande afbeelding illustreert de verbinding van ESP32 met de RTC DS1307-sensor.

Op dezelfde manier kunt u, als u het OLED-scherm wilt aansluiten om de tijd weer te geven, dezelfde I2C-pinnen en de stroompinnen van het ESP32-bord gebruiken.

6. Coderen

Met behulp van onderstaande code stellen we de huidige datum en tijd in op de RTC. Nadat de tijd is ingesteld, geeft de code de tijd weer op de Arduino IDE-terminal. Voordat u de code uploadt, moet u deze bijwerken met uw huidige datum en tijd.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Week_days [ 7 ] [ 12 ] = { 'Zondag' , 'Maandag' , 'Dinsdag' , 'Woensdag' , 'Donderdag' , 'Vrijdag' , 'Zaterdag' } ;
ongeldige opstelling ( ) {
Serieel.begin ( 115200 ) ;
#ifndef ESP8266
terwijl ( ! Serieel ) ;
#stop als
als ( ! DS1307_RTC.begin ( ) ) {
Serieel.println ( 'Kon RTC niet vinden' ) ;
terwijl ( 1 ) ;
}
DS1307_RTC.aanpassen ( Datum Tijd ( F ( __DATUM__ ) , F ( __TIJD__ ) ) ) ;
}
lege lus ( ) {
DateTime nu = DS1307_RTC.nu ( ) ;
Serieel.afdruk ( nu.jaar ( ) , DEC ) ;
Serieel.afdruk ( '/' ) ;
Serieel.afdruk ( nu.maand ( ) , DEC ) ;
Serieel.afdruk ( '/' ) ;
Serieel.afdruk ( Nu dag ( ) , DEC ) ;
Serieel.afdruk ( '(' ) ;
Serieel.afdruk ( Doordeweekse dagen [ nu.dagVanDeWeek ( ) ] ) ;
Serieel.afdruk ( ') ' ) ;
Serieel.afdruk ( nu.uur ( ) , DEC ) ;
Serieel.afdruk ( ':' ) ;
Serieel.afdruk ( nu.minuut ( ) , DEC ) ;
Serieel.afdruk ( ':' ) ;
Serieel.afdruk ( nu.tweede ( ) , DEC ) ;
Serieel.println ( ) ;
vertraging ( 1000 ) ;
}

Deze code maakt gebruik van de RTClib-bibliotheek om te communiceren met een DS1307 real-time klokmodule die de datum en tijd bijhoudt.

De opgericht functie begon met het initialiseren van de baudrate. Daarna hebben we in deze sectie de functie gedefinieerd om de datum en tijd van de computer te synchroniseren met de DS1307-sensor. Hierdoor wordt het tijdstip van de codecompilatie naar de RTC-sensor geüpload.

U kunt gebruik maken van de lus functie om de datum en tijd van RTC op te halen. Vervolgens kunt u het als volgt op de seriële monitor weergeven: jaar/maand/dag (dag van de week) uur:minuut:seconde. Vergeet niet om na elke lus een vertraging van één seconde toe te voegen, zodat de code niet te snel wordt uitgevoerd.

Geef de huidige tijd weer op het OLED-display

Om dezelfde tijd op het OLED-scherm weer te geven, moeten we voor het OLED-scherm een ​​extra codegedeelte toevoegen. Upload eenvoudig de opgegeven code. Deze code geeft de huidige tijd weer op uw OLED-scherm.

Vergeet niet dat we hier de 0,96-inch 128×64 I2C SSD OLED-displaymodule gebruiken. Als u een ander formaat gebruikt, wijzigt u de code dienovereenkomstig. Controleer ook het I2C-adres en wijzig het in de gegeven code. In ons geval hebben we een I2C-adres 0x3C voor het OLED-scherm.

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

Adafruit_SSD1306-scherm ( SCREEN_WIDTH, SCREEN_HEIGHT, & Draad, - 1 ) ;
RTC_DS1307 RTC;
char dagen [ 7 ] [ 12 ] = { 'Zondag' , 'Maandag' , 'Dinsdag' , 'Woensdag' , 'Donderdag' , 'Vrijdag' , 'Zaterdag' } ;
ongeldige opstelling ( ) {
Serieel.begin ( 115200 ) ;
als ( ! RTC.begin ( ) ) {
Serieel.println ( 'Kon RTC niet vinden' ) ;
terwijl ( 1 ) ;
}
RTC.aanpassen ( Datum Tijd ( F ( __DATUM__ ) , F ( __TIJD__ ) ) ) ;
als ( ! weergave.begin ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serieel.println ( F ( 'Toewijzing SSD1306 mislukt' ) ) ;
voor ( ;; ) ;
}
vertraging ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( WIT ) ;
display.setCursor ( 30 , twintig ) ;
display.println ( 'Linux' ) ;
weergeven.weergeven ( ) ;
vertraging ( 3000 ) ;
display.clearDisplay ( ) ;
}
lege lus ( ) {
DateTime nu = RTC.nu ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
weergeven.print ( Nu dag ( ) ) ;
weergeven.print ( '/' ) ;
weergeven.print ( nu.maand ( ) ) ;
weergeven.print ( '/' ) ;
weergeven.print ( nu.jaar ( ) ) ;
display.println ( dagen [ nu.dagVanDeWeek ( ) ] ) ;
display.println ( '' ) ;
display.setCursor ( 0 , 40 ) ;
als ( nu.uur ( ) < 10 )
weergeven.print ( '0' ) ;
weergeven.print ( nu.uur ( ) ) ;
weergeven.print ( ':' ) ;
als ( nu.minuut ( ) < 10 )
weergeven.print ( '0' ) ;
weergeven.print ( nu.minuut ( ) ) ;
weergeven.print ( ':' ) ;
als ( nu.tweede ( ) < 10 )
weergeven.print ( '0' ) ;
display.println ( nu.tweede ( ) ) ;
weergeven.weergeven ( ) ;
}

De code begon met de bibliotheken die we voor de RTC en het display hadden geïnstalleerd. Daarna definieert het de schermgrootte en het weergaveadres. Het initialiseert de array met weekdagnamen.

De opgericht een deel begint met seriële communicatie. Het controleert of de RTC en het display werken of niet. Daarna hebben we een tekenreekstekst “Linuxhint” gedefinieerd die gedurende 3 seconden wordt weergegeven. Dit is alleen een openings- of opstartbericht. U kunt dit bericht ook wijzigen met uw eigen tekst.

De lus functie haalt de datum en tijd van de DS1307-module op. Daarna wordt het scherm leeggemaakt en worden de datum en tijd op een geformatteerde manier afgedrukt. De code voegt ook voorloopnullen toe aan de uren, minuten en seconden, voor het geval hun waarden kleiner zijn dan 10.

7. Hardware

Nadat u de code naar het ESP32-bord heeft geüpload, ziet u de volgende uitvoer op het OLED-scherm. Voor de hardware hebben we gebruik gemaakt van het OLED-scherm en een I2C RTC DS1307-module. Er wordt een ESP32-bord met 30 pinnen gebruikt. Je kunt ook met elk ander ESP32-bord experimenteren, maar zorg ervoor dat je de I2C-pinnen correct aansluit.

Conclusie

De RTC DS1307 heeft een 56-byte SRAM met ondersteuning voor batterijback-up. Het is een 8-pins apparaat dat gebruik maakt van een I2C-communicatieprotocol. Om de DS1307 RTC-module te koppelen aan de ESP32, kunt u de I2C-pinnen (GPIO 22 (SCL) en GPIO 21 (SDA)) van het ESP32-bord gebruiken. U kunt de tijd afdrukken op een Arduino IDE-console of elk scherm zoals OLED of I2C LCD gebruiken om de tijd weer te geven. De DS1307 RTC-module is een handig apparaat voor het bijhouden van tijd en datum in verschillende toepassingen. Enkele belangrijke toepassingen zijn dataloggers, digitale klokken en smartwatches.