// EMULA COMMUTTATHORE A 5 POSIZIONI
// versione con richiamo commuttatore da interrupt
// 2024.02.28
//lo stato contiene il numero del pin da accendere
//il pin 9 non è collegato e corrisponde al caso in cui tutti
//i led sono spenti
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define tasto 2
#define tasto_interrupt 3
volatile bool flag_modifica = false;
volatile bool first = true;
int stato = 9;
int led_posizioni[5] = {9, 10, 11, 12, 13}; // contiene i pin dei led posizione 0, 1, 2, 3, 4
void setup()
{
lcd.init();
lcd.backlight();
for (int i=0; i<5; i++) {
pinMode (led_posizioni[i], OUTPUT);
}
pinMode(tasto, INPUT);
pinMode(tasto_interrupt, INPUT);
attachInterrupt(digitalPinToInterrupt(3), setta, FALLING);
lcd.setCursor(0, 0);
lcd.print(" DEMO");
lcd.setCursor(0, 1);
lcd.print("COMMUTATORE 5pos");
delay(2000);
lcd.clear();
}
void loop()
{
// ciclo loop simula programma in run
for (int k=1; k<101; k++) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(k);
// controlla se deve lanciare la modifica
if(flag_modifica) {
modifica();
}
delay(500);
}
}
void modifica(void) {
do {
if (digitalRead(tasto) == HIGH)
{
stato++;
first=true;
if (stato > 13)
{
stato = 9;
}
delay(200);
}
switch (stato) {
case 9:
// POSIZIONE 0
comm_pos0();
break;
case 10:
// POSIZIONE 1
comm_pos1();
break;
case 11:
// POSIZIONE 2
comm_pos2();
break;
case 12:
// POSIZIONE 3
comm_pos3();
break;
case 13:
// POSIZIONE4
comm_pos4();
break;
}
} while(flag_modifica);
}
void led_on (int led) {
//spengo tutti i led
for (int i=0; i<5; i++) {
digitalWrite (led_posizioni[i], LOW);
}
//accendo il led selezionato
digitalWrite(led_posizioni[led], HIGH);
}
void comm_pos0(void) {
if (first) {
first=false;
led_on(0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("commuttatore a 0");
}
}
void comm_pos1(void) {
if (first) {
first=false;
led_on(1);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("commuttatore a 1");
}
}
void comm_pos2(void) {
if (first) {
first=false;
led_on(2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("commuttatore a 2");
}
}
void comm_pos3(void) {
if (first) {
first=false;
led_on(3);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("commuttatore a 3");
}
}
void comm_pos4(void) {
if (first) {
first=false;
led_on(4);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("commuttatore a 4");
}
}
// Funzione di gestione dell'interrupt
void setta() {
flag_modifica = !flag_modifica;
first = true;
}