#include <EEPROM.h>
#define led_1 11 // assegno il pin 11 alla variabile led_1 che è usato per il LED 1 ( apre specchi )
#define led_2 12 // assegno il pin 12 alla variabile led_2 che è usato per il LED 2 ( chiude specchi )
#define puls 2
unsigned long tempo = 4000; // valore di temporizzazione per apertura/chiusura specchi
unsigned long t1;
int stato;
int in;
enum Stati {CHIUSO, APERTURA, APERTO, CHIUSURA};
void setup()
{
Serial.begin(115200);
stato = EEPROM.read(71); // legge il dato memorizzato alla posizione 71 della EEProm
if (stato > CHIUSURA)
stato = CHIUSO; // Evitiamo valori "non contemplati" in caso di EEPROM non scritta
pinMode(2, INPUT_PULLUP); // definisce il pin 2 di arduino come ingresso per il pulsante
pinMode(11, OUTPUT); // definisce il pin 11 come uscita per il pilotaggio del led o del relè
pinMode(12, OUTPUT); // definisce il pin 12 come uscita per il pilotaggio del led o del relè
digitalWrite(led_1, LOW); // parte con l'uscita 1 ( apertura specchi ) a zero cioè fermo
digitalWrite(led_2, LOW); // parte con l'uscita 2 ( chiusura specchi ) a zero cioè fermo
}
void loop()
{
// Lettura dello stato del pulsante con debounce, se premuto in = 1;
static unsigned long debounceTime;
if (!digitalRead(puls) && millis() - debounceTime > 200) {
in = 1;
debounceTime = millis();
Serial.println("Pulsante premuto");
}
// Esecuzione dell'azione in funzione dello stato attuale
switch (stato)
{
case CHIUSO:
if (in)
{
digitalWrite(led_1, HIGH); // accendiamo il LED 1 ( apertura specchi )
t1 = millis(); // leggo quanto vale millis
stato = APERTURA;
Serial.println("Apertura specchietti");
}
break;
case APERTURA:
if ((millis() - t1) >= tempo) // controllo se il tempo è trascorso
{
digitalWrite(led_1, LOW); // spegniamo il LED 1 ( fermo apertura specchi )
stato = APERTO; // cambio stato
EEPROM.write(71, stato); // scrivo la posizione nella EEProm
delay(100); // ritardo per scrittura EEProm
Serial.println("Specchietti aperti");
}
if (in) {
digitalWrite(led_1, LOW);
digitalWrite(led_2, HIGH);
t1 = millis();
stato = CHIUSURA;
Serial.println("Inversione");
}
break;
case CHIUSURA:
if ((millis() - t1) >= tempo) // controllo se il tempo è trascorso
{
digitalWrite(led_2, LOW); // spegniamo il LED 2 ( fermo chiusura specchi )
stato = CHIUSO; // cambio stato
EEPROM.write(71, stato); // scrivo la posizione nella EEProm
delay(100); // ritardo per scrittura EEProm
Serial.println("Specchietti chiusi");
}
if (in) {
digitalWrite(led_1, HIGH);
digitalWrite(led_2, LOW);
t1 = millis();
stato = APERTURA;
Serial.println("Inversione");
}
break;
case APERTO:
if (in)
{
digitalWrite(led_2, HIGH); // accendiamo il LED 1 ( apertura specchi )
t1 = millis(); // leggo quanto vale millis
stato = CHIUSURA;
Serial.println("Chiusura specchietti");
}
break;
}
// A questo punto posso resettare la variabile in
in = 0;
}