Étape 6: Parler à l’horloge temps réel (RTC)
Le circuit et le code ci-dessous a fonctionné tout de suite pour moi.
Voici le lien vers la feuille de données DS3231 :
http://datasheets.Maxim-IC.com/en/DS/DS3231.pdf
J’ai trouvé ce petit programme (esquisse en Arduinish) sur le web thew et ont fixé pour vous. Il lit les infos du CCF et il crache au moniteur série. (Une grande partie grâce à l’auteur ; gfbarros). Voici le lien d’origine :
http://code.google.com/p/GFB/source/Browse/arduino/DS3231/DS3231.PDE
Si tout va bien, vous devriez voir la sortie de la série monitor comme celui sur la photo ci-dessous.
DS3231 Extrait de Code
#include < Wire.h >
#define DS3231_I2C_ADDRESS 104
secondes de l’octet, minutes, heures, jour, date, mois, année ;
jour de semaine Char [4] ;
tMSB octet, tLSB ;
float temp3231 ;
void setup()
{
Wire.Begin() ;
Serial.Begin(9600) ;
Registre de contrôle de sortie signal carré sur la broche 3 à 1Hz
Wire.beginTransmission(DS3231_I2C_ADDRESS) ; 104 est l’adresse du périphérique DS3231
Wire.Send(0x0E) ; //
Wire.Send(B00000000) ;
Wire.endTransmission() ;
}
void loop()
{
watchConsole() ;
get3231Date() ;
Serial.Print(weekDay) ; Serial.Print (",") ; Serial.Print (mois, DEC) ; Serial.Print("/") ; Serial.Print (date, DEC) ; Serial.Print("/") ; Serial.Print (année, DEC) ; Serial.Print ("-") ;
Serial.Print (heures, DEC) ; Serial.Print(":") ; Serial.Print (minutes, DEC) ; Serial.Print(":") ; Serial.Print (secondes, DEC) ;
Serial.Print ("température:") ; Serial.println(get3231Temp()) ;
Delay(1000) ;
}
Convertir des nombres décimaux normales en décimale codée en binaire
decToBcd(byte val) octets
{
Return ((val/10 * 16) + (10 % de val)) ;
}
Sub watchConsole()
{
Si (Serial.available()) {/ / Look de char dans la file d’attente de série et les processus si trouvé
Si (Serial.read() == 84) {//If command = « T » régler la Date
set3231Date() ;
get3231Date() ;
Serial.println("") ;
}
}
}
Sub set3231Date()
{
T(sec)(min)(Hour)(DayOfWeek)(DayOfMonth)(month)(Year)
T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
Exemple: 2 février 09 @ 19:57:11 pour le 3e jour de la semaine -> T1157193020209
secondes = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ; Utilisation de mathématique de coulée et ascii de type (octet) pour atteindre le résultat.
minutes = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ;
heures = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ;
jour = (octets) (Serial.read() - 48) ;
Date = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ;
mois = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ;
an = (octets) ((Serial.read()-48) * 10 + (Serial.read() - 48)) ;
Wire.beginTransmission(DS3231_I2C_ADDRESS) ;
Wire.Send(0x00) ;
Wire.Send(decToBcd(seconds)) ;
Wire.Send(decToBcd(minutes)) ;
Wire.Send(decToBcd(hours)) ;
Wire.Send(decToBcd(Day)) ;
Wire.Send(decToBcd(date)) ;
Wire.Send(decToBcd(month)) ;
Wire.Send(decToBcd(Year)) ;
Wire.endTransmission() ;
}
Sub get3231Date()
{
Envoyer demande de recevoir des données à partir de Registre 0
Wire.beginTransmission(DS3231_I2C_ADDRESS) ; 104 est l’adresse du périphérique DS3231
Wire.Send(0x00) ; commencer au registre 0
Wire.endTransmission() ;
Wire.requestFrom (DS3231_I2C_ADDRESS, 7) ; demande sept octets
{if(Wire.available())}
secondes = Wire.receive() ; Obtenez secondes
minutes = Wire.receive() ; obtenir des minutes
heures = Wire.receive() ; Obtenez heures
jour = Wire.receive() ;
Date = Wire.receive() ;
mois = Wire.receive() ; mois de Temp
an = Wire.receive() ;
secondes = (((seconds & B11110000) >> 4) * 10 + (secondes & B00001111)) ; convertir BCD décimal
minutes = (((minutes & B11110000) >> 4) * 10 + (minutes & B00001111)) ; convertir BCD décimal
heures = (((hours & B00110000) >> 4) * 10 + (heures & B00001111)) ; convertir BCD décimal (suppose que le mode 24 heures)
jour = (jour & B00000111) ; 1-7
Date = (((date & B00110000) >> 4) * 10 + (date & B00001111)) ; 1-31
mois = (((month & B00010000) >> 4) * 10 + (mois & B00001111)) ; msb7 est le débordement de siècle
an = (((year & B11110000) >> 4) * 10 + (an & B00001111)) ;
}
else {}
oh noes, aucune donnée !
}
commutateur (jour) {}
cas 1 :
strcpy (jours de la semaine, « Le soleil ») ;
rupture ;
cas 2 :
strcpy (jours de la semaine, « Mon ») ;
rupture ;
cas 3 :
strcpy (jours de la semaine, « Mar ») ;
rupture ;
cas 4 :
strcpy (jours de la semaine, "mercredi") ;
rupture ;
cas no 5 :
strcpy (jours de la semaine, « Jeu ») ;
rupture ;
cas 6 :
strcpy (jours de la semaine, « Fri ») ;
rupture ;
cas 7 :
strcpy (jours de la semaine, "assis") ;
rupture ;
}
}
flotteur get3231Temp()
{
registres de Temp (11h - 12h) obtenir mis à jour automatiquement chaque 64 s
Wire.beginTransmission(DS3231_I2C_ADDRESS) ;
Wire.Send(0x11) ;
Wire.endTransmission() ;
Wire.requestFrom (DS3231_I2C_ADDRESS, 2) ;
{if(Wire.available())}
tMSB = Wire.receive() ; 2 compléter la partie int
tLSB = Wire.receive() ; partie de la fraction
temp3231 = (tMSB & B01111111) ; 2 math sur Tmsb
temp3231 += ((tLSB >> 6) * 0,25) ; seulement se soucient de bits 7 & 8
}
else {}
oh noes, aucune donnée !
}
Return temp3231 ;
}