Hi,
I have problems to program a menu for setup a clock for my project.
The project is a LED Aquarium lamp and the code below is running very good.
Unfortunately the clock shows after some days the wrong time (the module is faster than the real time).
Now what I need is the code for a menu to set the clock.
I use a Arduino Mega 2560 with SainSmart 1602 (16x2) and a RTC Clock Modul DS1307 and arduino 1.0.
The SainSmart 1602 has 6 buttons http://www.sainsmart.com/sainsmart-1602-lcd-keypad-shield-for-arduino-duemilanove-uno-mega2560-mega1280.html.
Can anyone help me with the code for a menu?
Is it also possible to have a additional menu to set the time for dimming? (it is not needful but nice to have)
Here is the actual code from the project and its function very well, except the faster running clock module
#include <Wire.h>
#include <LiquidCrystal.h>
#define DS1307_ADDRESS 0x68
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
const int Blue1Pin = 2;
const int Blue2Pin = 3;
const int White3Pin = 11;
const int White4Pin = 12;
const int Night1Pin = 13;
const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const int TARGET_BRIGHTNESS = (255 * 3) / 4;
void setup()
{
lcd.begin(16, 2);
Wire.begin();
}
byte bcdToDec(byte val) {
return ( (val/16*10) + (val%16) );
}
void loop()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("<");
lcd.setCursor(4,0);
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write((byte)0);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 3);
int RTCSecond = bcdToDec(Wire.read());
int RTCMinute = bcdToDec(Wire.read());
int RTCHour = bcdToDec(Wire.read() & 0b111111);
if(RTCHour < 10) {
lcd.print("0");
}
lcd.print(RTCHour);
lcd.print(":");
if(RTCMinute < 10) {
lcd.print("0");
}
lcd.print(RTCMinute);
lcd.print(":");
if(RTCSecond < 10) {
lcd.print("0");
}
lcd.print(RTCSecond);
lcd.setCursor(13,0);
lcd.print(">");
unsigned long time = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond; // Time in seconds
analogWrite(Blue1Pin, brightness(time, 7*HOUR, 19*HOUR));
analogWrite(Blue2Pin, brightness(time, 7*HOUR+30*MINUTE, 19*HOUR+30*MINUTE));
analogWrite(White3Pin, brightness(time, 8*HOUR+30*MINUTE, 16*HOUR+30*MINUTE));
analogWrite(White4Pin, brightness(time, 9*HOUR+30*MINUTE, 17*HOUR+30*MINUTE));
analogWrite(Night1Pin, TARGET_BRIGHTNESS);
lcd.setCursor(0,1);
if(((brightness(time, 8*HOUR+30*MINUTE, 16*HOUR+30*MINUTE))*100/255) < 10) {
lcd.print("0");
}
lcd.print((brightness(time, 8*HOUR+30*MINUTE, 16*HOUR+30*MINUTE))*100/255);
lcd.print("%");
lcd.setCursor(4,1);
if(((brightness(time, 7*HOUR, 19*HOUR))*100/255) < 10) {
lcd.print("0");
}
lcd.print((brightness(time, 7*HOUR, 19*HOUR))*100/255);
lcd.print("%");
lcd.setCursor(8,1);
if(((brightness(time, 7*HOUR+30*MINUTE, 19*HOUR+30*MINUTE))*100/255) < 10) {
lcd.print("0");
}
lcd.print((brightness(time, 7*HOUR+30*MINUTE, 19*HOUR+30*MINUTE))*100/255);
lcd.print("%");
lcd.setCursor(12,1);
if(((brightness(time, 9*HOUR+30*MINUTE, 17*HOUR+30*MINUTE))*100/255) < 10) {
lcd.print("0");
}
lcd.print((brightness(time, 9*HOUR+30*MINUTE, 17*HOUR+30*MINUTE))*100/255);
lcd.print("%");
delay(1000);
}
byte brightness(unsigned long time, unsigned long fadeUpStart, unsigned long fadeDownStart)
{
if (time >= fadeUpStart + HOUR && time <= fadeDownStart)
return TARGET_BRIGHTNESS;
if (time >= fadeUpStart && time <= fadeUpStart + HOUR)
{
unsigned long seconds = time - fadeUpStart;
return TARGET_BRIGHTNESS * seconds / (HOUR);
}
if (time >= fadeDownStart && time <= fadeDownStart + HOUR)
{
unsigned long seconds = (fadeDownStart + (HOUR)) - time;
return TARGET_BRIGHTNESS * seconds / (HOUR);
}
return 0;
}