Sommario:

Utilizzo dei moduli orologio in tempo reale DS1307 e DS3231 con Arduino: 3 passaggi
Utilizzo dei moduli orologio in tempo reale DS1307 e DS3231 con Arduino: 3 passaggi

Video: Utilizzo dei moduli orologio in tempo reale DS1307 e DS3231 con Arduino: 3 passaggi

Video: Utilizzo dei moduli orologio in tempo reale DS1307 e DS3231 con Arduino: 3 passaggi
Video: Tutorial Arduino ITA 23: RTC (Real Time Clock) DS3231 2024, Settembre
Anonim
Utilizzo dei moduli orologio in tempo reale DS1307 e DS3231 con Arduino
Utilizzo dei moduli orologio in tempo reale DS1307 e DS3231 con Arduino
Utilizzo dei moduli orologio in tempo reale DS1307 e DS3231 con Arduino
Utilizzo dei moduli orologio in tempo reale DS1307 e DS3231 con Arduino

Continuiamo a ricevere richieste su come utilizzare i moduli di clock in tempo reale DS1307 e DS3231 con Arduino da varie fonti, quindi questo è il primo di un tutorial in due parti su come utilizzarli. Per questo tutorial Arduino abbiamo due moduli di clock in tempo reale da utilizzare, uno basato sul Maxim DS1307 (il modulo quadrato) e il DS3231 (il modulo rettangolare).

Ci sono due differenze principali tra i circuiti integrati sui moduli dell'orologio in tempo reale, ovvero l'accuratezza del cronometraggio. Il DS1307 utilizzato nel primo modulo funziona molto bene, tuttavia la temperatura esterna può influenzare la frequenza del circuito dell'oscillatore che pilota il contatore interno del DS1307.

Questo può sembrare un problema, tuttavia di solito si verifica con l'orologio che si spegne di circa cinque minuti al mese. Il DS3231 è molto più preciso, poiché ha un oscillatore interno che non è influenzato da fattori esterni, e quindi è preciso fino a pochi minuti all'anno al massimo. Se hai un modulo DS1307, non sentirti male, è comunque una scheda di grande valore e ti servirà bene. Con entrambi i moduli è necessaria una batteria di backup.

È una buona idea acquistare una nuova batteria CR2032 e inserirla nel modulo. Oltre a tenere traccia dell'ora e della data, questi moduli hanno anche una piccola EEPROM, una funzione di allarme (solo DS3231) e la capacità di generare un'onda quadra di varie frequenze, tutte cose che saranno oggetto di un secondo tutorial.

Passaggio 1: collegamento del modulo a un Arduino

Entrambi i moduli utilizzano il bus I2C, che rende la connessione molto semplice.

Per prima cosa dovrai identificare quali pin sul tuo Arduino o sulle schede compatibili vengono utilizzati per il bus I2C: questi saranno conosciuti come SDA (o dati) e SCL (o orologio). Su Arduino Uno o schede compatibili, questi pin sono A4 e A5 per dati e orologio; Su Arduino Mega i pin sono D20 e D21 per dati e orologio; E se stai usando un Pro Mini compatibile i pin sono A4 e A5 per i dati e l'orologio, che sono paralleli ai pin principali.

Modulo DS1307

Se hai il modulo DS1307 dovrai saldare i fili alla scheda o saldare alcuni pin di intestazione in linea in modo da poter utilizzare i ponticelli. Quindi collega i pin SCL e SDA al tuo Arduino e il pin Vcc al pin 5V e GND a GND.

Modulo DS3231

Il collegamento di questo modulo è semplice poiché i pin di intestazione sono installati sulla scheda in fabbrica. Puoi semplicemente eseguire nuovamente i cavi dei ponticelli da SCL e SDA ad Arduino e di nuovo dai pin Vcc e GND del modulo ai 5V o 3.3. V e GND della tua scheda. Tuttavia questi sono duplicati sull'altro lato per saldare i propri fili. Entrambi questi moduli hanno i resistori di pull-up richiesti, quindi non è necessario aggiungerne di propri. Come tutti i dispositivi collegati al bus I2C, cerca di ridurre al minimo la lunghezza dei cavi SDA e SCL.

Passaggio 2: leggere e scrivere l'ora dal modulo RTC

Dopo aver cablato il modulo RTC. inserisci e carica il seguente sketch. Sebbene le note e le funzioni nello schizzo si riferiscano solo al DS3231, il codice funziona anche con il DS1307.

#include "Wire.h"#define DS3231_I2C_ADDRESS 0x68 // Converte i normali numeri decimali in byte decimali codificati binari decToBcd(byte val) { return((val/10*16) + (val%10)); } // Converte i numeri decimali codificati binari in normali numeri decimali byte bcdToDec(byte val) { return((val/16*10) + (val%16)); } void setup() { Wire.begin(); Serial.begin(9600); // imposta qui l'ora iniziale: // DS3231 secondi, minuti, ore, giorno, data, mese, anno // setDS3231time(30, 42, 21, 4, 26, 11, 14); } void setDS3231time(byte secondo, byte minuto, byte ora, byte dayOfWeek, byte dayOfMonth, byte mese, byte anno) { // imposta i dati di ora e data su DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // imposta l'input successivo in modo che inizi al registro dei secondi Wire.write(decToBcd(second)); // imposta i secondi Wire.write(decToBcd(minuti)); // imposta i minuti Wire.write(decToBcd(hour)); // imposta le ore Wire.write(decToBcd(dayOfWeek)); // imposta il giorno della settimana (1=domenica, 7=sabato) Wire.write(decToBcd(dayOfMonth)); // imposta la data (da 1 a 31) Wire.write(decToBcd(mese)); // imposta il mese Wire.write(decToBcd(year)); // imposta l'anno (da 0 a 99) Wire.endTransmission(); } void readDS3231time(byte *secondo, byte *minuto, byte *ora, byte *dayOfWeek, byte *dayOfMonth, byte *mese, byte *anno) { Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // imposta il puntatore del registro DS3231 su 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // richiede sette byte di dati da DS3231 a partire dal registro 00h *second = bcdToDec(Wire.read() & 0x7f); *minuto = bcdToDec(Wire.read()); *ora = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *mese = bcdToDec(Wire.read()); *anno = bcdToDec(Wire.read()); } void displayTime() { byte secondo, minuto, ora, giorno della settimana, giorno del mese, mese, anno; // recupera i dati da DS3231 readDS3231time(&secondo, &minuto, &ora, &giornoSettimana, &giornoMese, &mese, &anno); // invialo al monitor seriale Serial.print(hour, DEC); // converte la variabile byte in un numero decimale quando viene visualizzata Serial.print(:"); if (minuto<10) { Serial.print("0"); } Serial.print(minuto, DEC); Serial.print(":"); if (secondo<10) { Serial.print("0"); } Serial.print(secondo, DEC); Serial.print(" "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(mese, DIC); Serial.print("/"); Serial.print(anno, DEC); Serial.print("Giorno della settimana: "); switch(dayOfWeek){ case 1: Serial.println("Sunday"); rottura; caso 2: Serial.println("Lunedì"); rottura; caso 3: Serial.println("Martedì"); rottura; caso 4: Serial.println("Mercoledì"); rottura; caso 5: Serial.println("Giovedi"); rottura; caso 6: Serial.println("Venerdì"); rottura; caso 7: Serial.println("Sabato"); rottura; } } void loop() { displayTime(); // visualizza i dati dell'orologio in tempo reale sul monitor seriale, delay(1000); // ogni secondo }

Potrebbe esserci molto codice, tuttavia si scompone bene in parti gestibili.

Include prima la libreria Wire, che viene utilizzata per la comunicazione bus I2C, seguita dalla definizione dell'indirizzo bus per l'RTC come 0x68. Queste sono seguite da due funzioni che convertono i numeri decimali in BCD (decimale con codifica binaria) e viceversa. Questi sono necessari poiché i circuiti integrati RTC funzionano in BCD non decimale.

La funzione setDS3231time() viene utilizzata per impostare l'orologio. Usarlo è molto semplice, basta inserire i valori dall'anno al secondo e l'RTC partirà da quel momento. Ad esempio, se si desidera impostare la seguente data e ora – mercoledì 26 novembre 2014 e 21:42 e 30 secondi – si utilizzerà:

setDS3231time(30, 42, 21, 4, 26, 11, 14);

Passaggio 3:

Si noti che l'ora viene impostata utilizzando l'orario di 24 ore e il quarto parametro è il "giorno della settimana". Questo cade tra 1 e 7, rispettivamente da domenica a sabato. Questi parametri sono valori in byte se stai sostituendo le tue variabili.

Una volta eseguita la funzione, è consigliabile prefissarla con // e caricare nuovamente il codice, in modo che non ripristinerà l'ora una volta che l'alimentazione è stata spenta o ripristinata il microcontrollore. Leggere l'ora dal tuo RTC è altrettanto semplice, infatti il processo può essere seguito ordinatamente all'interno della funzione displayTime(). Sarà necessario definire sette variabili di byte per memorizzare i dati dall'RTC, e queste vengono poi inserite nella funzione readDS3231time(). Ad esempio se le tue variabili sono:

byte secondo, minuto, ora, giorno della settimana, giorno del mese, mese, anno;

… li aggiorneresti con i dati correnti dall'RTC usando:

readDS3232time(&secondo, &minuto, &ora, &giornoSettimana, &giornoMese, &mese, &anno);

Quindi puoi utilizzare le variabili come meglio credi, dall'invio dell'ora e della data al monitor seriale come fa lo schizzo di esempio, alla conversione dei dati in un formato adatto a tutti i tipi di dispositivi di output.

Giusto per verificare che tutto funzioni, inserire l'ora e la data appropriate nello schizzo dimostrativo, caricarlo, commentare la funzione setDS3231time() e caricarlo di nuovo. Quindi apri il monitor seriale e dovresti ricevere una visualizzazione in esecuzione dell'ora e della data correnti.

Da questo punto ora hai gli strumenti software per impostare i dati e recuperarli dal tuo modulo orologio in tempo reale e speriamo che tu abbia una comprensione di come utilizzare questi moduli economici.

Puoi saperne di più sui particolari circuiti integrati dell'orologio in tempo reale dal sito Web del produttore: DS1307 e DS3231.

Questo post ti è stato presentato da pmdway.com: tutto per i produttori e gli appassionati di elettronica, con consegna gratuita in tutto il mondo.

Consigliato: