Sommario:

NODEMCU Lua ESP8266 con orologio in tempo reale (RTC) e EEPROM: 7 passaggi
NODEMCU Lua ESP8266 con orologio in tempo reale (RTC) e EEPROM: 7 passaggi

Video: NODEMCU Lua ESP8266 con orologio in tempo reale (RTC) e EEPROM: 7 passaggi

Video: NODEMCU Lua ESP8266 con orologio in tempo reale (RTC) e EEPROM: 7 passaggi
Video: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, Luglio
Anonim
NODEMCU Lua ESP8266 con orologio in tempo reale (RTC) e EEPROM
NODEMCU Lua ESP8266 con orologio in tempo reale (RTC) e EEPROM

Ottenere l'ora corretta è essenziale se si desidera conservare un registro dei dati. Esistono vari modi per ottenere l'ora da fonti su Internet.

Potresti chiedere perché non usare ESP8266 per tenere il tempo per te? Bene, puoi, ha il suo RTC (Real Time Clock) interno, ma ESP8266 ha 3 diverse frequenze di clock operative: 52 MHz all'avvio, 80 MHz durante il normale funzionamento e 160 MHz se potenziato. Se hai bisogno di un cronometraggio più accurato, soprattutto per periodi più lunghi, un RTC esterno potrebbe fornire una soluzione. Questi moduli dispongono anche di una batteria di backup in caso di mancanza di alimentazione. Un RTC non è molto accurato in quanto conta il tempo trascorso da quando è stato impostato e sebbene possa funzionare per la maggior parte delle applicazioni, potrebbe non essere abbastanza buono per il mantenimento del tempo critico. È possibile ottenere l'ora esatta da un server dell'ora SNTP da cui l'RTC può essere aggiornato a intervalli regolari, se necessario.

Il modulo DS1307 Tiny RTC I2C (sopra) è un esempio di questi articoli e può essere acquistato su Ebay e altri fornitori per meno di £ 2. Ce ne sono anche altri come il DS1302 e il DS3231 che funzionano in modo simile e costano da 99p in su.

Il modulo DS1307 utilizza un'interfaccia I2C e per un ESP-01 dovrebbe essere collegato come:

Vcc - 3.3v, Gnd - Gnd, SDA - D3, SCL - D4

SDA e SCL possono essere collegati a uno qualsiasi dei pin I/O sui più grandi ESP8266 (modificare il codice di conseguenza). Solo i pin sul lato sinistro devono essere collegati a questo modulo.

Passaggio 1: ora di Google

Google Time
Google Time

Ci sono molti esempi di come ottenere il tempo da Google e assomigliare a questo. Quando esegui il programma GoogleTime.lua ottieni un risultato come questo:

dofile("GoogleTime.lua")> Ora: Ven, 15 Dic 2017 11:19:45 GMT

Il problema con questo metodo è che ottieni l'ora in formato stringa e devi dividere la stringa nei suoi singoli bit per ore, minuti, secondi, ecc. L'RTC accetta l'ora in un formato speciale, ad esempio timestamp UNIX. In parole povere questo è il numero di secondi trascorsi da giovedì 1 gennaio 1970 a oggi e ora. UNIX Epoch (1970/01/01 00:00:00) è utilizzato dalla maggior parte dei sistemi operativi per computer e il tempo trascorso viene memorizzato come numero a 32 bit con segno. Ciò significa che questo sistema funzionerà fino al 19 gennaio 2038, quando il numero diventerà troppo grande per essere memorizzato in questo modo. Una soluzione è memorizzare il numero come 64 bit, ma per ora sarà sufficiente il metodo a 32 bit.

Per impostare l'ora al 9 luglio 2015 alle 18:29:49 sull'RTC interno, utilizzare questa riga di codice:

rtctime.set (1436430589, 0)

I 2 parametri sono secondi e microsecondi.

Puoi trovare maggiori informazioni leggendo la documentazione di NodeMCU.

Passaggio 2: server dell'ora SNTP

Server dell'ora SNTP
Server dell'ora SNTP

Il Simple Network Time Protocol (SNTP) è fornito da molte fonti su Internet e molti paesi in tutto il mondo hanno questo servizio.

Il programma SNTPTime2.lua imposta l'ora sull'RTC interno. Devi avere i moduli rtctime e sntp nella tua build quando esegui il flashing di ESP8266. Il programma ottiene l'ora dal server in secondi e micro secondi e imposta l'RTC interno con rtctime.set(sec, usec).

Il programma visualizza quindi la data e l'ora in diversi formati.

Esistono molti server SNTP in tutto il mondo e alcuni sono i seguenti:

  • sntp.sync({"216.239.35.0"},
  • sntp.sync({"0.uk.pool.ntp.org", "0.uk.pool.ntp.org"},
  • sntp.sync({"3.uk.pool.ntp.org", "143.210.16.201"},
  • sntp.sync({"0.uk.pool.ntp.org", "1.uk.pool.ntp.org", "3.uk.pool.ntp.org"},

Tutte le righe di codice di cui sopra possono essere sostituite nel programma SNTPTime2.lua.

Ci sono più server SNTP agli indirizzi sotto i quali possono essere nuovamente utilizzati nel programma.

93.170.62.252, 130.88.202.49, 79.135.97.79, ntp.exnet.com

Google fornisce anche time server a questi indirizzi:

216.239.35.0, 216.239.35.4, 216.239.35.8, 216.239.35.12

È necessario ricordare di ottenere l'ora dal paese in cui ci si trova o potrebbe essere necessario modificarla per i diversi fusi orari del mondo. Inoltre, alcuni paesi hanno l'ora legale, quindi potresti dover affrontare anche questo.

Passaggio 3: ottenere il tempo dal modulo RTC

Ottenere il tempo dal modulo RTC
Ottenere il tempo dal modulo RTC

Il programma GetRTCTime.lua legge l'ora dall'RTC interno.

La prima parte legge il tempo e lo visualizza in secondi e microsecondi.

La seconda parte lo converte in un formato più leggibile dall'uomo.

quando si chiama tm = rtctime.epoch2cal(rtctime.get()) restituisce:

  • anno - 1970 ~ 2038
  • lun - mese 1 ~ 12 nell'anno in corso
  • giorno - giorno 1 ~ 31 nel mese corrente
  • ora
  • min
  • secondo
  • giorno - giorno 1 ~ 366 nell'anno in corso
  • wday - giorno 1 ~ 7 della settimana corrente (domenica è 1)

È possibile accedere a ciascun elemento come tm["day"], tm["year"]…

Puoi trovare maggiori informazioni leggendo la documentazione di NodeMCU.

DisplaySNTPtime.lua è un modo più elaborato per mostrare la data e l'ora su un display LCD 128 x 64 OLED, poiché è facilmente collegato e può essere utilizzato con questi programmi.

Passaggio 4: memoria utente RTC

Un piccolo diversivo dal cronometraggio è che l'RTC interno sull'ESP8266 ha indirizzi di memoria 128 x 32 bit a cui è possibile accedere dal programmatore. Sono particolarmente utili in quanto possono sopravvivere al ciclo di sonno profondo dell'ESP8266. Spetta al programmatore controllarne l'utilizzo e assicurarsi che non vengano sovrascritti accidentalmente.

Ho incluso RTCmem.lua, un semplice programma che ne dimostra l'utilizzo. Devi avere il modulo rtcmem nella tua build.

Passaggio 5: moduli RTC esterni

Moduli RTC esterni
Moduli RTC esterni

I moduli RTC esterni si collegano all'ESP8266 tramite l'interfaccia I2C, che utilizza solo due pin I/O e quindi funziona con ESP-01 e con la maggior parte degli altri dispositivi ESP8266.

L'indirizzo del modulo RTC è 0x68 e vi si accede utilizzando i normali comandi I2C. C'è, tuttavia, qualcosa da tenere a mente, i dati nei registri RTC sono memorizzati in formato BCD (base 16), quindi i tuoi programmi devono occuparsene. L'ora e la data sono memorizzate in 7 registri all'interno dell'RTC. Sull'RTC interno, le conversioni BCD sono gestite dal modulo rtctime.

SetExtRTC.lua converte i dati in BCD e imposta l'ora.

ReadExtRTC.lua legge i dati temporali e li stampa. NOTA: i dati vengono stampati in esadecimale.

Non ho passato molto tempo a formattare il display poiché potresti avere le tue idee su cosa vuoi fare con data e ora. Questo è il motore di base nella sua forma più semplice, in modo che tu possa svilupparlo ulteriormente se lo desideri.

Passaggio 6: registrazione dei dati

Registrazione dati
Registrazione dati

Se osservi attentamente i moduli RTC, noterai che hanno un circuito integrato EEPROM AT24C32 o simile integrato, oppure puoi utilizzare una scheda 24C256 come sopra. La maggior parte di questi circuiti integrati EEPROM ha pin out simili a quelli sopra. Vengono forniti con varie quantità di spazio di archiviazione, ma sono tutti accessibili allo stesso modo. Poiché l'AT24C32 è già saldato sulla scheda, può essere utilizzato direttamente dall'I2C dell'RTC esterno.

Se hai solo un IC 24C256 o simile, puoi configurarlo in una breadboard, collegare A1, A2 e A3 a Gnd, Vcc a 3.3V e SDA AND SCL a I2C, WP può essere lasciato flottante. Alcuni circuiti integrati EEPROM funzionano solo a 5V, quindi controlla prima la scheda tecnica pertinente.

ByteWR.lua scrive 1 byte di dati nella posizione di memoria 0x00 della EEPROM e li rilegge.

Desiderata.lua scrive un paio di righe da un famoso testo nella EEPROM.

eeRead.lua legge i dati dalla EEPROM e li stampa.

NOTA: Questi programmi dovrebbero funzionare anche con altre schede EEPROM.

Passaggio 7: conclusione

Ho provato a mostrare come funzionano RTC e EEPROM per la registrazione dei dati. Questo è solo un punto di partenza per sviluppare ulteriormente. È possibile collegare al bus I2C vari dispositivi come sensori di luce, sensori di pressione barometrica, sensori di temperatura e umidità e registrare i dati sulla EEPROM.

Consigliato: