/****************************************************************************************************
* RTC DS1307 mit LCD-Display
*
* 05.11.2011 Jürgen Mayer, DL8MA
*
* http://www.amateurfunk.de/dl8ma
*
* Dieser Beispielcode ist public domain
*
* Hardware: Arduino
* Arduino SD Shield Plus mit DS1307 (www.avrcontrollers.com)
* LCD-Shield
*/
#include "LCD4Bit_mod.h"
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // I2C Adresse
char buffer[20] = ""; // Speicherbereich für Datenkonvertierung
LCD4Bit_mod lcd = LCD4Bit_mod(2); // LCD-Display
/****************************************************************************************************
* Konvertierung BCD-kodierter Dezimalzahl
*/
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
/****************************************************************************************************
* Zeit und Datum aus DS1307 auslesen und konvertieren
*/
void getDateDs1307(int date[])
{
Wire.beginTransmission(DS1307_I2C_ADDRESS); // I2C-Kommunikation im Schreibmodus starten
Wire.send(0x00); // Registerzeiger auf 0 setzen
Wire.endTransmission(); // I2C-Kommunikation beenden
Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // I2C-Kommunikation im Lesemodus starten
date[ 0 ] = bcdToDec(Wire.receive() & 0x7f); // Sekunden
date[ 1 ] = bcdToDec(Wire.receive()); // Minuten
date[ 2 ] = bcdToDec(Wire.receive() & 0x3f); // Stunden
date[ 3 ] = bcdToDec(Wire.receive()); // Wochentag
date[ 4 ] = bcdToDec(Wire.receive()); // Tag
date[ 5 ] = bcdToDec(Wire.receive()); // Monat
date[ 6 ] = bcdToDec(Wire.receive()); // Jahr
}
/****************************************************************************************************
*/
void setup() {
Wire.begin(); // I2C-Bus einrichten
lcd.init(); // LCD-Anzeige initialisieren
lcd.clear();
lcd.printIn( "DS1307 - Uhr" );
}
/****************************************************************************************************
*/
void loop() {
int datum[ 7 ];
getDateDs1307( datum ); // Datum und Uhrzeit aus DS1307 holen
lcd.cursorTo(2, 0); // Datum und Uhrzeit in 2. Zeile schreiben
if( datum[ 4 ] < 10 )
lcd.printIn( "0" );
lcd.printIn( itoa( datum[ 4 ], buffer, 10 ) );
lcd.printIn( "." );
if( datum[ 5 ] < 10 )
lcd.printIn( "0" );
lcd.printIn( itoa( datum[ 5 ], buffer, 10 ) );
lcd.printIn( "." );
/*
if( datum[ 6 ] < 10 )
lcd.printIn( "0" );
lcd.printIn( itoa( datum[ 6 ], buffer, 10 ) );
*/
lcd.printIn( " " );
if( datum[ 2 ] < 10 )
lcd.printIn( "0" );
lcd.printIn( itoa( datum[ 2 ], buffer, 10 ) );
lcd.printIn( ":" );
if( datum[ 1 ] < 10 )
lcd.printIn( "0" );
lcd.printIn( itoa( datum[ 1 ], buffer, 10 ) );
lcd.printIn( ":" );
if( datum[ 0 ] < 10 )
lcd.printIn( "0" );
lcd.printIn( itoa( datum[ 0 ], buffer, 10 ) );
lcd.printIn( " " );
delay(1000); // grobes Sekundenraster für Anzeige
}
|