#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
const int colonne=16;
const int righe=2;
LiquidCrystal_I2C lcd(I2C_ADDR, colonne, righe);
enum stati {fermo, abilita, attivo, disabilita} stato;
bool FIRST=true; // variabile per eseguire codice
// solo la prima volta
unsigned long t1; // delay non bloccante
int t_step; // variabile stabilisce ms del timer per attivare motore
int bt5, bt6; // intercettare stato bottone (fronti di salita e discesa)
int pvbt5, pvbt6; // stato precedente bottone
// dichiaro le funzioni
void go(enum stati st);
void f_fermo();
void f_abilita();
void f_attivo();
void f_disabilita();
//________________________________________________________________
void setup(){
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Attivo...");
delay(1000);
lcd.clear();
pinMode(2, OUTPUT); // dichiaro pin
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
t_step=100;
stato=fermo; // stato iniziale
}
void loop(){
bt5 = !digitalRead(5); // leggo i pulsanti (sono in PULLUP!)
bt6 = !digitalRead(6);
switch(stato){ // ciclo switch-case
case fermo:
f_fermo();
break;
case abilita:
f_abilita();
break;
case attivo:
f_attivo();
break;
case disabilita:
f_disabilita();
break;
}
t_step = map(analogRead(A0), 0, 1023, 100, 0);
pvbt5 = bt5; // memorizzo lo stato del pulsante,
pvbt6 = bt6; // prima di entrare nel loop seguente
}
//________________________________________________________________
// implemento fnzioni
void go(enum stati st){
stato=st;
FIRST=true;
}
void f_fermo(){
if(FIRST){ // azioni da eseguire solo al primo ingresso nel ciclo
Serial.println("fermo");
lcd.setCursor(0, 0);
lcd.print("");
delayMicroseconds(5);
lcd.print("Stato FERMO");
lcd.setCursor(0, 1);
lcd.print("");
FIRST=false;
}
if(pvbt5 && !bt5){
go(abilita);
}
}
void f_abilita(){
if(FIRST){
Serial.println("abilita");
FIRST=false;
}
digitalWrite(4, LOW); // pin in HIGH standard; dare LOW per abilitare
delay(400);
go(attivo);
}
void f_attivo(){
if(FIRST){
Serial.println("attivo");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Stato ATTIVO");
lcd.setCursor(0, 1);
lcd.print(digitalRead(3));
FIRST=false;
t1=millis();
}
if(pvbt5 && !bt5){
go(disabilita);
}
if(pvbt6 && !bt6){
digitalWrite(3, !digitalRead(3));
lcd.setCursor(0, 1);
lcd.print("");
delayMicroseconds(5);
lcd.print(digitalRead(3));
delay(400);
}
if((millis()-t1)>t_step){
digitalWrite(2, !digitalRead(2));
t1=millis();
}
}
void f_disabilita(){
if(FIRST){
Serial.println("disabilita");
FIRST=false;
}
digitalWrite(4, HIGH); // pin in HIGH standard; HIGH disabilita
delay(400);
go(fermo);
}