/**
* @file Led_task.ino
* @brief Gestione non bloccante del lampeggio di un LED
*
* @description
* Questo sketch implementa un sistema di controllo LED con lampeggio
* non bloccante utilizzando la tecnica del polling temporale.
* Permette l'esecuzione di altri task nel loop principale senza
* utilizzare delay() che bloccherebbe l'intero programma.
*
* @url https://wokwi.com/projects/386524551201709057
* @author Filippo Bilardo
* @date 14/02/2026
* @version 1.1
*/
const int LED_PIN = 4; // Pin a cui è collegato il LED
int led_stato=0; // Led spento
void led_configura() {
pinMode(LED_PIN, OUTPUT);
}
void led_accendi() {
digitalWrite(LED_PIN, HIGH);
led_stato=HIGH;
}
void led_spegni() {
digitalWrite(LED_PIN, LOW);
led_stato=LOW;
}
void led_inverti() {
(led_stato == LOW) ? led_accendi() : led_spegni();
}
/**
* Task non bloccante per far lampeggiare il LED
* @param durata_ms Intervallo di lampeggio in millisecondi
*/
void led_lampeggiaTask(int durata_ms) {
// Variabile statica: mantiene il suo valore tra le chiamate successive
// della funzione. Viene inizializzata una sola volta all'avvio del programma.
// Essendo locale, è accessibile solo all'interno di questa funzione.
static unsigned long ultimoCambio = 0;
unsigned long timerNow = millis();
if (timerNow - ultimoCambio >= durata_ms) {
ultimoCambio = timerNow;
led_inverti();
}
}
void setup() {
led_configura(); // Imposta il pin del LED come output
}
void loop() {
led_lampeggiaTask(200); // Fai lampeggiare il LED ogni 200
// Altro task ...
// Altro task ...
}