by Leocarbon @leocrbn@gmail.com* @http://twitter.com/mangodaniel* @http://leocarbon.oa.to* @http://electronicmango.blogspot.com* @http://youtube.com/newelectricmango* @http://youtube.com/leocrbn**Verison History (last updated 12.24.12)* 1.0.0.0.r2 (compile 0145)** 1.0.0.0.r2 (12.24.12)* - Uses Adafruit's RTClib @https://github.com/adafruit/RTClib* - Updates DS1307's time each and every upload* - Backlight* - LCD compatible* - Eye-soothing 30 fps (33.33 millisecond frame delay)* - Friendly code commenting lol* - Thanks to Adafruit & Ladyada**** RTC is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.*/#include <Wire.h>#include <LiquidCrystal.h>#include <RTClib.h> RTC_Millis RTC; //New DS1307 RTCLiquidCrystal LCD(3,4,5,6,7,8); //New Liquid Crystal Displayint backlightOut = 9; //LCD backlight pinint backlightIn = 2; //unsigned long backlightTiming; //backlight ON timing (millis())byte backlightState;void setup(){ RTC.begin(DateTime(__DATE__,__TIME__)); //Start RTC Wire.begin(); //Start Serial LCD.begin(2,16); //Start LCD LCD.clear(); //Clear LCD just in case pinMode(backlightOut,OUTPUT); //LCD backlight //pinMode(backlightIn,INPUT_PULLUP); //LCD backlight trigger switch signal input pin //digitalWrite(backlightOut,HIGH); //Turn on backlight on start}void loop(){ backlightTiming = millis(); //Backlight timing backlightState = digitalRead(backlightIn); // Read the LCD backlight trigger switch signal input pin if(backlightTiming >= 3000){ digitalWrite(backlightOut,LOW); //Turn LCD backlight off if 3 seconds (3000 milliseconds) has passed since the start of the code } if(backlightState == 1){ digitalWrite(backlightOut,HIGH); //Turn LCD backlight on on tilt (for tilt switches (poorman's gyroscope)) } DateTime now = RTC.now(); //update the DS1307's time (you should do this every year; at least) //Time - Screen position filtering if (now.month() < 10 && now.day() < 10){ LCD.setCursor(4,0); } else { LCD.setCursor(3,0); } LCD.print(now.day()); LCD.print("/"); LCD.print(now.month()); LCD.print("/"); LCD.print(now.year()); LCD.print(" "); //Time - Screen position filtering if (now.hour() < 10 && now. minute() < 10){ LCD.setCursor(5,1); } else if (now.hour() < 10 && now.second() < 10){ LCD.setCursor(5,1); } else if (now.second() < 10 && now. minute() < 10){ LCD.setCursor(5,1); } else if (now.hour() < 10 && now. minute() < 10 && now.second() < 10){ LCD.setCursor(5,1); } else { LCD.setCursor(4,1); } LCD.print(now.hour()); LCD.print(':'); LCD.print(now.minute()); LCD.print(':'); LCD.print(now.second()); delay(33.33); //30 fps LCD.clear(); //update screen}
Also, check that the sketch does not set the time at power on.
I think arduino didn't write time parameter to ds1307 ! :~
//Arduino 1.0+ Only//Arduino 1.0+ Only// pre-set the time in the void then use reset button to set it!#include "Wire.h"#define DS1307_ADDRESS 0x68byte zero = 0x00; //workaround for issue #527void setup(){ Wire.begin(); Serial.begin(9600); setDateTime(); //MUST CONFIGURE IN FUNCTION}void loop(){ printDate(); delay(1000);}void setDateTime(){ byte second = 0; //0-59 byte minute = 59; //0-59 byte hour = 11; //0-23 byte weekDay = 2; //1-7 1=Monday byte monthDay = 9; //1-31 byte month = 4; //1-12 byte year = 13; //0-99 Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); //stop Oscillator Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(weekDay)); Wire.write(decToBcd(monthDay)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.write(zero); //start Wire.endTransmission();}byte decToBcd(byte val){// Convert normal decimal numbers to binary coded decimal return ( (val/10*16) + (val%10) );}byte bcdToDec(byte val) {// Convert binary coded decimal to normal decimal numbers return ( (val/16*10) + (val%16) );}void printDate(){ // Reset the register pointer Wire.beginTransmission(DS1307_ADDRESS); Wire.write(zero); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS, 7); int second = bcdToDec(Wire.read()); int minute = bcdToDec(Wire.read()); int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday int monthDay = bcdToDec(Wire.read()); int month = bcdToDec(Wire.read()); int year = bcdToDec(Wire.read()); //print the date EG 3/1/11 23:59:59 Serial.print(month); Serial.print("/"); Serial.print(monthDay); Serial.print("/"); Serial.print(year); Serial.print(" "); Serial.print(hour); Serial.print(":"); Serial.print(minute); Serial.print(":"); Serial.println(second);}
//Arduino 1.0+ Only//Arduino 1.0+ Only#include <LiquidCrystal.h>#include "Wire.h"#define DS1307_ADDRESS 0x68LiquidCrystal lcd(8,9,16,5,6,7);void setup(){ Wire.begin(); Serial.begin(9600); lcd.begin(16, 2); lcd.clear(); // Print a message to the LCD. lcd.print("It is");}void loop(){ printDate(); delay(1000);}byte bcdToDec(byte val) {// Convert binary coded decimal to normal decimal numbers return ( (val/16*10) + (val%16) );}void printDate(){ // Reset the register pointer Wire.beginTransmission(DS1307_ADDRESS); byte zero = 0x00; Wire.write(zero); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS, 7); int second = bcdToDec(Wire.read()); int minute = bcdToDec(Wire.read()); int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday int monthDay = bcdToDec(Wire.read()); int month = bcdToDec(Wire.read()); int year = bcdToDec(Wire.read()); lcd.setCursor(2, 1); switch (weekDay) // Friendly printout the weekday { case 1: lcd.print("MON "); Serial.print("MON "); break; case 2: lcd.print("TUE "); Serial.print("TUE "); break; case 3: lcd.print("WED "); Serial.print("WED "); break; case 4: lcd.print("THU "); Serial.print("THU "); break; case 5: lcd.print("FRI "); Serial.print("FRI "); break; case 6: lcd.print("SAT "); Serial.print("SAT "); break; case 7: lcd.print("SUN "); Serial.print("SUN "); break; } Serial.print(monthDay); Serial.print("/"); Serial.print(month); Serial.print("/"); Serial.print(year); Serial.print(" "); Serial.print(hour); Serial.print(":"); Serial.print(minute); Serial.print(":"); Serial.println(second); lcd.setCursor(8,1); lcd.print(monthDay); lcd.print("/"); lcd.print(month); lcd.print("/"); lcd.print(year); lcd.setCursor(8,0); lcd.print(hour); lcd.print(":"); lcd.print(minute); lcd.print(":"); lcd.print(second); lcd.println(" "); }