Orologio in tempo reale (RTC) ESP32 utilizzando DS1307 e display OLED

Orologio In Tempo Reale Rtc Esp32 Utilizzando Ds1307 E Display Oled



ESP32 viene fornito con un modulo RTC integrato, ma funziona solo quando c'è alimentazione. In caso di interruzione dell'alimentazione, l'orologio verrà reimpostato e non sarà in grado di mantenere l'ora corretta. Quindi, se vuoi tenere traccia del tempo o controllare qualsiasi dispositivo basato sul tempo, prova il sensore RTC DS1307. Tuttavia, potresti pensare di collegare una batteria di backup alla tua scheda ESP32, ma questo non è lo scenario migliore da fare in caso di carenza di energia. L'alternativa migliore è utilizzare il sensore DS1307, poiché viene fornito con una batteria integrata che può durare almeno un anno.

Per chiarire le cose, il Real-Time Clock (RTC) interno dell'ESP32 può tenere traccia del tempo anche quando il processore principale è spento o in modalità di sospensione profonda. Puoi utilizzare l'RTC ESP32 per tenere traccia del tempo senza consumare molta energia o influenzare il processore principale. Ma richiede comunque energia per funzionare, non molto, ma è necessaria una quantità minima di energia per il funzionamento dell'RTC interno.

Quindi, con questo, ci resta solo la soluzione di utilizzare il modulo RTC esterno. Diamo un'occhiata ai passaggi per interfacciare la scheda ESP32 con il modulo RTC DS1307.







Contenuti:

1. Cos'è il modulo RTC DS1307

DS1307 è un dispositivo a basso consumo in grado di tenere traccia con precisione di data e ora. Utilizza il formato decimale con codice binario (BCD). Può dirti l'ora in un formato dettagliato come secondi, minuti e persino ore e giorni. Puoi anche stampare la data nel formato completo come mese e anno. Sa anche quando è un anno bisestile, fino al 2100. Per comunicare con DS1307, è possibile utilizzare il protocollo I2C.





DS1307 ha una batteria integrata che può alimentarlo per circa un anno senza una fonte esterna da 5 V. Utilizzando questa batteria di backup, è possibile mantenere l'ora anche quando l'alimentazione principale è spenta. Dispone inoltre di 56 byte di SRAM per memorizzare alcuni dati. Il DS1307 è un dispositivo pratico che ha molte applicazioni se combinato con una scheda Arduino o ESP32. Ad esempio, questi dati possono essere utili nella registrazione dei dati, nei sistemi di allarme o nel controllo industriale. Se hai bisogno di un cronometraggio affidabile, il DS1307 è un'ottima opzione.





Specifiche del modulo RTC DS1307

Il modulo RTC DS1307 è costituito dall'IC RTC, una EEPROM, un oscillatore a cristallo e un supporto per batteria di backup.



Di seguito sono riportati i dettagli di queste parti:

Circuito integrato RTC DS1307 : L'IC RTC DS1307 è un chip a 8 pin che tiene traccia di ora e data utilizzando il protocollo I2C. Utilizza pochissima energia, meno di 500 nA. Può visualizzare l'ora in secondi, minuti e ore e la data in giorni, mesi e anni. Può anche passare dal formato 24 ore a quello 12 ore.

Circuito integrato EEPROM 24C32 : L'IC EEPROM 24C32 è un chip da 32 byte di Atmel che memorizza le impostazioni, l'ora e la data. Utilizza anche il protocollo I2C.

Cristallo 32.768kHz : L'oscillatore a cristallo da 32,768kHz fornisce la frequenza di clock per l'IC RTC DS1307.

Portabatteria : Il portabatteria contiene una batteria CR2032. È una cella a bottone al litio da 3 V. Fornisce alimentazione continua al CI RTC DS1307.

Fornitura sensore DS18B20 : La predisposizione del sensore DS18B20 consente di saldare e utilizzare il sensore di temperatura DS18B20. Non è pre-saldato. È possibile saldare il pacchetto a foro passante e ottenere la temperatura dal pin DS del modulo.

L'elenco seguente fornisce alcune specifiche rapide del sensore RTC DS1307:

  • Voltaggio operativo: 4,5–5,5 V, tipicamente 5 V
  • Consumo attuale : Meno di 1,5 mA
  • Precisione : 0–40 °C, dipende dal cristallo
  • Batteria : CR2032 (moneta da 3 V)
  • Memoria : 56 byte di RAM non volatile
  • Interfaccia : Interfaccia seriale a due fili (I2C).
  • Produzione : Pin di uscita da 1 Hz
  • Uscita onda quadra programmabile : Consuma meno di 500 nA in modalità batteria di riserva
  • Rilevamento interruzione di corrente : Rilevamento automatico delle interruzioni di corrente e circuiti di commutazione
  • Circuito di rilevamento della potenza : Può passare automaticamente al backup dell'alimentazione in caso di mancanza di energia
  • Compensazione anno bisestile : Valido fino all'anno 2100

Pinatura del modulo RTC DS1307

Il modulo ha diversi pin con funzioni diverse.

  • VCC è il pin che necessita di una tensione continua compresa tra 3,3 V e 5,5 V per alimentare il modulo.
  • GND è il pin per la bassa tensione o la terra.
  • SDA E SCL sono i pin che comunicano dati e segnali di clock attraverso il bus I2C.
  • DS è il pin che misura la temperatura con il sensore DS1307 se ne hai uno sul modulo RTC.
  • mq è il pin che genera un segnale ad onda quadra con una frequenza di 1 Hz, 4 kHz, 8 kHz o 32 kHz, a seconda di come lo programmi.
  • UNO è il pin che utilizza una batteria da 3 V per mantenere l'ora precisa quando l'alimentazione principale è spenta.

2. Come interfacciare RTC DS1307 e display OLED con ESP32

Per interfacciare ESP32 con DS1307 e display OLED, è possibile utilizzare i pin I2C integrati della scheda ESP32. Sia il DS1307 che il display OLED sono dispositivi basati su I2C. Quindi può comunicare utilizzando il protocollo master-slave I2C sul bus I2C.

Prima di passare all'interfacciamento di ESP32 con DS1307 e display OLED, è necessario installare alcune librerie richieste.

Installazione delle librerie richieste

Avrai bisogno di due librerie, una per il modulo RTC e una per il display OLED. Utilizzando OLED con un modulo RTC, puoi creare anteprime dell'orologio sorprendenti e interattive. Se non hai intenzione di visualizzare l'ora sullo schermo, puoi saltare l'installazione di questa libreria.

Di seguito sono riportate le due librerie di cui avrai bisogno:

  • RTClib (di Adafruit) è una libreria IDE di Arduino per impostare e ottenere l'ora da un RTC. Fornisce inoltre classi per la manipolazione di date, orari e durate. Utilizzando questa libreria è possibile interfacciare e programmare i moduli orologio in tempo reale (RTC), come DS1307 e DS3231.
  • S SD1306 (di Adafruit) è una libreria per Arduino, utilizzando la quale è possibile interfacciare e programmare i display OLED con Arduino o qualsiasi altra scheda microcontrollore.

Per scaricare e installare entrambe queste librerie nell'IDE Arduino, aprire prima il file Responsabile della Biblioteca cercare la libreria RTClib e fare clic su Installare :

Avrai la possibilità di installare solo la libreria o le sue dipendenze. Clicca il Installa tutto pulsante per installare completamente la libreria. In questo modo non riceverai alcun errore se modifichi il codice che dipende dalle dipendenze di questa libreria.

Allo stesso modo, cerca la libreria SSD1306. Questa libreria è necessaria per un display OLED. Clic Installare procedere.

Anche questa volta riceverai lo stesso messaggio di conferma. Clicca sul Installa tutto opzione.

Ora entrambe le librerie per OLED e DS1307 sono installate e pronte per l'uso. Ma prima, scopri l'indirizzo I2C per il display OLED.

3. Trovare l'indirizzo I2C del display OLED

L'indirizzo I2C è un identificatore univoco per ciascun dispositivo sul bus I2C. Consente al dispositivo master di comunicare con uno specifico dispositivo slave inviando dati al suo indirizzo. Lo scopo dell'indirizzo I2C è evitare conflitti e confusione tra più dispositivi sullo stesso bus.

Per ottenere l'indirizzo di un dispositivo I2C, puoi utilizzare a semplice sketch che scansiona l'autobus e stampa gli indirizzi dei dispositivi che trova. In alternativa, puoi controllare la scheda tecnica del dispositivo per vedere il suo indirizzo predefinito o configurabile.

Nel nostro caso, dopo aver eseguito il codice dello scanner I2C, sul terminale IDE di Arduino viene visualizzato il seguente indirizzo I2C dello schermo OLED.

Nella maggior parte dei casi, c'è un'alta probabilità che anche tu ottenga lo stesso 0x3C indirizzo per il tuo schermo OLED.

4. Interfacciamento del modulo OLED e RTC DS1307 con ESP32

1. Collegare i pin SDA e SCL sia del modulo DS1307 che del Display OLED ai pin I2C di ESP32. Generalmente, questi sono GPIO 21 e GPIO 22 , ma è possibile assegnare eventuali altri pin anche nel codice, se necessario.

2. Collegare sia VCC che GND di DS1307 e il display OLED ai pin 3,3 V e GND di ESP32.

3. Inserire una batteria a bottone CR2032 nel modulo DS1307 per fornire alimentazione di backup all'orologio in tempo reale.

4. Carica il codice di esempio da questo tutorial sulla tua scheda ESP32. Modifica il codice per gli output personalizzati.

Dopo il caricamento, un orologio partirà dall'ora impostata e visualizzerà l'ora sullo schermo OLED.

5. Schema elettrico

Lo schema elettrico dell'ESP32 con DS1307 è semplice, con solo quattro fili da collegare. È possibile accorciare i cavi I2C SDA e SCL di entrambi i sensori OLED e DS1307. Allo stesso modo, per alimentare entrambi questi sensori, è possibile utilizzare i pin 3V3 e GND della scheda ESP32. Se necessario, puoi anche alimentarlo da una fonte separata.

Nota : È sicuro alimentare l'RTC DS1307 da un pin da 3,3 V di ESP32 se il limite di corrente di ESP32 non viene superato. Ma se vuoi essere in un sito sicuro puoi utilizzare una fonte di alimentazione separata per il modulo RTC o provare il sensore DS3231 a basso consumo il cui range operativo è compreso tra 3,3 e 5,5 V CC.

L'immagine sotto illustra la connessione di ESP32 con il sensore RTC DS1307.

Allo stesso modo, se desideri collegare lo schermo OLED per visualizzare l'ora, puoi utilizzare gli stessi pin I2C e i pin di alimentazione della scheda ESP32.

6. Codice

Utilizzando il codice seguente, imposteremo la data e l'ora correnti sull'RTC. Dopo aver impostato l'ora, il codice visualizzerà l'ora sul terminale IDE di Arduino. Prima di caricare il codice, devi aggiornarlo con la data e l'ora attuali.

#include 'RTClib.h'
RTC_DS1307 DS1307_RTC;
char Giorni_settimana [ 7 ] [ 12 ] = { 'Domenica' , 'Lunedi' , 'Martedì' , 'Mercoledì' , 'Giovedì' , 'Venerdì' , 'Sabato' } ;
configurazione nulla ( ) {
Serial.begin ( 115200 ) ;
#ifndef ESP8266
Mentre ( ! Seriale ) ;
#finisci se
Se ( ! DS1307_RTC.begin ( ) ) {
Serial.println ( 'Impossibile trovare RTC' ) ;
Mentre ( 1 ) ;
}
DS1307_RTC.regola ( Appuntamento ( F ( __DATA__ ) , F ( __TEMPO__ ) ) ) ;
}
ciclo vuoto ( ) {
DateTime adesso = DS1307_RTC.now ( ) ;
Stampa.seriale ( adesso.anno ( ) , DIC ) ;
Stampa.seriale ( '/' ) ;
Stampa.seriale ( adesso.mese ( ) , DIC ) ;
Stampa.seriale ( '/' ) ;
Stampa.seriale ( oggigiorno ( ) , DIC ) ;
Stampa.seriale ( '(' ) ;
Stampa.seriale ( Giorni della settimana [ now.dayOfTheWeek ( ) ] ) ;
Stampa.seriale ( ')' ) ;
Stampa.seriale ( ora.ora ( ) , DIC ) ;
Stampa.seriale ( ':' ) ;
Stampa.seriale ( ora.minuto ( ) , DIC ) ;
Stampa.seriale ( ':' ) ;
Stampa.seriale ( ora.secondo ( ) , DIC ) ;
Serial.println ( ) ;
ritardo ( 1000 ) ;
}

Questo codice utilizza il Libreria RTClib per interfacciarsi con un modulo orologio in tempo reale DS1307 che tiene traccia della data e dell'ora.

IL impostare la funzione è iniziata con l'inizializzazione della velocità di trasmissione. Successivamente, all'interno di questa sezione, abbiamo definito la funzione per sincronizzare la data e l'ora del computer con il sensore DS1307. Questo caricherà l'ora di compilazione del codice sul sensore RTC.

Puoi usare il ciclo continuo funzione per ottenere la data e l'ora dall'RTC. Quindi è possibile visualizzarlo sul monitor seriale in questo modo: anno/mese/giorno (giorno della settimana) ora:minuto:secondo. Ricorda di aggiungere un ritardo di un secondo dopo ogni ciclo, in modo che il codice non venga eseguito troppo velocemente.

Visualizza l'ora corrente sul display OLED

Per visualizzare la stessa ora sullo schermo OLED, dobbiamo aggiungere una parte di codice aggiuntiva per lo schermo OLED. Carica semplicemente il codice indicato. Questo codice visualizzerà l'ora corrente sullo schermo OLED.

Ricorda, qui utilizziamo il modulo display OLED SSD I2C 128×64 da 0,96 pollici. Se utilizzi qualsiasi altra dimensione, modifica il codice di conseguenza. Inoltre, controlla l'indirizzo I2C e modificalo nel codice fornito. Nel nostro caso abbiamo un indirizzo I2C 0x3C per lo schermo OLED.

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

Display Adafruit_SSD1306 ( LARGHEZZA_SCHERMO, ALTEZZA_SCHERMO, & Filo, - 1 ) ;
RTC_DS1307 RTC;
giorni di salmerino [ 7 ] [ 12 ] = { 'Domenica' , 'Lunedi' , 'Martedì' , 'Mercoledì' , 'Giovedì' , 'Venerdì' , 'Sabato' } ;
configurazione nulla ( ) {
Serial.begin ( 115200 ) ;
Se ( ! RTC.begin ( ) ) {
Serial.println ( 'Impossibile trovare RTC' ) ;
Mentre ( 1 ) ;
}
Regolazione.RTC ( Appuntamento ( F ( __DATA__ ) , F ( __TEMPO__ ) ) ) ;
Se ( ! display.begin ( SSD1306_SWITCHCAPVCC, 0x3C ) ) {
Serial.println ( F ( 'Allocazione SSD1306 non riuscita' ) ) ;
per ( ;; ) ;
}
ritardo ( 1000 ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setTextColor ( BIANCO ) ;
display.setCursor ( 30 , venti ) ;
display.println ( 'Linux' ) ;
display.display ( ) ;
ritardo ( 3000 ) ;
display.clearDisplay ( ) ;
}
ciclo vuoto ( ) {
DateTime adesso = RTC.now ( ) ;
display.clearDisplay ( ) ;
display.setTextSize ( 2 ) ;
display.setCursor ( 0 , 0 ) ;
visualizza.stampa ( oggigiorno ( ) ) ;
visualizza.stampa ( '/' ) ;
visualizza.stampa ( adesso.mese ( ) ) ;
visualizza.stampa ( '/' ) ;
visualizza.stampa ( adesso.anno ( ) ) ;
display.println ( giorni [ now.dayOfTheWeek ( ) ] ) ;
display.println ( ' ' ) ;
display.setCursor ( 0 , 40 ) ;
Se ( ora.ora ( ) < 10 )
visualizza.stampa ( '0' ) ;
visualizza.stampa ( ora.ora ( ) ) ;
visualizza.stampa ( ':' ) ;
Se ( ora.minuto ( ) < 10 )
visualizza.stampa ( '0' ) ;
visualizza.stampa ( ora.minuto ( ) ) ;
visualizza.stampa ( ':' ) ;
Se ( ora.secondo ( ) < 10 )
visualizza.stampa ( '0' ) ;
display.println ( ora.secondo ( ) ) ;
display.display ( ) ;
}

Il codice è iniziato con le librerie che abbiamo installato per RTC e display. Successivamente definisce le dimensioni dello schermo e l'indirizzo di visualizzazione. Inizializza l'array con i nomi dei giorni feriali.

IL impostare parte inizia con la comunicazione seriale. Controlla se l'RTC e il display funzionano o meno. Successivamente, abbiamo definito una stringa di testo 'Linuxhint' che verrà visualizzata per 3 secondi. Questo è solo un messaggio di apertura o di avvio, puoi anche modificare questo messaggio con il tuo testo personalizzato.

IL ciclo continuo la funzione ottiene la data e l'ora del modulo DS1307. Successivamente, cancella il display e stampa la data e l'ora in modo formattato. Il codice aggiunge inoltre zeri iniziali alle ore, ai minuti e ai secondi, nel caso in cui i loro valori siano inferiori a 10.

7. Ferramenta

Dopo aver caricato il codice sulla scheda ESP32, vedrai il seguente output sullo schermo OLED. Per l'hardware abbiamo utilizzato lo schermo OLED e un modulo I2C RTC DS1307. Viene utilizzata la scheda ESP32 con 30 pin. Puoi sperimentare anche con qualsiasi altra scheda ESP32, ma assicurati di collegare correttamente i pin I2C.

Conclusione

L'RTC DS1307 ha una SRAM da 56 byte con supporto della batteria di backup. È un dispositivo a 8 pin che utilizza un protocollo di comunicazione I2C. Per interfacciare il modulo RTC DS1307 con ESP32, è possibile utilizzare i pin I2C (GPIO 22 (SCL) e GPIO 21 (SDA)) della scheda ESP32. Puoi stampare l'ora su una console IDE Arduino o utilizzare qualsiasi schermo come OLED o LCD I2C per visualizzare l'ora. Il modulo RTC DS1307 è un dispositivo utile per tenere traccia di ora e data in varie applicazioni. Alcune applicazioni principali includono registratori di dati, orologi digitali e smartwatch.