Sommario:

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

Video: Orologio in tempo reale con Arduino: 3 passaggi

Video: Orologio in tempo reale con Arduino: 3 passaggi
Video: Tutorial Arduino ITA 23: RTC (Real Time Clock) DS3231 2024, Novembre
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: