#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
// Impostazioni display LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Cambia 0x27 se necessario
// Definizione dei pin per l'encoder e per i relay
const int encoderPinA = 2;
const int encoderPinB = 3;
const int buttonPin = 4;
const int lightPin = 8; // Relay per la luce
const int fanPin = 9; // Relay per la ventola
// Encoder e variabili di stato
Encoder encoder(encoderPinA, encoderPinB);
int menuPosition = 0;
bool lightState = false;
bool fanState = false;
long encoderPosition = -999;
bool lastButtonState = HIGH;
void setup() {
lcd.begin(16, 2);
lcd.backlight();
pinMode(buttonPin, INPUT_PULLUP); // Pulldown sul pulsante encoder
pinMode(lightPin, OUTPUT);
pinMode(fanPin, OUTPUT);
// Imposta relay (Light e Fan) su OFF inizialmente
digitalWrite(lightPin, LOW);
digitalWrite(fanPin, LOW);
// Messaggio di benvenuto
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" SPRAY BOOTH");
lcd.setCursor(0, 1);
lcd.print("By GQ Electronics");
delay(2000);
lcd.clear();
}
void loop() {
// Leggi la posizione dell'encoder per il menu
long newPos = encoder.read() / 4;
if (newPos != encoderPosition) {
encoderPosition = newPos;
menuPosition = constrain(encoderPosition, 0, 1); // Limita il menu a 0 o 1
displayMenu();
}
// Leggi lo stato del pulsante e attiva il relay corrispondente
bool buttonState = digitalRead(buttonPin);
if (buttonState == LOW && lastButtonState == HIGH) { // rileva solo la pressione
delay(50); // debounce
toggleRelay();
}
lastButtonState = buttonState;
}
// Funzione per visualizzare il menu e lo stato dei relay
void displayMenu() {
lcd.clear();
if (menuPosition == 0) {
lcd.setCursor(0, 0);
lcd.print("> Light:");
lcd.setCursor(10, 0);
lcd.print(lightState ? "ON " : "OFF");
lcd.setCursor(0, 1);
lcd.print(" Fan :");
lcd.setCursor(10, 1);
lcd.print(fanState ? "ON " : "OFF");
} else if (menuPosition == 1) {
lcd.setCursor(0, 0);
lcd.print(" Light:");
lcd.setCursor(10, 0);
lcd.print(lightState ? "ON " : "OFF");
lcd.setCursor(0, 1);
lcd.print("> Fan :");
lcd.setCursor(10, 1);
lcd.print(fanState ? "ON " : "OFF");
}
}
// Funzione per attivare o disattivare il relay selezionato
void toggleRelay() {
if (menuPosition == 0) {
lightState = !lightState;
digitalWrite(lightPin, lightState ? HIGH : LOW);
} else if (menuPosition == 1) {
fanState = !fanState;
digitalWrite(fanPin, fanState ? HIGH : LOW);
}
displayMenu(); // Aggiorna lo schermo con il nuovo stato
}