Ciao ragazzi in questo articolo vediamo come collegare un RTC ad Arduino, in questo caso il DS1307 / AT24C32.
RTC è l’acronimo di Real Time Clock, grazie a questo componente possiamo tracciare con molta semplicità e precisione ora, minuti, secondi, giorno settimana, giorno mese, mese ed anno.
Questo componente può essere impiegato per svariati scopi, possiamo pensare ad esempio ad un cronotermostato, quindi ancora più in generale possiamo pensare ad azionare un relè ad un orario preciso.
I collegamenti:
Dopo aver effettuato i collegamenti passiamo allo sketch con l’ausilio della sola libreria wire, lavorando direttamente sui registri del DS1307
#include "Wire.h" #define DS1307_ADDRESS 0x68 byte zero = 0x00; //workaround for issue #527 void setup() { Wire.begin(); Serial.begin(9600); setDateTime(); //MUST CONFIGURE IN FUNCTION } void loop() { printDate(); delay(1000); } void setDateTime() { byte second = 00; //0-59 byte minute = 19; //0-59 byte hour = 21; //0-23 byte weekDay = 4; //1-7 byte monthDay = 27; //1-31 byte month = 10; //1-12 byte year = 12; //0-99 Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); //stop Oscillator Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(weekDay)); Wire.write(decToBcd(monthDay)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.write(zero); //start Wire.endTransmission(); } byte decToBcd(byte val) { // Convert normal decimal numbers to binary coded decimal return ( (val / 10 * 16) + (val % 10) ); } byte bcdToDec(byte val) { // Convert binary coded decimal to normal decimal numbers return ( (val / 16 * 10) + (val % 16) ); } void printDate() { // Reset the register pointer Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS, 7); int second = bcdToDec(Wire.read()); int minute = bcdToDec(Wire.read()); int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday int monthDay = bcdToDec(Wire.read()); int month = bcdToDec(Wire.read()); int year = bcdToDec(Wire.read()); //print the date EG 3/1/11 23:59:59 Serial.print(month); Serial.print("/"); Serial.print(monthDay); Serial.print("/"); Serial.print(year); Serial.print(" "); Serial.print(hour); Serial.print(":"); Serial.print(minute); Serial.print(":"); Serial.println(second); }
e come al solito, buon lavoro ragazzi 😉