#include <Wire.h> // libreria per la comunicazione I2C
#include <LiquidCrystal_I2C.h> // libreria per il display LCD I2C
const int fanPin = 9; // il pin digitale a cui è collegata la ventola
const int buttonPin = 2; // il pin digitale a cui è collegato il pulsante
const int incButtonPin = 3; // il pin digitale a cui è collegato il pulsante per aumentare il tempo di attesa
const int decButtonPin = 4; // il pin digitale a cui è collegato il pulsante per diminuire il tempo di attesa
unsigned long previousMillis = 0; // memorizza il tempo dell'ultima attivazione della ventola
unsigned long delayTime = 5000UL; // tempo di attesa iniziale di 5 secondi
boolean fanOn = false; // indica se la ventola è accesa o spenta
boolean buttonPressed = false; // indica se il pulsante è stato premuto
const unsigned long minDelayTime = 0UL; // tempo di attesa minimo di 0 secondi
const unsigned long maxDelayTime = 1800000UL; // tempo di attesa massimo di 30 minuti in millisecondi
LiquidCrystal_I2C lcd(0x27, 16, 2); // crea un oggetto per il display LCD I2C
void setup() {
pinMode(fanPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(incButtonPin, INPUT_PULLUP);
pinMode(decButtonPin, INPUT_PULLUP);
lcd.init(); // inizializza il display LCD
lcd.backlight(); // accendi la retroilluminazione del display
lcd.setCursor(0, 0);
lcd.print("Fan delay");
}
void loop() {
unsigned long currentMillis = millis(); // memorizza il tempo attuale
// leggi il valore dei pulsanti e calcola il tempo di attesa
if (digitalRead(incButtonPin) == LOW && delayTime < maxDelayTime) {
delayTime += 1000;
}
if (digitalRead(decButtonPin) == LOW && delayTime > minDelayTime) {
delayTime -= 1000;
}
if (!fanOn && currentMillis - previousMillis >= delayTime) { // accendi la ventola se è passato il tempo impostato
digitalWrite(fanPin, HIGH);
fanOn = true;
}
if (!buttonPressed && digitalRead(buttonPin) == LOW) { // se il pulsante viene premuto, spegni la ventola
digitalWrite(fanPin, LOW);
fanOn = false;
buttonPressed = true;
}
// altre operazioni da eseguire durante il funzionamento della ventola
// visualizza il tempo rimanente sul display LCD I2C
if (fanOn) {
unsigned long remainingTime = (delayTime * 2) - (currentMillis - previousMillis); // calcola il tempo rimanente
lcd.setCursor(0, 0);
lcd.print("Time remaining:");
lcd.setCursor(0, 1);
lcd.print(remainingTime / 60000);
lcd.print(" min ");
lcd.print((remainingTime / 1000) % 60);
lcd.print(" sec ");
}
// spegni la ventola dopo 30 minuti
if (fanOn && currentMillis - previousMillis >= delayTime * 2) {
digitalWrite(fanPin, LOW);
fanOn = false;
previousMillis = currentMillis;
}
}