martedì 5 gennaio 2016

Parte 5/6: il modulo modulo RTC DS1307

Di fianco il collegamento del modulo RTC DS1307 ad Arduino. Questo economico dispositivo, completo di batteria a tampone, è un orologio completo di calendario.
Con Arduino possiamo modificare la data e l'ora mediante il seguente codice:









//includo la libreria per la
//comunicazione su bus I2C
#include <Wire.h>

void setup()
{
  //inizializzo la seriale
  Serial.begin(9600);

  //inizializzo la libreria
  Wire.begin();

  //attivo la comunicazione con il DS1307
  //l'indirizzo dell'RTC è 0x68

  Wire.beginTransmission(0x68);

  //il primo byte stabilisce il registro
  //iniziale da scivere

   Wire.write((byte)0x00);

  //specifico il tempo e la data

   Wire.write((byte)0x00); //1° byte SECONDI da 0x00 a 0x59
   Wire.write((byte)0x05); //2° byte MINUTI da 0x00 a 0x59
   Wire.write((byte)0x80 | 0x08); //3° byte ORE da 0x00 a 0x24
   Wire.write((byte)0x06); //4° byte GIORNO della settimana da 0x01 a 0x07
   Wire.write((byte)0x07); //5° byte GIORNO del mese da 0x00 a 0x31
   Wire.write((byte)0x06); //6° byte MESE da 0x00 a 0x12
   Wire.write((byte)0x14); //7° byte ANNO 0x00 a 0x99
   Wire.endTransmission();
}


Il programma, quando viene eseguito da Arduino, regolerà data e ora del RTC DS1307 quindi per evitare che ad ogni riavvio memorizzi gli stessi valori vi consiglio di ricaricare il programma ed eliminare o commentare il codice in blu.

Di seguito il codice per leggere e stampare data e ora.


void loop()
{
  //inizzializza la trasmissione partendo
  //dall'indirizzo 0x00
  Wire.beginTransmission(0x68);
  Wire.write((byte)0x00);
  Wire.endTransmission();

  //richiedo 7 byte dal dispositivo con
  //indirizzo 0x68
  Wire.requestFrom(0x68, 7);
  //regupero i 7 byte relativi ai
  //corrispondenti registri
  byte secondi = Wire.read();
  byte minuti = Wire.read();
  byte ora = Wire.read();
  byte giorno_sett = Wire.read();
  byte giorno_mese = Wire.read();
  byte mese = Wire.read();
  byte anno = Wire.read();

  Serial.print("Orario corrente: ");
  Serial.print(ora, HEX);
  Serial.print(":");
  Serial.print(minuti, HEX);
  Serial.print(":");
  Serial.println(secondi, HEX);

  Serial.print("Giorno della settimana: ");
  Serial.println(giorno_sett, HEX);

  Serial.print("Data corrente: ");
  Serial.print(giorno_mese, HEX);
  Serial.print("/");
  Serial.print(mese, HEX);
  Serial.print("/");
  Serial.println(anno, HEX);
  Serial.println();

  delay(1000);
}


Per poter regolare successivamente il modulo mediante variabili dovete trasformare quest'ultime in valori binari tramite la seguente funzione:


// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}


Per convertire un valore binario in decimale invece:


// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

1 commento: