Hoe u de DS3231 Real-Time Clock (RTC)-module gebruikt met een ESP32

Hoe U De Ds3231 Real Time Clock Rtc Module Gebruikt Met Een Esp32



ESP32 is een slim microcontrollerbord met ingebouwde Wi-Fi- en Bluetooth-mogelijkheden. ESP32 wordt geleverd met een interne RTC, maar de werking ervan is afhankelijk van stroom. Dus als u projecten of circuits wilt ontwerpen die u ook wilt laten draaien als er geen stroom is, moet u een externe RTC-module zoals DS1307 of DS3231 gebruiken.

We hebben er al een tutorial over gemaakt DS1307-interface met de ESP32-module . Vandaag bespreken we de basisprincipes van de DS3231 RTC-sensor en bekijken we hoe deze kan worden gekoppeld aan het ESP32-bord.

Inhoudsopgave:







1. Wat is de DS3231 RTC-module



2. Hoe DS3231 te koppelen met ESP32



3. Hardware





4. Coderen

5. Uitgang



6. Hoe de RTC DS3231-tijd op een OLED-scherm kan worden weergegeven met behulp van ESP32

Conclusie

1. Wat is de DS3231 RTC-module

De DS3231-module zorgt voor een uiterst nauwkeurige tijdwaarneming. Het bevat een geïntegreerde temperatuurgecompenseerde kristaloscillator (TCXO) die ons met grote precisie de tijd geeft. De module werkt op het I2C-protocol met behulp van de Master-Slave-configuratie. Het kan de tijd en datum bijhouden met een reservebatterij, zelfs als er geen netvoeding is. Het wordt vaak gebruikt in apparaten die tijd- en datumafhankelijk zijn.

De DS3231 houdt seconden, minuten en uren bij. Het kan ook datums en weekdagen bijhouden. Als het om schrikkeljaren gaat, wordt de tijd automatisch dienovereenkomstig aangepast. Het kan ook de tijd weergeven in zowel 12-uurs- als 24-uursnotatie, compleet met een AM/PM-indicator.

1.1. DS3231 versus DS1307

Zowel DS3231 als DS1307 zijn tijdregistratiemodules met ondersteuning voor batterijback-up. De DS3231 is echter nauwkeuriger dan de DS1307. De belangrijkste reden is dat DS1307 voor tijdwaarneming afhankelijk is van een extern 32 kHz-kristal.

De RTC DS3231 beschikt echter over een interne temperatuurgecompenseerde kristaloscillator (TCXO). Hierdoor wordt hij minder beïnvloed door de buitentemperatuur en heeft hij daardoor een nauwkeurigheidsvoordeel van enkele minuten per jaar dan de DS1307.

1.2. DS3231 Pin-out

DS3231 werkt met behulp van het I2C-protocol. De kern van deze RTC-module wordt gevormd door de nauwkeurige RTC-chip, ontworpen door Maxim. Deze chip verwerkt alle tijdfuncties en communiceert via de I2C met ESP32 of Arduino-bord.

De hoofdpinnen van RTC DS3231-modules zijn:

  • VCC: Sluit deze pin aan op de positieve pool van uw stroombron.
  • GND: Grond connectie.
  • SDA: Seriële datapin (gebruikt voor I2C-communicatie).
  • SCL: Seriële klokpin (ook onderdeel van de I2C-interface).
  • Vraag: Blokgolfuitgangspin (kan een periodiek signaal genereren, bijvoorbeeld voor alarmen of andere timingdoeleinden).
  • 32K: 32 kHz oscillatoruitgang (handig voor nauwkeurige timingtoepassingen).

Hieronder volgen de belangrijkste ingebouwde componenten van de RTC DS3231-module:

  • Batterijhouder: Hierdoor kan de module blijven werken als de externe voeding afwezig is.
  • RTC-chip: Deze chip houdt de tijd en datum bij.
  • AT24C32 EEPROM: Het biedt niet-vluchtige opslag voor datalogging en andere doeleinden met 1.000.000 schrijfcycli.
  • TCXO: Temperatuurgecompenseerde oscillator die de juiste tijd levert voor een variërend temperatuurbereik.
  • Temperatuursensor: Het neemt temperatuurmetingen op en levert deze als onderdeel van de functie van de module.

2. Hoe DS3231 te koppelen aan ESP32

Om DS3231 met ESP32 te koppelen, moet u de RTClib-bibliotheek Eerst. Na het installeren van deze Adafruit RTC-bibliotheek kunt u uw ESP32-bord verbinden met DS3231 met behulp van het I2C-protocol. Om ESP32 I2C te verbinden met de RTC DS3231-module, kunt u de ESP32 D21- en D22-pinnen gebruiken.

2.1. Bedradingsschema van ESP32 met RTC DS3231

Eerst moet u de ESP32 aansluiten op uw I2C RTC DS3231-module. Volg de hieronder gegeven pinconfiguratie voor bedrading:

Nadat u de ESP32 met RTC DS3231 hebt verbonden, zou uw bedradingsschema er als volgt uit moeten zien. U kunt de DS3231 ook van stroom voorzien via de VIN-pin van ESP32. De bedrijfsspanningen van DS3231 zijn 3,3 tot 5,5 VDC.

2.2. De vereiste bibliotheken installeren

Zodra het circuit klaar is, is de volgende stap: configureer uw ESP32-bord met Arduino IDE . Voor het koppelen van DS3231 moet u de RTClib-bibliotheek . Je kunt het installeren met behulp van de Arduino IDE-bibliotheekmanager.

3. Hardware

Voor het ontwerpen van de op DS3231 gebaseerde RTC-klok met ESP32 hebt u de volgende hardware nodig:

  • ESP32 ontwikkelbord
  • RTC DS3231-module
  • CR2032-batterij
  • Jumperdraden
  • Broodplank

4. Coderen

Na het installeren van de RTC-bibliotheek is het volgende deel het schrijven van de code voor DS3231 en het uploaden ervan naar het ESP32-bord. Eerst moet u de code schrijven om uw huidige tijd in te stellen. Nadat u de tijd in DS3231 hebt ingesteld, onthoudt deze de tijd en blijft deze draaien, zelfs als uw ESP32-bord wordt uitgeschakeld.

Open nu de Arduino IDE, compileer en brand de code op het ESP32-bord.

#include
#include

RTC_DS3231 rtc ; // Initialiseer een exemplaar van de klasse RTC_DS3231

leegte opgericht ( ) {
Serieel. beginnen ( 115200 ) ;
Draad. beginnen ( ) ;

als ( ! rtc. beginnen ( ) ) {
Serieel. println ( 'RTC niet gedetecteerd' ) ;
terwijl ( 1 ) ; // Blijft voor onbepaalde tijd hangen als RTC niet wordt gevonden
}

// Verwijder commentaar op de onderstaande regel om de initiële datum en tijd in te stellen
//rtc.adjust(DatumTijd(__DATUM__, __TIJD__));
}

leegte lus ( ) {
// Lees de huidige tijd van de sensor (DS3231)
DateTime nu = rtc. nu ( ) ;

// Druk de datum en tijd af op dezelfde regel met twee cijfers voor uren, minuten en seconden
Serieel. afdrukken ( 'Huidige datum: ' ) ;
Serieel. afdrukken ( nu. jaar ( ) , DEC ) ;
Serieel. afdrukken ( '/' ) ;
printTweecijfers ( nu. maand ( ) ) ;
Serieel. afdrukken ( '/' ) ;
printTweecijfers ( nu. dag ( ) ) ;
Serieel. afdrukken ( ' Huidige tijd: ' ) ;
printTweecijfers ( nu. uur ( ) ) ;
Serieel. afdrukken ( teken ) ;
printTweecijfers ( nu. minuut ( ) ) ;
Serieel. afdrukken ( teken ) ;
printTweecijfers ( nu. seconde ( ) ) ;
Serieel. println ( ) ;

vertraging ( 1000 ) ; // Update elke seconde
}

leegte printTweecijfers ( int nummer ) {
als ( nummer < 10 ) {
Serieel. afdrukken ( '0' ) ; // Voeg een voorloopnul toe voor getallen die uit één cijfer bestaan
}
Serieel. afdrukken ( nummer ) ;
}

4.1. Code-uitleg

De code begint met het initialiseren van de seriële I2C-communicatie met behulp van een draadbibliotheek. Daarna hebben we de RTC-bibliotheek van Adafruit toegevoegd voor interface met de DS3231-module. Deze bibliotheek biedt een functie voor interactie met de RTC DS3231-module.

In de opgericht onderdeel wordt de I2C-bus gestart en gecontroleerd op de beschikbare I2C-apparaten. Als het programma niet wordt gevonden, blijft het voor onbepaalde tijd hangen. De baudrate is ook gedefinieerd, zodat u de uitvoer op de Arduino IDE seriële monitor kunt controleren.

De klok voor de eerste keer instellen

Bij het programmeren van de DS3231 moet u dat wel doen verwijder commentaar op deze regel . Hiermee wordt uw systeemtijd opgehaald en opgeslagen in het RTC-geheugen. Door dit te doen, wordt de klok van de RTC-module gesynchroniseerd met uw systeemklok.

//rtc.adjust(DatumTijd(__DATUM__, __TIJD__));

Nadat de tijd is ingesteld, moet u de bovenstaande code opnieuw uploaden, maar deze keer moet u dat wel doen geef commentaar op de functieregel rtc.adjust(). . Anders wordt uw eerder ingestelde tijd overschreven en wanneer uw ESP32 wordt uitgeschakeld, start de RTC opnieuw vanaf het moment dat u de code heeft geüpload.

Door dit te doen blijft uw tijd aanwezig op de achtergrond van de RTC-module zolang de RTC-module stroom krijgt in de CR2032-cel.

In de lus deel, worden de huidige datum en tijd uit de DS3231-module gelezen met behulp van de functie rtc.now(). De datum- en tijdcomponenten worden geëxtraheerd en de geformatteerde datum wordt elke seconde afgedrukt op de Arduino IDE seriële monitor.

5. Uitgang

Nadat u de code naar het ESP32-bord heeft geüpload, ziet u dat de tijd begint af te drukken op de Arduino IDE seriële monitor.

6. Hoe de RTC DS3231-tijd op het OLED-scherm kan worden weergegeven met behulp van ESP32

Je kunt ook nog een stap verder gaan en de tijd weergeven op je OLED-scherm nadat je deze hebt uitgelezen vanaf de DS3231. Hiervoor moet u de Adafruit GFX SSD1306-bibliotheek in de Arduino-IDE.

Eenmaal geïnstalleerd, verbindt u de ESP32 met de OLED- en RTC-module in de volgende configuratie.

Nadat u uw sensor hebt aangesloten, ziet u dat het circuit er uitziet als het onderstaande schematische diagram.

Upload nu de volgende DS3231-code naar het ESP32-bord.

#include
#include
#include
#include 'RTClib.h'

RTC_DS3231 rtc ;

verkoold dagen [ 7 ] [ 12 ] = { 'Zondag' , 'Maandag' , 'Dinsdag' , 'Woensdag' , 'Donderdag' , 'Vrijdag' , 'Zaterdag' } ;

Adafruit_SSD1306-scherm = Adafruit_SSD1306 ( 128 , 64 , & Draad , - 1 ) ;

leegte opgericht ( ) {
Serieel. beginnen ( 115200 ) ;

weergave. beginnen ( SSD1306_SWITCHCAPVCC , 0x3C ) ;

als ( ! rtc. beginnen ( ) ) {
Serieel. println ( 'Kon RTC niet vinden! Controleer het circuit.' ) ;
terwijl ( 1 ) ;
}
//verwijder de onderstaande regel terwijl u de tijd voor de eerste keer instelt
//rtc.adjust(DatumTijd(__DATUM__, __TIJD__));
weergave. helderWeergave ( ) ;
weergave. setTekstKleur ( WIT ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( 0 , twintig ) ;
weergave. afdrukken ( 'RTC-KLOK' ) ;
weergave. weergave ( ) ;
vertraging ( 5000 ) ;
}

leegte lus ( ) {
DateTime nu = rtc. nu ( ) ;

weergave. helderWeergave ( ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( 75 , 0 ) ;
weergave. println ( nu. seconde ( ) , DEC ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( 25 , 0 ) ;
weergave. println ( teken ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( 65 , 0 ) ;
weergave. println ( teken ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( 40 , 0 ) ;
weergave. println ( nu. minuut ( ) , DEC ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( 0 , 0 ) ;
weergave. println ( nu. uur ( ) , DEC ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( 0 , 25 ) ;
weergave. println ( nu. dag ( ) , DEC ) ;
weergave. afdrukken ( dagen [ nu. dag van de week ( ) ] ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( twintig , 25 ) ;
weergave. println ( '-' ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( 35 , 25 ) ;
weergave. println ( nu. maand ( ) , DEC ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( 60 , 25 ) ;
weergave. println ( '-' ) ;
weergave. setTekstgrootte ( 2 ) ;
weergave. setCursor ( 75 , 25 ) ;
weergave. println ( nu. jaar ( ) , DEC ) ;
weergave. weergave ( ) ;
}

Code-uitleg

De code begon met enkele belangrijke bibliotheken die nodig zijn voor RTC- en OLED-schermen. Het OLED-display is ingesteld met behulp van de Adafruit SSD1306-bibliotheek.

In het lusgedeelte worden de huidige datum en tijd verkregen met behulp van rtc.now(). Daarna wordt het OLED-scherm gewist en worden de tijdcomponenten weergegeven in een digitaal klokformaat. U kunt de code ook wijzigen om de datum- en tijdnotatie aan te passen.

Zodra de code naar je bord is geüpload, krijg je de huidige tijd op het OLED-scherm te zien.

Opmerking: De bovenstaande code gebruikt de 0x3C I2C-adres voor OLED. Dit is het meest voorkomende I2C-adres dat beschikbaar is op SSD1306 OLED-schermen. Als u het I2C-adres voor uw OLED-scherm wilt vinden, kunt u de opdracht uitvoeren I2C-scannercode .

Conclusie

DS3231 is een RTC-sensor die kan worden gebruikt voor tijdwaarneming. Het heeft een batterijback-up die de tijd nauwkeurig kan houden, zelfs als uw microcontrollerbord is uitgeschakeld. Om ESP2 met DS3231 te koppelen, moet u de RTClib-bibliotheek in uw Arduino IDE installeren. Daarna moet u de RTC-module aansluiten via het I2C-protocol met behulp van de digitale pin van ESP32. Eenmaal verbonden, uploadt u eenvoudig de code en past u de tijd aan. Nu houdt de RTC-sensor de tijd bij en kunt u deze aflezen op uw seriële monitor bij op ontwerptijd gebaseerde projecten.