Drucken
Kategorie: I²C
Zugriffe: 26643

Diesmal habe ich mir ein Board mit dem RealTimeClock-Chip DS1307 besorgt und angesehen.

Darauf ist alles bereits enthalten, was für einen automomen Betrieb notwendig ist. Dank einer Lithiumbatterie bleibt die eingestellte Zeit nicht nur enthalten, sondern sie läuft auch weiter. Die Batterie wird nur angezapft, wenn keine reguläre Stromversorung anliegt. Damit stellt die Knopfzelle eine Art Notnagel dar und kann schon mal über die gesamte Nutzungsdauer ausreichen, denn der Chip in diesem Betriebsmodus extrem sparsam.

Im regulären Betrieb liefert dieser Chip die laufend aktualisierte Zeitangaben (incl. Kalenderdaten mit Schaltjahren bis 2100. alles im BCD Format) über den I2C Bus (Adresse 0x68), 56 Byte nutzbaren batteriegepufferten Speicher (NV RAM) und einen mit 1Hz getakteten Ausgang (SQ).

Ich plane dieses Modul in Verbindung mit der Datenlogging einsetzen, denn jede Sammlung der Umweltdaten ist nur in Verbindung mit ausreichend genauen Zeitangaben sinnvoll.

Wenn man sich die Platine genauer anschaut, wird man feststellen, dass noch ein weiteres Chip darauf enthalten ist: AT24C32. Es handelt sich um einen Serial EEPROM mit einer Kapazität von 32kBit (4 KB). Dieser ist über den I2C Bus ansprechbar (Adresse 0x50) und ist für den Betrieb der Uhr offensichtlich nicht notwendig. Man kann darauf Daten speichern und diese bleiben auch ohne Stromversorgung enthalten (Batterie wird dabei nicht auch gebraucht).

Warum die beiden Chips auf einer Platine zusammengebracht wurden, ist mir ein Rätsel. Noch spannender ist die vorhandene Möglichkeit, ein DS1820 Temperatursensor einzulöten. Dieser kann nicht per I2C, sonder über 1-wire Bus angesprochen werden und hat mit mit dem Rest des Platine gar nichts zu tun. So gesehen fällt nur noch ein Bügeleisenanschlüss ;-)

 

 

An dem EEPROM habe ich derzeit kein Interesse, zum Testen von RTC habe ich eine einfache Uhr mit diesem Modul implementiert.

 

 Um nicht alles selbst programmieren zu müssen, habe ich nah einer passenden Bibliothek gesucht. Am Ende habe ich mich für ein Projekt namens ds1307new (http://code.google.com/p/ds1307new/) entschieden.

#include <Wire.h>
#include <DS1307new.h>
#include <LiquidCrystal.h>

/* 
 * Clock_LCD
 * 
 * Version 1.1
 * Datum: 21.07.2013
 * 
 * Das Programm benutzt den RTC DS1307 (RealTimeClock Modul) und
 * zeigt die Zeit auf einem 16x2-Symbol-LCD.
 * 
 * Verdrahtung (UNO, Nano...)
 * 
 * DS1307:
 *     Sensor SCL pin an A5
 *     Sensor SDA pin an A4
 *     Sensor VDD pin an 5V
 *     Sensor GND pin an GND
 *  
 * LCD in 4-Bit-Modus:
 *     LCD RS pin an digital pin 8
 *     LCD RW pin an digital pin 13
 *     LCD Enable pin an digital pin 9
 *     LCD D4 pin an digital pin 4
 *     LCD D5 pin an digital pin 5
 *     LCD D6 pin an digital pin 6
 *     LCD D7 pin an digital pin 7
 *
 *   Copyright (c) 2013 Alexander Schulz.  All right reserved.
 *  
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 * 
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

// Setup LCD-Shield
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);

void setup() {
  // Display initialisieren
  lcd.clear(); 
  lcd.begin(16, 2); // 16x2 Zeichen
  lcd.setCursor(0,0); 
  lcd.print("Clock v1.1"); 
  lcd.setCursor(0,1); 
  lcd.print("Initializing..."); 
  delay(1000);
  lcd.clear();
  
  // Prüfen, ob RTC vorhanden ist
  if (RTC.isPresent() == 0) {
    lcd.clear();
    lcd.setCursor(0,0); 
    lcd.print("RTC not found");
    lcd.setCursor(0,1); 
    lcd.print("check wiring!");
    while (1) {
      delay(1000);
    }
  }
}

void loop() {
  RTC.getTime();
  lcd.setCursor(0,0); 
  lcd.print("Date: ");
  printDate(RTC.year, RTC.month, RTC.day);
  lcd.setCursor(0,1); 
  lcd.print("Time: ");
  printTime(RTC.hour, RTC.minute, RTC.second);
  delay(1000);
}

/*
 * Datumsausgabe in Format: DD.MM.YYYY
 */
void printDate(uint16_t year, uint8_t month, uint8_t day)
{
    print2digit(day);
    lcd.print(".");
    print2digit(month);
    lcd.print(".");
    lcd.print(year, DEC);
}
  
/*
 * Ausgabe des Zeitstempels in Format HH:MM:SS
 */
void printTime(uint16_t hour, uint8_t minute, uint8_t second)
{
    print2digit(hour);
    lcd.print(":");
    print2digit(minute);
    lcd.print(":");
    print2digit(second);
}

/*
 * Ausgabe von Zahlen mit 2 Ziffern. Ggf. wird eine Null voreingestellt.
 */
void print2digit(uint8_t value)
{
  if ( value < 10 ) 
  {
    lcd.print("0");
  }
  lcd.print(value, DEC);
}

 

Kommentare (0)

Cancel or