Arduino RTC DS1307 AT24C32

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:

arduino_rtc_ds1307_schema

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 😉

arduino_rtc_ds1307_at24c32

arduino_rtc_ds1307