Come utilizzare il modulo orologio in tempo reale (RTC) DS3231 con un ESP32

Come Utilizzare Il Modulo Orologio In Tempo Reale Rtc Ds3231 Con Un Esp32



ESP32 è una scheda microcontrollore intelligente con funzionalità Wi-Fi e Bluetooth integrate. ESP32 viene fornito con un RTC interno, ma il suo funzionamento dipende dall'alimentazione. Quindi, se vuoi realizzare progetti o circuiti che desideri eseguire anche in assenza di alimentazione, devi utilizzare qualsiasi modulo RTC esterno come DS1307 o DS3231.

Abbiamo già fatto un tutorial su DS1307 che si interfaccia con il modulo ESP32 . Oggi discuteremo le basi del sensore RTC DS3231 e vedremo come interfacciarlo con la scheda ESP32.

Sommario:







1. Cos'è il modulo RTC DS3231



2. Come interfacciare DS3231 con ESP32



3. Ferramenta





4. Codice

5. Uscita



6. Come visualizzare l'ora RTC DS3231 su uno schermo OLED utilizzando ESP32

Conclusione

1. Cos'è il modulo RTC DS3231

Il modulo DS3231 fornisce un cronometraggio estremamente accurato. Include un oscillatore a cristallo integrato con compensazione della temperatura (TCXO) per fornirci l'ora con grande precisione. Il modulo funziona con il protocollo I2C utilizzando la configurazione Master-Slave. Può mantenere l'ora e la data con una batteria di riserva anche quando non è presente l'alimentazione principale. È comunemente utilizzato nei dispositivi che dipendono dall'ora e dalla data.

Il DS3231 tiene sotto controllo secondi, minuti e ore. Può anche tenere un registro di date e giorni feriali. Quando si tratta di anni bisestili, regola automaticamente il tempo di conseguenza. Inoltre, può visualizzare l'ora sia nel formato 12 che 24 ore, completo di indicatore AM/PM.

1.1. DS3231 contro DS1307

Sia DS3231 che DS1307 sono moduli di cronometraggio con supporto della batteria di backup. Tuttavia, il DS3231 è più preciso del DS1307. Il motivo principale è che DS1307 dipende dal cristallo esterno da 32kHz per l'indicazione dell'ora.

Tuttavia, l'RTC DS3231 è dotato di un oscillatore a cristallo compensato in temperatura interno (TCXO). Ciò lo rende meno influenzato dalla temperatura esterna e, di conseguenza, ha un vantaggio in termini di precisione di alcuni minuti all'anno rispetto al DS1307.

1.2. Disposizione DS3231

DS3231 funziona utilizzando il protocollo I2C. Al centro di questo modulo RTC abbiamo l'accurato chip RTC progettato da Maxim. Questo chip gestisce tutte le funzioni temporali e comunica utilizzando l'I2C con la scheda ESP32 o Arduino.

I pin principali dei moduli RTC DS3231 sono:

  • CCV: Collega questo pin al terminale positivo della tua fonte di alimentazione.
  • TERRA: Collegamento a terra.
  • SDA: Pin dati seriali (utilizzato per la comunicazione I2C).
  • SCL: Pin dell'orologio seriale (anche parte dell'interfaccia I2C).
  • QW: Pin di uscita onda quadra (può generare un segnale periodico, ad esempio, per allarmi o altri scopi di temporizzazione).
  • 32K: Uscita oscillatore a 32 KHz (utile per applicazioni di timing precise).

Di seguito sono riportati i principali componenti di bordo del modulo RTC DS3231:

  • Portabatteria: Consente al modulo di continuare a funzionare quando l'alimentazione esterna è assente.
  • Chip RTC: Questo chip mantiene l'ora e la data.
  • EEPROM AT24C32: Fornisce archiviazione non volatile per la registrazione dei dati e altri scopi con 1.000.000 di cicli di scrittura.
  • TCXO: Oscillatore compensato in temperatura per fornire l'ora corretta per un intervallo variabile di temperature.
  • Termometro: Prende le letture della temperatura e le fornisce come parte delle funzionalità del modulo.

2. Come interfacciare DS3231 con ESP32

Per interfacciare DS3231 con ESP32, è necessario installare il Libreria RTClib Primo. Dopo aver installato questa libreria RTC Adafruit, puoi connettere la tua scheda ESP32 con DS3231 utilizzando il protocollo I2C. Per connettere ESP32 I2C con il modulo RTC DS3231, è possibile utilizzare i pin ESP32 D21 e D22.

2.1. Schema elettrico di ESP32 con RTC DS3231

Innanzitutto, devi collegare l'ESP32 con il modulo I2C RTC DS3231. Seguire la configurazione dei pin indicata di seguito per il cablaggio:

Dopo aver collegato l'ESP32 con RTC DS3231, lo schema elettrico dovrebbe assomigliare a questo. Puoi anche alimentare il DS3231 dal pin VIN dell'ESP32. Le tensioni operative del DS3231 sono comprese tra 3,3 e 5,5 V CC.

2.2. Installazione delle librerie richieste

Una volta che il circuito è pronto, il passo successivo è farlo configura la tua scheda ESP32 con l'IDE Arduino . Per interfacciare DS3231, sarà necessario installare il file Libreria RTClib . Puoi installarlo utilizzando il gestore della libreria IDE di Arduino.

3. Ferramenta

Avrai bisogno del seguente hardware per progettare l'orologio RTC basato su DS3231 con ESP32:

  • Scheda di sviluppo ESP32
  • Modulo RTC DS3231
  • Batteria CR2032
  • Cavi di collegamento
  • Tagliere

4. Codice

Dopo aver installato la libreria RTC, la parte successiva è scrivere il codice per DS3231 e caricarlo sulla scheda ESP32. Innanzitutto, devi scrivere il codice per impostare l'ora corrente. Dopo aver impostato l'ora in DS3231, ricorderà l'ora e continuerà a funzionare anche se la scheda ESP32 viene spenta.

Ora apri l'IDE Arduino, compila e masterizza il codice sulla scheda ESP32.

#include
#include

RTC_DS3231 rtc ; // Inizializza un'istanza della classe RTC_DS3231

vuoto impostare ( ) {
Seriale. inizio ( 115200 ) ;
Filo. inizio ( ) ;

Se ( ! rtc. inizio ( ) ) {
Seriale. println ( 'RTC non rilevato' ) ;
Mentre ( 1 ) ; // Si blocca a tempo indeterminato se RTC non viene trovato
}

//Decommenta la riga seguente per impostare la data e l'ora iniziali
//rtc.adjust(DateTime(__DATE__, __TIME__));
}

vuoto ciclo continuo ( ) {
// Legge l'ora corrente dal sensore (DS3231)
DateTime ora = rtc. Ora ( ) ;

// Stampa la data e l'ora sulla stessa riga con due cifre per ore, minuti e secondi
Seriale. stampa ( 'Data odierna: ' ) ;
Seriale. stampa ( Ora. anno ( ) , DIC ) ;
Seriale. stampa ( '/' ) ;
printDueCifre ( Ora. mese ( ) ) ;
Seriale. stampa ( '/' ) ;
printDueCifre ( Ora. giorno ( ) ) ;
Seriale. stampa ( ' Ora attuale: ' ) ;
printDueCifre ( Ora. ora ( ) ) ;
Seriale. stampa ( ':' ) ;
printDueCifre ( Ora. minuto ( ) ) ;
Seriale. stampa ( ':' ) ;
printDueCifre ( Ora. secondo ( ) ) ;
Seriale. println ( ) ;

ritardo ( 1000 ) ; // Aggiorna ogni 1 secondo
}

vuoto printDueCifre ( int numero ) {
Se ( numero < 10 ) {
Seriale. stampa ( '0' ) ; // Aggiunge uno zero iniziale per i numeri a una cifra
}
Seriale. stampa ( numero ) ;
}

4.1. Spiegazione del codice

Il codice inizia inizializzando la comunicazione seriale I2C con l'aiuto di una libreria wire. Successivamente abbiamo incluso la libreria RTC di Adafruit per l'interfacciamento con il modulo DS3231. Questa libreria fornisce una funzione per interagire con il modulo RTC DS3231.

Nel impostare parte, il bus I2C viene avviato e vengono controllati i dispositivi I2C disponibili. Se non viene trovato, il programma si blocca a tempo indeterminato. Viene definita anche la velocità di trasmissione in modo da poter controllare l'output sul monitor seriale IDE di Arduino.

Impostazione dell'orologio per la prima volta

Quando si programma il DS3231, è necessario farlo decommenta questa riga . Questo otterrà l'ora del tuo sistema e la memorizzerà nella memoria RTC. In questo modo, l'orologio del modulo RTC viene sincronizzato con l'orologio del sistema.

//rtc.adjust(DateTime(__DATE__, __TIME__));

Dopo aver impostato l'ora devi ricaricare il codice sopra, ma questa volta devi farlo commentare la riga della funzione rtc.adjust() . Altrimenti, questo sovrascriverà l'orario impostato in precedenza e quando il tuo ESP32 sarà spento, l'RTC ricomincerà dal momento in cui hai caricato il codice.

In questo modo, il tuo tempo rimarrà presente sullo sfondo del modulo RTC finché il modulo RTC sarà alimentato nella sua cella CR2032.

Nel ciclo continuo parte, la data e l'ora correnti vengono lette dal modulo DS3231 utilizzando la funzione rtc.now(). I componenti di data e ora vengono estratti e la data formattata viene stampata sul monitor seriale IDE di Arduino ogni secondo.

5. Uscita

Dopo aver caricato il codice sulla scheda ESP32, vedrai che l'ora inizierà a essere stampata sul monitor seriale IDE Arduino.

6. Come visualizzare l'ora RTC DS3231 sullo schermo OLED utilizzando ESP32

Puoi anche fare un ulteriore passo avanti e visualizzare l'ora sullo schermo OLED dopo averla letta da DS3231. Per questo è necessario installare il file Libreria Adafruit GFX SSD1306 nell'IDE di Arduino.

Una volta installato, collega l'ESP32 al modulo OLED e RTC nella seguente configurazione.

Dopo aver collegato il sensore, vedrai il circuito assomigliare al diagramma schematico seguente.

Ora carica il seguente codice DS3231 sulla scheda ESP32.

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

RTC_DS3231 rtc ;

car giorni [ 7 ] [ 12 ] = { 'Domenica' , 'Lunedi' , 'Martedì' , 'Mercoledì' , 'Giovedì' , 'Venerdì' , 'Sabato' } ;

Display Adafruit_SSD1306 = Adafruit_SSD1306 ( 128 , 64 , & Filo , - 1 ) ;

vuoto impostare ( ) {
Seriale. inizio ( 115200 ) ;

Schermo. inizio ( SSD1306_SWITCHCAPVCC , 0x3C ) ;

Se ( ! rtc. inizio ( ) ) {
Seriale. println ( 'Impossibile trovare l'RTC! Controllare il circuito.' ) ;
Mentre ( 1 ) ;
}
//Decommenta la riga sottostante durante l'impostazione dell'ora per la prima volta
//rtc.adjust(DateTime(__DATE__, __TIME__));
Schermo. clearDisplay ( ) ;
Schermo. setTextColor ( BIANCO ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( 0 , venti ) ;
Schermo. stampa ( 'OROLOGIO RTC' ) ;
Schermo. Schermo ( ) ;
ritardo ( 5000 ) ;
}

vuoto ciclo continuo ( ) {
DateTime ora = rtc. Ora ( ) ;

Schermo. clearDisplay ( ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( 75 , 0 ) ;
Schermo. println ( Ora. secondo ( ) , DIC ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( 25 , 0 ) ;
Schermo. println ( ':' ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( 65 , 0 ) ;
Schermo. println ( ':' ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( 40 , 0 ) ;
Schermo. println ( Ora. minuto ( ) , DIC ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( 0 , 0 ) ;
Schermo. println ( Ora. ora ( ) , DIC ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( 0 , 25 ) ;
Schermo. println ( Ora. giorno ( ) , DIC ) ;
Schermo. stampa ( giorni [ Ora. giorno della settimana ( ) ] ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( venti , 25 ) ;
Schermo. println ( '-' ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( 35 , 25 ) ;
Schermo. println ( Ora. mese ( ) , DIC ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( 60 , 25 ) ;
Schermo. println ( '-' ) ;
Schermo. setTextSize ( 2 ) ;
Schermo. setCursor ( 75 , 25 ) ;
Schermo. println ( Ora. anno ( ) , DIC ) ;
Schermo. Schermo ( ) ;
}

Spiegazione del codice

Il codice è iniziato con alcune importanti librerie richieste per gli schermi RTC e OLED. Il display OLED è configurato utilizzando la libreria Adafruit SSD1306.

Nella parte loop, la data e l'ora correnti vengono ottenute utilizzando rtc.now(). Successivamente, lo schermo OLED viene cancellato e i componenti dell'ora vengono visualizzati in formato orologio digitale. Puoi anche modificare il codice per regolare il formato della data e dell'ora.

Una volta caricato il codice sulla tua scheda, vedrai l'ora corrente sullo schermo OLED.

Nota: Il codice precedente utilizza il file 0x3C Indirizzo I2C per OLED. Questo è l'indirizzo I2C più comune disponibile sui display OLED SSD1306. Se desideri trovare l'indirizzo I2C per il tuo schermo OLED, puoi eseguire il file Codice scanner I2C .

Conclusione

DS3231 è un sensore RTC che può essere utilizzato per il cronometraggio. Ha una batteria di backup che può mantenere l'ora precisa anche se la scheda del microcontrollore è spenta. Per interfacciare ESP2 con DS3231, è necessario installare la libreria RTClib nel tuo IDE Arduino. Successivamente, devi collegare il modulo RTC tramite il protocollo I2C utilizzando il pin digitale di ESP32. Una volta connesso, carica semplicemente il codice e regola l'ora. Ora il sensore RTC manterrà il tempo e potrai leggerlo sul tuo monitor seriale nei progetti basati sul tempo di progettazione.