const int startStopButton = 2;
const int runOnlyWaterPump = 3;
const int waterPumpRelay = 11;
const int saltMachineRelay = 12;
// 5 minut
const int saltStartDelay = 60 * 5;
// 15 minut
const int saltStopDelay = 60 * 15;
//const int saltStartDelay = 3;
//const int saltStopDelay = 9;
// 9 hours in seconds
const int workingTimeInDay = 60 * 60 * 9;
// 8 hours in seconds
const int soltingTimeInDay = 60 * 60 * 8;
//const int workingTimeInDay = 60;
//const int soltingTimeInDay = 20;
bool normalMode = false;
bool waterPumpMode = false;
bool salting = false;
bool extraMode = false;
//States
const int idle = 0;
const int startWaterPump = 1;
const int startSaltMachine = 2;
const int running = 3;
const int stopSaltMachine = 4;
const int stopWaterPump = 5;
const int stop = 6;
int mainProcessState = idle;
int waterPumpModeState = idle;
int saltMachineState = idle;
int remainingTime = workingTimeInDay;
int buttonOnOf = 0;
int buttonOnlyPump = 0;
unsigned long t1 = 0;
unsigned long t2 = 0;
unsigned long previousMillis = 0; // Uložení času posledního provedení
// připojení potřebných knihoven
#include <Wire.h>
#include <DS3231.h>
#include <time.h>
// inicializace RTC z knihovny
DS3231 rtc;
RTClib rtcLib;
void setup() {
Serial.begin(9600);
// put your setup code here, to run once:
pinMode(startStopButton, INPUT);
pinMode(runOnlyWaterPump, INPUT);
pinMode(waterPumpRelay, OUTPUT);
pinMode(saltMachineRelay, OUTPUT);
digitalWrite(waterPumpRelay, HIGH);
digitalWrite(saltMachineRelay, HIGH);
Wire.begin();
//constexpr time_t tstmp {1692994290UL};
// feed UnixTimeStamp and don' t use localtime
//rtc.setEpoch(tstmp, false);
// set to 24h
//rtc.setClockMode(false);
rtc.turnOffAlarm(1);
}
void loop() {
// put your main code here, to run repeatedly:
delay(100);
timersIncrease();
waterPumpProcess();
mainProcess();
saltMachineProcess();
nextDayCheck();
}
void mainProcess() {
int buttonOnOf = digitalRead(startStopButton);
switch(mainProcessState) {
case idle:
if((buttonOnOf == HIGH || remainingTime == workingTimeInDay) && waterPumpMode == false) {
if(remainingTime <= 0) {
extraMode = true;
}
normalMode = true;
mainProcessState = startWaterPump;
t1 = 0;
}
break;
case startWaterPump:
digitalWrite(waterPumpRelay, LOW);
if (t1 >= saltStartDelay) {
mainProcessState = startSaltMachine;
}
break;
case startSaltMachine:
salting = true;
mainProcessState = running;
break;
case running:
if(buttonOnOf == HIGH || (remainingTime <= 0 && extraMode == false)) {
extraMode = false;
mainProcessState = stopSaltMachine;
}
break;
case stopSaltMachine:
salting = false;
if (saltMachineState == idle) {
mainProcessState = stopWaterPump;
}
break;
case stopWaterPump:
digitalWrite(waterPumpRelay, HIGH);
mainProcessState = stop;
break;
case stop:
normalMode = false;
mainProcessState = idle;
break;
}
}
void saltMachineProcess() {
switch(saltMachineState) {
case idle:
if(salting == true) {
saltMachineState = startSaltMachine;
}
break;
case startSaltMachine:
digitalWrite(saltMachineRelay, LOW);
saltMachineState = running;
break;
case running:
if(salting == false || remainingTime <= workingTimeInDay - soltingTimeInDay) {
saltMachineState = stopSaltMachine;
}
break;
case stopSaltMachine:
digitalWrite(saltMachineRelay, HIGH);
t2 = 0;
saltMachineState = stop;
break;
case stop:
if(t2 >= saltStopDelay) {
saltMachineState = idle;
}
break;
}
}
void waterPumpProcess() {
int buttonOnlyPump = digitalRead(runOnlyWaterPump);
switch(waterPumpModeState) {
case idle:
if(buttonOnlyPump == HIGH && normalMode == false) {
waterPumpMode = true;
waterPumpModeState = startWaterPump;
delay(400);
}
break;
case startWaterPump:
digitalWrite(waterPumpRelay, LOW);
waterPumpModeState = running;
break;
case running:
if(buttonOnlyPump == HIGH) {
waterPumpModeState = stopWaterPump;
delay(400);
}
break;
case stopWaterPump:
digitalWrite(waterPumpRelay, HIGH);
waterPumpModeState = stop;
break;
case stop:
waterPumpMode = false;
waterPumpModeState = idle;
break;
}
}
void nextDayCheck() {
DateTime time = rtcLib.now();
Serial.println(time.unixtime());
if(rtc.checkAlarmEnabled(1) == LOW) {
rtc.setA1Time(time.day()+1, 8, 0, 0, 0x0, false, false, false);
rtc.turnOnAlarm(1);
}
if(rtc.checkIfAlarm(1) == HIGH) {
remainingTime = workingTimeInDay;
rtc.turnOffAlarm(1);
}
}
void timersIncrease() {
unsigned long currentMillis = millis(); // Aktuální čas
// Interval časovače v milisekundách (1 sekunda)
if (currentMillis - previousMillis >= 1000) {
// Časovač vypršel, provedení kódu
// Sem vložte kód, který se má spustit s určitým intervalem
previousMillis = currentMillis; // Uložení aktuálního času pro příště
t1 += 1;
t2 += 1;
if(mainProcessState == running) {
remainingTime-= 1;
}
}
}