#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define inDelkaOsvit A0 //delka osvitu
#define inTlacReset A2 //A2 tlacitko
#define inTlacStart A1 //A1 tlacitko
#define modraLED 2 //D2 LED dioda
#define cervenaLED 4 //D4 LED dioda
#define blikaLED 6 //D6 LED dioda
#define SECS_PER_MIN (60UL)
#define numberOfSeconds(_time_) (_time_ % SECS_PER_MIN)
#define numberOfMinutes(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN)
//secondsOsvit %= 60; // celociselny zbytek po deleni (72%60 = 12)
int delkaOsvitVal = 0;
int delkaOsvitMin = 0;
boolean tlacStart = false;
boolean tlacReset = false;
boolean ledBlikat = false;
boolean zobrazNula = false;
unsigned long delkaOsvitMillis;
unsigned long startMillis;
unsigned long currentMillis;
unsigned long currentRozdilMillis;
long delkaIntervalMls;
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(9600);
pinMode(modraLED, OUTPUT);
pinMode(cervenaLED, OUTPUT);
pinMode(blikaLED, OUTPUT);
pinMode(inTlacStart,INPUT);
pinMode(inTlacReset,INPUT);
digitalWrite(cervenaLED, HIGH);
digitalWrite(modraLED, LOW);
digitalWrite(blikaLED, LOW);
// initialize the LCD
lcd.init();
//lcd.init();
lcd.backlight();
lcd.clear();
//zobrazInitHodnoty();
delkaOsvitVal = analogRead(inDelkaOsvit);
delkaOsvitMillis = map(delkaOsvitVal, 0, 1023, 360000, 1200000);
}
void loop() {
//Serial.print(delkaOsvitVal);
//Serial.print(" Delka min: ");
//Serial.println(delkaOsvitMillis);
// zmacknuto tlacitko Start
if (digitalRead(inTlacStart) == 1 && tlacStart == false) {
tlacStart = true;
tlacReset = false;
ledBlikat = false;
digitalWrite(cervenaLED, LOW);
digitalWrite(modraLED, HIGH);
digitalWrite(blikaLED, LOW);
startMillis = millis();
lcd.clear();
}
// zmacknuto tlacitko Reset
if (digitalRead(inTlacReset) == 1 && tlacReset == false) {
tlacReset = true;
tlacStart = false;
ledBlikat = false;
zobrazNula = false;
digitalWrite(cervenaLED, HIGH);
digitalWrite(modraLED, LOW);
digitalWrite(blikaLED, LOW);
}
if (ledBlikat) {
digitalWrite(blikaLED, (millis() / 1000) % 2);
}
if (tlacStart) {
currentMillis = millis();
currentRozdilMillis = (currentMillis - startMillis);
if (currentRozdilMillis >= delkaOsvitMillis) {
tlacStart = false;
digitalWrite(cervenaLED, HIGH);
digitalWrite(modraLED, LOW);
digitalWrite(blikaLED, HIGH);
ledBlikat = true;
zobrazNula = true;
zobrazHodnoty(delkaOsvitMillis/1000,0000);
}
zobrazHodnoty(delkaOsvitMillis/1000,(delkaOsvitMillis-currentRozdilMillis)/1000);
} else {
delkaOsvitVal = analogRead(inDelkaOsvit);
delkaOsvitMillis = map(delkaOsvitVal, 0, 1023, 360000, 1200000);
if (zobrazNula) {
zobrazHodnoty(delkaOsvitMillis/1000,0000);
} else {
zobrazHodnoty(delkaOsvitMillis/1000,delkaOsvitMillis/1000);
}
}
}
String getTimeStr(int seconds, int minutes) {
String minut;
String sec;
if(minutes < 10) {
minut = String("0") + String(minutes);
} else {
minut = String(minutes);
}
if(seconds < 10) {
sec = String("0") + String(seconds);
} else {
sec = String(seconds);
}
return String(minut) + String(":") + sec;
}
void zobrazHodnoty(long nastaveno, long odpocet) {
//delay(500);
//lcd.clear();
int minutesN = numberOfMinutes(nastaveno);
int secondsN = numberOfSeconds(nastaveno);
String casNastaven = getTimeStr(secondsN,minutesN);
int minutesO = numberOfMinutes(odpocet);
int secondsO = numberOfSeconds(odpocet);
String casOdpocet = getTimeStr(secondsO,minutesO);
lcd.setCursor(0, 0);
lcd.print("NAST. CAS:");
lcd.setCursor(11, 0);
lcd.print(" ");
lcd.setCursor(11, 0);
lcd.print(casNastaven);
lcd.setCursor(0, 1);
lcd.print("SKUT. CAS:");
lcd.setCursor(11, 1);
lcd.print(" ");
lcd.setCursor(11, 1);
lcd.print(casOdpocet);
}