Hi again,
I have test and try and now the code is complete.
Here if anybody want to know:
#include <Wire.h>
#include <LiquidCrystal.h>
#define DS1307_ADDRESS 0x68 // This is the I2C address
// SainSmart LCD 16x2
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
// Arduino Mega 2560
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; // Target brightness is 3/4 of full
void setup()
{
lcd.begin(16, 2);
Wire.begin();
}
byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}
void loop()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("***");
lcd.setCursor(4,0);
///// Get time from RTC into RTCHour, RTCMinute, RTCSecond
// Set the register pointer to 0 (Second)
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write((byte)0);
Wire.endTransmission();
// Read Second, Minute, and Hour
Wire.requestFrom(DS1307_ADDRESS, 3);
int RTCSecond = bcdToDec(Wire.read());
int RTCMinute = bcdToDec(Wire.read());
int RTCHour = bcdToDec(Wire.read() & 0b111111); //24 hour time
// write Time to LCD XX:XX:XX
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
// write value within the timeframe to PWM
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);
// write actual value in % to LCD (max. 255 = 100%)
lcd.setCursor(0,1); //White3Pin
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); //Blue1Pin
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); //Blue2Pin
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); //White4Pin
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)
{
// Mid day, light is at maximum brightness
if (time >= fadeUpStart + HOUR && time <= fadeDownStart)
return TARGET_BRIGHTNESS;
// Dawn: fade up the light
if (time >= fadeUpStart && time <= fadeUpStart + HOUR) // Fading up
{
unsigned long seconds = time - fadeUpStart; // Number of seconds into the fade time
return TARGET_BRIGHTNESS * seconds / (HOUR); // Fade up based on portion of interval completed.
}
// Evening: Fade down the light
if (time >= fadeDownStart && time <= fadeDownStart + HOUR) // Fading down
{
unsigned long seconds = (fadeDownStart + (HOUR)) - time; // Number of seconds remaining in the fade time
return TARGET_BRIGHTNESS * seconds / (HOUR); // Fade down based on portion of interval left.
}
// The remaining times are night and the lights is off
return 0; // Shouldn't get here
}
Please feel free to write me, if I can something change ...
Again, thank you "johnwasser" for your help with the main code!