/*
Scrivere un programma che realizzi una teiera automatica tale che:
- si accenda premendo il pulsante A, alla cui pressione si mette a blinkare il led S di stato dell'acqua che così indica che la temperatura ancora non è quella giusta.
- Una pressione del pulsante A mentre il led S blinka non ha alcun effetto.
- l'acqua è a temperatura quando, dopo 10 secondi, il led S non blinka più ma è a luminosità fissa
- premere il pulsante A con il led S è fisso mette in azione la erogazione del te da un ugello, segnalata da un led E acceso
- l'erogazione termina dopo 3 secondi, passati i quali il led E si spegne.
- una pressione prolungata del pulsante A (più di 3 secondi) spegne la teiera disattivando tutti i led.
*/
#include "urutils.h"
int led_E=13;
int led_A=12;
int pulsante1=14;
int state;
DiffTimer t1, t2;
enum Stati{
SPENTO,
RISCALDAMENTO,
BOLLITURA,
EROGAZIONE
};
void blink(int led) {
digitalWrite(led, !digitalRead(led));
}
void setup(){
pinMode(pulsante1, INPUT);
pinMode(led_E, OUTPUT);
pinMode(led_A, OUTPUT);
Serial.begin(115200);
state = SPENTO; // inizialmente l'acqua è fredda
t2.stop();
}
void loop(){
if(state == SPENTO){
Serial.println("SPENTO");
if(digitalRead(pulsante1)==HIGH){
waitUntilInputLow(pulsante1, 50); //fronte di discesa
state = RISCALDAMENTO;
Serial.println("RISCALDAMENTO");
t1.start();
t1.reset();
t2.start();
t2.reset();
}
}else if(state == RISCALDAMENTO){
// eseguo il blink del led A
if(t1.get() < 10000){
if (t2.get() > 1000) { // polling timer blink
t2.reset(); // riarmo timer blink
Serial.println("blink");
blink(led_A);
}
}else{
t1.stop();
t2.stop();
digitalWrite(led_A, HIGH);
state = BOLLITURA;
Serial.println("BOLLITURA");
}
}else if(state == BOLLITURA){
if(digitalRead(pulsante1)==HIGH){
t1.start();
t1.reset();
waitUntilInputLow(pulsante1, 50); //fronte di discesa
if(t1.get() > 3000){
// spegnimento
digitalWrite(led_E, LOW);
digitalWrite(led_A, LOW);
state = SPENTO;
Serial.println("SPENTO");
}else{
t1.stop();
state = EROGAZIONE;
Serial.println("EROGAZIONE");
t2.start();
t2.reset();
}
}
}else if(state == EROGAZIONE){
if(t2.get() < 3000){
digitalWrite(led_E, HIGH);
}else{
t2.stop();
digitalWrite(led_E, LOW);
state = BOLLITURA;
Serial.println("BOLLITURA");
}
}
delay(10);
}