DS 1307

Le module DS 1307 s’utilise via l’interface WIRE qui permet de communiquer avec les puces (protocole I2C).

Board I2C / TWI pins
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)
Due 20 (SDA), 21 (SCL), SDA1, SCL1

Connectez la broche VCC sur la broche 5v de la carte Arduino et la broche GND sur GND.

RTC-drawing2 IMGP2080 IMGP2081

Pour utiliser cette interface, il faut trouver l’adresse de la puce :

 // i2c_scanner  
 // This sketch tests the standard 7-bit addresses  
 // Devices with higher bit address might not be seen properly.  
 //------------------------------------------------------------  
 // You can plug and unplug device during the test  
 // Line SDA plug in UNO pin Analog 4 / Mega 44  
 // line SCL plug in UNO pin Analog 5 / Mega 43  
 #include <Wire.h>  
 void setup()  
 {  
  Wire.begin();  
  Serial.begin(9600);  
  Serial.println("\nI2C Scanner");  
 }  
 void loop()  
 {  
  byte error, address;  
  int nDevices;  
  Serial.println("Scanning...");  
  nDevices = 0;  
  for(address = 1; address < 127; address++ )   
  {  
   // The i2c_scanner uses the return value of  
   // the Write.endTransmisstion to see if  
   // a device did acknowledge to the address.  
   Wire.beginTransmission(address);  
   error = Wire.endTransmission();  
   if (error == 0)  
   {  
    Serial.print("I2C device found at address 0x");  
    if (address<16)   
     Serial.print("0");  
    Serial.print(address,HEX);  
    Serial.println(" !");  
    nDevices++;  
   }  
   else if (error==4)   
   {  
    Serial.print("Unknow error at address 0x");  
    if (address<16)   
     Serial.print("0");  
    Serial.println(address,HEX);  
   }    
  }  
  if (nDevices == 0)  
   Serial.println("No I2C devices found\n");  
  else  
   Serial.println("done\n");  
  delay(5000);      // wait 5 seconds for next scan  
 }  

L’adresse données est : I2C device found at address 0x68 !

Pour mettre à l’heure (et à la date !) le module :

 #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 =   45; //0-59  
  byte minute =   40; //0-59  
  byte hour =    16; //0-23  
  byte weekDay =   6; //1-7  
  byte monthDay =  23; //1-31  
  byte month =    11; //1-12  
  byte year =    13; //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);  
 } 

Code pour afficher l’heure et la date :

 void printDate() {  
  // Reset the register pointer  
  Wire.beginTransmission(DS1307_ADDRESS);  
  byte zero = 0x00;  
  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());  
  String sMessage, sSec, sMin, sHour, sDay, sMonth, sYear;  
  //print the date  
  sMessage = sNb(monthDay) + "/" + sNb(month) + "/" + sNb(year) + " " + sNb(hour) + ":" + sNb(minute) + ":" + sNb(second);  
  Serial.println(sMessage);  
 }  
 byte bcdToDec(byte val) {  
  // Convert binary coded decimal to normal decimal numbers  
  return ( (val / 16 * 10) + (val % 16) );  
 }  
 String sNb(int nNb)  
 { if (nNb < 10)  
   return "O" + String(nNb);  
  else  
   return String(nNb);  
 }  

Le code pour mettre à jour la date et l’heure en fonction d’une chaîne texte est ici

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.

Articles récents
Commentaires récents
fatima dans Bienvenue !
AdminDroid dans Bienvenue !
fatima dans Bienvenue !
Archives
Catégories
%d blogueurs aiment cette page :