Orologio in tempo reale con Arduino: 3 passaggi
Orologio in tempo reale con Arduino: 3 passaggi
Anonim
Orologio in tempo reale con Arduino
Orologio in tempo reale con Arduino

In questo progetto, realizzeremo un orologio con l'aiuto del modulo Arduino e RTC. Come sappiamo, Arduino non può visualizzare l'ora effettiva, quindi utilizzeremo il modulo RTC per visualizzare l'ora corretta sul display LCD. Leggi attentamente tutti i passaggi ti aiuterà molto a far funzionare l'orologio.

Il codice Arduino DS3231 è come il codice DS1307 e funziona con entrambi i chip RTC.

Il codice Arduino sottostante non utilizza alcuna libreria per DS3231 RTC, la libreria Wire è per la corrispondenza tra Arduino e DS3231 utilizzando la convenzione I2C.

Sì! Molti ingegneri elettronici dipendono da esso per i loro progetti basati sul tempo, ma RTC non è completamente affidabile. Funziona a batteria e deve essere sostituito prima o poi. Venendo ai progetti IoT, occupa preziosi pin SPI (Serial Peripheral Interface) e diventa disordinato con fili aggrovigliati. Soluzione…. Ecco che arriva il nostro eroe NTP (Network time protocol). NTP è così preciso poiché prende tempo da Internet. Opereremo questo protocollo utilizzando una modalità client-server. il processo è così semplice che il nostro Nodemcu funge da client e richiede un pacchetto NTP dal server tramite UDP. In cambio, il server invia un pacchetto al client che analizza i dati. NTP è il protocollo di sincronizzazione dell'ora universale. Ora accendiamo la postazione di lavoro dei nostri laboratori

Passaggio 1: componenti richiesti

  • Scheda Arduino
  • Scheda RTC DS3231
  • Schermo LCD 16x2
  • 2 x pulsante
  • Resistenza variabile da 10K ohm (o potenziometro)
  • Resistenza da 330 ohm
  • Batteria a bottone da 3V
  • tagliere
  • Ponticelli

Modulo RTC DS3231

Il tempo è un senso essenziale richiesto in questo mondo frenetico degli esseri umani. Nel progetto in tempo reale

Usiamo RTC (A. K. A Orologio in tempo reale)

RTC L'orologio in tempo reale (RTC) è un circuito integrato (IC) che tiene traccia dell'ora corrente. L'RTC si occupa dell'ora in modalità reale. L'RTC si trova solitamente nelle schede madri dei computer e nei sistemi embedded per richiedere un accesso tempestivo.

Passaggio 2: connessione dell'orologio Arduino

Collegamento dell'orologio Arduino
Collegamento dell'orologio Arduino
  • Collega il pin SCL al modulo RTC all'Arduino A5
  • Collega il pin SDA al modulo RTC all'Arduino A4
  • Connetti VCC A 5v e GND A GND
  • Collegare un pulsante al pin 8
  • Collegare un altro pulsante al pin 9
  • Collega RS di LCD al pin 2 di Arduino
  • Collega E di LCD al pin 3 di Arduino
  • Collega D7 di LCD al pin 7 di Arduino
  • Collega D6 di LCD al pin 6 di Arduino
  • Collega D5 di LCD al pin 5 di Arduino
  • Collega D4 di LCD al pin 4 di Arduino
  • Connetti VSS & K a GND
  • Collega VDD e A al 5v
  • Collega vo al pin di uscita del potenziometro

Passaggio 3: codice per Arduino Clock con RTC

Codice per Arduino Clock con RTC
Codice per Arduino Clock con RTC

Il DS3231 funziona solo con il formato BCD e per convertire il BCD in decimale e viceversa ho usato le 2 righe sottostanti (esempio per minuto):// Converti BCD in decimalminute = (minuto >> 4) * 10 + (minuto e 0x0F);

// Converti decimale in BCDminute = ((minuto / 10) << 4) + (minuto % 10); void DS3231_display(): visualizza l'ora e il calendario, prima di visualizzare l'ora e i dati del calendario vengono convertiti dal formato BCD al formato decimale.void blink_parameter():

// Orologio e calendario in tempo reale con pulsanti di impostazione utilizzando DS3231 e Arduino // includi il codice della libreria LCD #include // includi il codice della libreria Wire (necessario per i dispositivi con protocollo I2C) #include // Connessioni del modulo LCD (RS, E, D4, D5, D6, D7) LCD a cristalli liquidi(2, 3, 4, 5, 6, 7); void setup() { pinMode(8, INPUT_PULLUP); // button1 è connesso al pin 8 pinMode(9, INPUT_PULLUP); // button2 è connesso al pin 9 // imposta il numero di colonne e righe dell'LCD lcd.begin(16, 2); Wire.begin(); // Unisciti al bus i2c } char Time = "TIME::: "; char Calendar = "DATA: / /20 "; byte i, secondo, minuto, ora, data, mese, anno; void DS3231_display(){ // Converti BCD in secondo decimale = (secondo >> 4) * 10 + (secondo & 0x0F); minuto = (minuto >> 4) * 10 + (minuto & 0x0F); ora = (ora >> 4) * 10 + (ora & 0x0F); data = (data >> 4) * 10 + (data & 0x0F); mese = (mese >> 4) * 10 + (mese & 0x0F); anno = (anno >> 4) * 10 + (anno & 0x0F); // Fine conversione Tempo[12] = secondo % 10 + 48; Tempo[11] = secondo / 10 + 48; Tempo[9] = minuto % 10 + 48; Tempo[8] = minuto / 10 + 48; Tempo[6] = ora % 10 + 48; Tempo[5] = ora / 10 + 48; Calendario[14] = anno % 10 + 48; Calendario[13] = anno / 10 + 48; Calendario[9] = mese % 10 + 48; Calendario[8] = mese / 10 + 48; Calendario[6] = data % 10 + 48; Calendario[5] = data / 10 + 48; lcd.setCursor(0, 0); lcd.print(Ora); // Visualizza l'ora lcd.setCursor(0, 1); lcd.print(Calendario); // Visualizza calendario } void blink_parameter(){ byte j = 0; while(j 23) // Se ore > 23 ==> ore = 0 parametro = 0; if(i == 1 && parametro > 59) // If minuti > 59 ==> minuti = 0 parametro = 0; if(i == 2 && parametro > 31) // If data > 31 ==> data = 1 parametro = 1; if(i == 3 && parametro > 12) // If mese > 12 ==> mese = 1 parametro = 1; if(i == 4 && parametro > 99) // If anno > 99 ==> anno = 0 parametro = 0; sprintf(testo, "%02u", parametro); lcd.setCursor(x, y); lcd.print(testo); ritardo(200); // Attendi 200 ms } lcd.setCursor(x, y); lcd.print(" "); // Visualizza due spazi blink_parameter(); sprintf(testo, "%02u", parametro); lcd.setCursor(x, y); lcd.print(testo); parametro_lampeggia(); if(!digitalRead(8)){ // Se viene premuto il pulsante (pin #8) i++; // Aumenta 'i' per il prossimo parametro di ritorno del parametro; // Restituisce il valore del parametro ed esce } } } void loop() { if(!digitalRead(8)){ // Se viene premuto il pulsante (pin #8) i = 0; ora = edit(5, 0, ora); minuto = edit(8, 0, minuto); data = modifica(5, 1, data); mese = modifica(8, 1, mese); anno = modifica(13, 1, anno); // Converti decimale in BCD minuto = ((minuto / 10) << 4) + (minuto % 10); ora = ((ora / 10) << 4) + (ora % 10); data = ((data / 10) << 4) + (data % 10); mese = ((mese / 10) << 4) + (mese % 10); anno = ((anno / 10) << 4) + (anno % 10); // Termina la conversione // Scrivi i dati su DS3231 RTC Wire.beginTransmission(0x68); // Avvia protocollo I2C con indirizzo DS3231 Wire.write(0); // Invia l'indirizzo del registro Wire.write(0); // Resetta i secondi e avvia l'oscillatore Wire.write(minute); // Scrivi minuti Wire.write(hour); // Scrivi ora Wire.write(1); // Scrivi giorno (non utilizzato) Wire.write(date); // Scrivi la data Wire.write(mese); // Scrivi mese Wire.write(anno); // Scrivi anno Wire.endTransmission(); // Interrompe la trasmissione e rilascia il ritardo del bus I2C (200); // Attendi 200 ms } Wire.beginTransmission(0x68); // Avvia protocollo I2C con indirizzo DS3231 Wire.write(0); // Invia l'indirizzo del registro Wire.endTransmission(false); // I2C riavvia Wire.requestFrom(0x68, 7); // Richiede 7 byte da DS3231 e rilascia il bus I2C al termine della lettura second = Wire.read(); // Legge i secondi dal registro 0 minuto = Wire.read(); // Legge i minuti dal registro 1 ora = Wire.read(); // Legge l'ora dal registro 2 Wire.read(); // Legge il giorno dal registro 3 (non utilizzato) date = Wire.read(); // Legge la data dal registro 4 mesi = Wire.read(); // Leggi mese dal registro 5 anno = Wire.read(); // Legge l'anno dal registro 6 DS3231_display(); // Tempo di visualizzazione e ritardo del calendario (50); // Attendi 50 ms }

Consigliato: