#define LED1 2 //Magnetron state light RED
#define LED2 3 //Oven inner light ORANGE
#define LED3 4 //Cooking blinking indicator BLUE
#define BUTTON1 5 //On/Off button RED
#define BUTTON2 6 //Door button BLUE
void blinkLED3();
const unsigned int timerMaximumValueSeconds=120;
unsigned int setTimeSeconds;
unsigned int cookingTime;
unsigned long lastTimePrinted=millis();
unsigned long lastCookingTimeIncrement=0;
bool stateLastOnOffButton=HIGH;
bool stateLastDoorButton=HIGH;
bool isOnOffButtonPressed=false;
bool isDoorClosed=true;
typedef enum {
IDLE, COOKING, PAUSED}
STATES;
STATES mainState=IDLE;
void setup() {
// set LED pins as OUTPUT
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(BUTTON1, INPUT_PULLUP);
pinMode(BUTTON2, INPUT_PULLUP);
Serial.begin(115200);
delay(200);
}
void loop() {
//on/off button readout and state change
bool stateActualOnOffButton=digitalRead(BUTTON1);
if (stateActualOnOffButton != stateLastOnOffButton){
stateLastOnOffButton = stateActualOnOffButton;
if(LOW == stateActualOnOffButton){
isOnOffButtonPressed=true;
}
delay(50);
}
//door button readout and state change
bool stateActualDoorButton=digitalRead(BUTTON2);
if (stateActualDoorButton != stateLastDoorButton){
stateLastDoorButton = stateActualDoorButton;
isDoorClosed=!isDoorClosed;
delay(50);
}
switch (mainState){
case IDLE:{
//timer readout
uint16_t timerReadout = analogRead(A0);
if(timerReadout > 1023) timerReadout = 1023; // 10 bit fix
setTimeSeconds=((float)timerMaximumValueSeconds/1023)*timerReadout;
//print set time every second
if (lastTimePrinted+1000 <= millis()){
lastTimePrinted=millis();
uint8_t printedTimeSeconds=setTimeSeconds%60;
uint8_t printedTimeMinutes=setTimeSeconds/60;
char printedTime[20];
sprintf(printedTime, "Set time: %02i:%02i",printedTimeMinutes,printedTimeSeconds);
Serial.println(printedTime);
}
//LED2
if (!isDoorClosed){
digitalWrite(LED2,HIGH);}
else{
digitalWrite(LED2,LOW);
}
//start cooking if conditions met
if (isDoorClosed && isOnOffButtonPressed && setTimeSeconds>0){
cookingTime=setTimeSeconds;
isOnOffButtonPressed=false;
lastCookingTimeIncrement=millis();
mainState=COOKING;
Serial.println("Cooking started!");
}
else if (setTimeSeconds>0||isDoorClosed) isOnOffButtonPressed=false;
break;
}
case COOKING:{
if (lastCookingTimeIncrement+1000<=millis()){
cookingTime--;
lastCookingTimeIncrement=millis();
uint8_t printedTimeSeconds=cookingTime%60;
uint8_t printedTimeMinutes=cookingTime/60;
char printedTime[20];
sprintf(printedTime, "Cooking time remaining: %02i:%02i",printedTimeMinutes,printedTimeSeconds);
Serial.println(printedTime);
}
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
blinkLED3();
if (cookingTime<=0){
mainState=IDLE;
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
Serial.println("Cooking done, waiting for next session.");
}
if (isOnOffButtonPressed){
mainState=IDLE;
cookingTime=0;
isOnOffButtonPressed=false;
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
Serial.println("Cooking stopped!");
}
if (!isDoorClosed){
mainState=PAUSED;
digitalWrite(LED1, LOW);
Serial.println("Cooking paused!");
}
break;
}
case PAUSED:{
if (!isDoorClosed) digitalWrite(LED2, HIGH);
else digitalWrite(LED2, LOW);
blinkLED3();
if (lastCookingTimeIncrement+1000<=millis()){
lastCookingTimeIncrement=millis();
uint8_t printedTimeSeconds=cookingTime%60;
uint8_t printedTimeMinutes=cookingTime/60;
char printedTime[20];
sprintf(printedTime, "Cooking time remaining: %02i:%02i",printedTimeMinutes,printedTimeSeconds);
Serial.println(printedTime);
}
if (isOnOffButtonPressed && !isDoorClosed){
mainState=IDLE;
cookingTime=0;
isOnOffButtonPressed=false;
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
Serial.println("Cooking stopped!");
}
if (isOnOffButtonPressed && isDoorClosed){
mainState=COOKING;
isOnOffButtonPressed=false;
Serial.println("Cooking continued!");
}
break;
}
}
}
void blinkLED3(){
static unsigned long lastLED3BlinkTime;
if (lastLED3BlinkTime+100<=millis()){
lastLED3BlinkTime=millis();
digitalWrite(LED3,!digitalRead(LED3));
}
}