# | Bezeichnung | ~Preis |
1 | DS1307 RTC Modul (z.B. bei ebay) | 1,50 € |
1 | Wiederaufladbare Knopfzelle (z. B. LIR2032) | 2,00 € |
~ 3,50 € |
# | Bezeichnung |
1 | Breadboard und Steckverbinder oder Lötkolben und Lochrasterplatine |
Das DS1307 Real-Time Clock Modul ermöglicht das auslesen und setzen von aktueller Uhrzeit und Datum. Dank der integrierten Batterie verliert es die Uhrzeit auch nicht bei einem Stromverlust:
Hinweis: Achtet darauf, eine LIR2032 Knopfzelle zu verwenden. Im Gegensatz zur CR2032 ist diese wiederaufladbar. Manche Module haben integrierte Ladeautomatiken, die bei Nutzung einer "normalen" Knopfzelle Schäden verursachen können.
Es an einen Arduino anzuschließen ist recht simpel:
- VCC an 5V
- GND an GND
- SCL an Analog PIN 5
- SDA an Analog PIN 4
Das folgende Beispielprogramm ermöglicht es über die serielle Konsole mit dem Modul zu kommunizieren:
/* ------------------------------------------- /* DS1307 I2C Zeit seriell lesen und schreiben /* www.frag-duino.de /* ------------------------------------------- /* Befehle: /* settime 23:45:58 (hh:mm:ss) /* setdate 23.01.87 (tt.mm.jj) /* gettime --> Ausgabe 23:45:23 /* getdate --> Ausgabe 12.02.13 ------------------------------------------- */ // Includes #include <Wire.h> // Konstanten #define DS1307_ADRESSE 0x68 // I2C Addresse // Variablen char c; String readString = ""; int sekunde, minute, stunde, tag, wochentag, monat, jahr; void setup(){ Wire.begin(); Serial.begin(9600); Serial.println("Uhr initialisiert. Verfuegbare Befehle:\n - gettime\n - getdate\n - settime hh:mm:ss\n - setdate dd:mm:yy"); } void loop(){ while (Serial.available()) { // Input lesen delay(3); char c = Serial.read(); readString += c; } if (readString.length() >0) { // Input verarbeiten if(readString.substring(0,7)=="settime"){ Serial.print("settime> Setze Uhrzeit. Vorher: "); ausgabe(true); stunde=readString.substring(8,10).toInt(); minute=readString.substring(11,13).toInt(); sekunde=readString.substring(14,16).toInt(); eingabe(); delay(100); Serial.print("Uhrzeit nachher: "); ausgabe(true); } else if(readString.substring(0,7)=="setdate"){ Serial.print("setdate> Setze Datum. Vorher: "); ausgabe(false); tag=readString.substring(8,10).toInt(); monat=readString.substring(11,13).toInt(); jahr=readString.substring(14,16).toInt(); eingabe(); delay(100); Serial.print("Datum nachher: "); ausgabe(false); } else if(readString.substring(0,7)=="gettime"){ Serial.print("gettime> "); ausgabe(true); } else if(readString.substring(0,7)=="getdate"){ Serial.print("getdate> "); ausgabe(false); } else { Serial.print("Unbekannter Befehl: "); Serial.println(readString); } readString=""; } delay(1000); } void ausgabe(boolean zeit){ // True=Zeit ausgeben. False = Datum ausgeben // Initialisieren Wire.beginTransmission(DS1307_ADRESSE); Wire.write(0x00); Wire.endTransmission(); Wire.requestFrom(DS1307_ADRESSE, 7); sekunde = bcdToDec(Wire.read()); minute = bcdToDec(Wire.read()); stunde = bcdToDec(Wire.read() & 0b111111); wochentag = bcdToDec(Wire.read()); tag = bcdToDec(Wire.read()); monat = bcdToDec(Wire.read()); jahr = bcdToDec(Wire.read()); // Ausgabe if(zeit){ Serial.print(stunde); Serial.print(":"); Serial.print(minute); Serial.print(":"); Serial.println(sekunde); } else { Serial.print(tag); Serial.print("."); Serial.print(monat); Serial.print("."); Serial.println(jahr); } } void eingabe(){ // Setzt die aktuelle Zeit Wire.beginTransmission(DS1307_ADRESSE); Wire.write(0x00); Wire.write(decToBcd(sekunde)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(stunde)); Wire.write(decToBcd(wochentag)); Wire.write(decToBcd(tag)); Wire.write(decToBcd(monat)); Wire.write(decToBcd(jahr)); Wire.write(0x00); Wire.endTransmission(); } // Hilfsfunktionen byte decToBcd(byte val) { return ((val/10*16) + (val%10)); } byte bcdToDec(byte val) { return ((val/16*10) + (val%16)); }
Mittels des Befehls "gettime" oder "getdate" gibt es die aktuelle Zeit zurück:
Kommentare
http://www.pollin.de/shop/dt/NTg4ODI3OTk-/Stromversorgung/Batterien/Knopfzellen/Lithium_Knopfzellen_QUATPOWER.html
Es scheint nicht ganz ungefährlich sein diese Batterien zu verwenden, da etliche Tiny RTCs über eine Ladeautomatik verfügen (zu erkennen auf der anderen Seite der Platine ohne Batterie da ist eine rotfarbene Diode drauf) die dann natürlich versucht die normale Lithium-Batteri e zu laden und sich so Gase in der Batterie bilden und sie so irgendwann mal aufplatzen kann).
Selbst konnte ich das noch nicht feststellen, da ich diese Module erst wenige Tage habe und die auch mit CR2032 start LIR2032 geliefert bekommen habe, aber mehrere Seiten im Netz berichten darüber.
Wie lange ist das Modul denn schon bei Dir im Einsatz?
Bei der Gelegenheit sollte ich mal prüfen, ob ich nicht aus versehen in meinen Basteleien mit dem DS1307 eine CR2032 verbaut habe. Unwahrscheinlic h ist es nicht, da ich oft alte BIOS-Batterien recycled habe.
was mache ich falsch
keine Ahnung. Aber wenn du den o.g. code 1-zu-1 in die Arduino IDE kopierst, dann kompiliert der auch ;)
Die "Time" Bibliothek verwende ich gar nicht....
Poste einfach mal deinen Code und ich schau ihn mir an.
ich habe ein Problem die Uhrzeit und das Datum lassen sich nicht stellen. es ist immer das Datum und die Zeit die zuvor eingestellt war das ergebnis.
Kann das an der Batterie liegen?