#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool first, second, thert;
unsigned long previousMillis = 0;
const long interval = 1000, but = 10000;
unsigned long currentMillis;
const int firstButtonPin = 3,secondButtonPin = 6, thertButtonPin = 5;
bool buttonState,relNow,relStop;
bool firstLastButtonState = HIGH, secondLastButtonState = HIGH, thirtLastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int hourStop = 23,minuteStop = 59,secondStop = 0,
hourStart = 0,minuteStart = 0,
secondStart = 0,lastPress=0;
int releStop = 0,pressPreviousMillis = 0,pressCurentMillis = 0;
bool minuteTrue = false,press = false;
void setup() {
lcd.begin(16, 1);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
pinMode(firstButtonPin, INPUT_PULLUP);
pinMode(secondButtonPin, INPUT_PULLUP);
pinMode(thertButtonPin, INPUT_PULLUP);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
pinMode(2,INPUT);
Serial.begin(115200);
}
bool btnState(bool button, bool lastButtonState){
bool btn_satate = button;
if (btn_satate != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (btn_satate != buttonState) {
buttonState = btn_satate;
}
}
if(button != lastButtonState){
return true;
}else{
return false;
}
lastButtonState = btn_satate;
}
void firstButton(){
DateTime now = rtc.now();
currentMillis = millis();
printTime();
previousMillis = currentMillis;
q:currentMillis = millis();
if (currentMillis - previousMillis >= but){
}
else{
if(btnState(digitalRead(firstButtonPin),firstLastButtonState)){
firstButton();
}
goto q;
}
}
void printTime(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T.ON-");
lcd.print(hourStart);
lcd.print(':');
lcd.print(minuteStart);
lcd.print(':');
lcd.print(secondStart);
lcd.setCursor(0,1);
lcd.print("T.OFF-");
lcd.print(hourStop);
lcd.print(':');
lcd.print(minuteStop);
lcd.print(':');
lcd.print(secondStop);
}
void timer(){
q:currentMillis = millis();
DateTime now = rtc.now();
if (currentMillis - previousMillis >= interval) {
printTime();
if(btnState(digitalRead(secondButtonPin),secondLastButtonState)){
if(minuteTrue == true){
if (minuteStart > 59){
minuteStart = 0;
}else{
minuteStart += 1;
}
}else{
if (hourStart > 23){
hourStart = 0;
}else{
hourStart += 1;
}
goto q;
}
}
else if(btnState(digitalRead(thertButtonPin),thirtLastButtonState)){
if(minuteTrue == true){
if (minuteStart < 1){
minuteStart = 59;
}else{
minuteStart -= 1;
}
}else{
if (hourStart < 1){
hourStart = 23;
}else{
hourStart -= 1;
}
}
}
previousMillis = currentMillis;
}
else if(btnState(digitalRead(firstButtonPin),firstLastButtonState)){
pressPreviousMillis = pressCurentMillis;
while (btnState(digitalRead(firstButtonPin),firstLastButtonState)){
pressCurentMillis = millis();
if(pressCurentMillis - pressPreviousMillis >= interval){
press = true;
}
else{
press = false;
}
btnState(digitalRead(firstButtonPin),firstLastButtonState);
}
if(press == true){
if(minuteTrue != true){
minuteTrue = true;
}
else{
minuteTrue = false;
}
}
else{
goto exit;
}
}
goto q;
exit:;
}
void loop() {
DateTime now = rtc.now();
currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
lcd.clear();
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
previousMillis = currentMillis;
if(hourStart <= now.hour() & minuteStart <= now.minute() &
minuteStart >= now.minute() & hourStop >= now.hour()){
digitalWrite(2, HIGH);
}
else{
digitalWrite(2, LOW);
}
}
pressPreviousMillis = pressCurentMillis;
if(btnState(digitalRead(firstButtonPin),firstLastButtonState)){
while (btnState(digitalRead(firstButtonPin),firstLastButtonState)){
pressCurentMillis = millis();
if(pressCurentMillis - pressPreviousMillis >= interval){
press = true;
}
else{
press = false;
}
btnState(digitalRead(firstButtonPin),firstLastButtonState);
}
if(press != true){
firstButton();
}
else{
timer();
}
}
}