Benötigte Bauteile:
# Bezeichnung ~Preis
1 DS1307 RTC Modul (z.B. bei ebay) 1,50 €
1 Wiederaufladbare Knopfzelle (z. B. LIR2032) 2,00 €
    ~ 3,50 €

 

Benötigte Werkzeuge:
# 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  

#1 Ronin 2016-02-02 20:53
0,50 Euro für die Knopfzelle? Aber keine LIR2032. Falls doch, könnte ich eine Bezugsadresse bekommen?
#2 Marcel I. 2016-02-03 07:50
Ich verwerte immer
http://www.pollin.de/shop/dt/NTg4ODI3OTk-/Stromversorgung/Batterien/Knopfzellen/Lithium_Knopfzellen_QUATPOWER.html
#3 Ronin 2016-02-03 16:01
Schade, das dachte ich mir irgendwie schon. CR2032 sind keine Akkuknopfzellen , sondern normale Batterien, daher auch der günstige Preis.

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?
#4 Marcel I. 2016-02-10 19:34
Hey Ronin, du hast Recht. Ich habe mir bislang keine Gedanken darüber gemacht. Die von mir verwendeten Knopfzellen waren LIR2032 und nicht CR2032. Ich passe das Tutorial soweit an, danke für den Tipp.
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.
#5 claude 2016-06-12 23:02
Ungültige Bibliothek C:\Program Files (x86)\Arduino\l ibraries\Time in C:\Program Files (x86)\Arduino\l ibraries\Time gefunden

was mache ich falsch
#6 Marcel I. 2016-06-13 19:43
Hey Claude,
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.
#7 Martin Dvorak 2016-11-23 15:41
Hallo
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?