#include <PollingTimer.h>
#include <AbleButtons.h>
#include <LiquidCrystal_I2C.h>
#define gLed 13
#define yLed 12
#define rLed 11
#define Grelec 10
#define MotorCCW 9
#define MotorCW 8
#define gGumb 2
#define yGumb 3
#define rGumb 4
#define NotAus 5
#define sclE A5
#define sdaE A4
LiquidCrystal_I2C lcd(0x27, 16, 2);
using Button = AblePullupClickerButton ;
using ButtonList = AblePullupClickerButtonList ;
Button startButton(gGumb);
Button breakButton(yGumb);
Button stopButton(rGumb);
Button NotAusButton(NotAus);
Button *btns[] = {
&startButton,
&breakButton,
&stopButton,
&NotAusButton
};
ButtonList btnList(btns);
PollingTimer CasFaze;
PollingTimer TimerSusenja;
int Izhodi[]={MotorCW,MotorCCW,Grelec};
int Faza[4][4]={{LOW,HIGH,HIGH,5},{HIGH,HIGH,LOW,2},{HIGH,LOW,HIGH,5},{HIGH,HIGH,LOW,2}};
char SeznamStanj[]={'R','B','S','E'};
char Stanje='S';
int IndexEkrana=0; //0:Osnovni meni v STOP,1:Urejanje časa,2:Sušenje,3:Pavza,4:Konec Sušenja
int FazaNo=0;
int Start=false;
bool btnFlag=false;
bool Varnost=false;
int CasSusenja=0;
int CasSusenjaPrikaz[]={0,0};
int PreostaliCasPrikaz[]={0,0};
int PreostaliCas=0;
char pCb[80];
char cSb[80];
void setup() {
Serial.begin(9600);
pinMode(Grelec, OUTPUT);
pinMode(MotorCW, OUTPUT);
pinMode(MotorCCW, OUTPUT);
pinMode(gLed, OUTPUT);
pinMode(yLed, OUTPUT);
pinMode(rLed, OUTPUT);
Button::setHeldTime(2000);
btnList.begin();
lcd.init();
lcd.backlight();
}
void loop() {
btnList.handle();
Button1();
switch (Stanje){
case 'S':
IndexEkrana=0;
digitalWrite(rLed, HIGH);
digitalWrite(gLed, LOW);
digitalWrite(yLed, LOW);
for(int i=0;i<3;i++){
digitalWrite(Izhodi[i],LOW);
}
TimerSusenja.stop();
CasFaze.stop();
FazaNo=0;
break;
case 'R':
IndexEkrana=2;
digitalWrite(gLed, HIGH);
digitalWrite(rLed, LOW);
digitalWrite(yLed, LOW);
for(int i=0;i<3;i++){
digitalWrite(Izhodi[i],Faza[FazaNo][i]);
}
Cikel();
if(TimerSusenja.isRunning()&TimerSusenja.sec()>=CasSusenja){
TimerSusenja.stop();
Serial.println("Timer");
Stanje='E';
}
PreostaliCas=CasSusenja-int(TimerSusenja.sec());
break;
case 'B':
IndexEkrana=3;
digitalWrite(yLed, HIGH);
digitalWrite(rLed, LOW);
digitalWrite(gLed, LOW);
for(int i=0;i<3;i++){
digitalWrite(Izhodi[i],LOW);
}
break;
case 'E':
IndexEkrana=4;
CasSusenja=0;
PreostaliCas=0;
TimerSusenja.stop();
CasFaze.stop();
for(int i=0;i<3;i++){
digitalWrite(Izhodi[i],LOW);
}
break;
}
Ekran();
}
void Button1(){
if(!btnList.anyPressed()){
btnFlag=false;
}
Varnost=NotAusButton.isPressed();
switch(Stanje){
case 'S':
if(startButton.isHeld()&!btnFlag&!Varnost){
Stanje='R';
CasFaze.start();
TimerSusenja.start();
Serial.println("START");
btnFlag=true;
}
if(breakButton.resetClicked()&!btnFlag){CasSusenja+=10;Serial.println(CasSusenja);}
if(stopButton.resetClicked()&!btnFlag&CasSusenja>0){CasSusenja-=10;Serial.println(CasSusenja);}
break;
case 'R':
if(breakButton.isHeld()&!btnFlag&!Varnost){
Stanje='B';
CasFaze.pause();
TimerSusenja.pause();
Serial.println("BREAK");
btnFlag=true;
}
else if(stopButton.isHeld()&!btnFlag){
Stanje='S';
Serial.println("STOP");
btnFlag=true;
}
else if(Varnost){
Stanje='B';
CasFaze.pause();
TimerSusenja.pause();
Serial.println("VARNOST");
}
break;
case 'B':
if(startButton.isHeld()&!btnFlag&!Varnost){
Stanje='R';
CasFaze.play();
TimerSusenja.play();
btnFlag=true;
}
if(stopButton.isHeld()&!btnFlag){Stanje='S';CasSusenja=0;PreostaliCas=0;;btnFlag=true;}
break;
case 'E':if(btnList.anyHeld()&!btnFlag){Stanje='S';btnFlag=true;}
}
}
void Cikel(){
if(CasFaze.sec()>Faza[FazaNo][3]){
CasFaze.stop();
FazaNo++;
if (FazaNo>3){
FazaNo=0;
}
Serial.println(FazaNo+1);
CasFaze.start();
}
}
void Ekran(){
CasSusenjaPrikaz[0]=CasSusenja/60;CasSusenjaPrikaz[1]=CasSusenja%60;
PreostaliCasPrikaz[0]=PreostaliCas/60;PreostaliCasPrikaz[1]=PreostaliCas%60;
sprintf(pCb, "Preostalo: %02d:%02d", PreostaliCasPrikaz[0], PreostaliCasPrikaz[1]);
sprintf(cSb, "Zeljeno: %02d:%02d", CasSusenjaPrikaz[0], CasSusenjaPrikaz[1]);
switch(IndexEkrana){
case 0:
lcd.setCursor(0,0);
lcd.print("MIROVANJE ");
lcd.setCursor(0,1);
lcd.print(cSb);
break;
case 1:
break;
case 2:
lcd.setCursor(0,0);
lcd.print("SUSENJE ");
lcd.setCursor(0,1);
lcd.print(pCb);
break;
case 3:
lcd.setCursor(0,0);
lcd.print("PAVZA ");
lcd.setCursor(0,1);
lcd.print(pCb);
break;
case 4:
lcd.setCursor(0,0);
lcd.print("KONCANO ");
lcd.setCursor(0,1);
lcd.print(pCb);
break;
}
}