/** ****************************************************************************************
* \mainpage
*
* @brief Macchina a stati per il lampeggio del led
* https://wokwi.com/projects/422766164146997249
*
* Diagramma della macchina a stati
* https://www.planttext.com/?text=SoWkIImgAStDuULIK8ZMYbNGrRLJy75rYVTtS-Fb0Wb2EGfM2gvv9KML2leAnGMfwNcP6fh8id1jVa259PcvgKL--UKAkX1cCCWE1JjRCCyf9pClsmSe2GPwI9Ru8TcHc9oScfU2R8aVijE8iiGZCpq3PBm3q2IW3m40
*
* @author Filippo Bilardo
* @version 1.0 14/02/25 Versione iniziale
*/
// -----------------------------------------------------------------
// Led.h
//#ifndef LED_H
//#define LED_H
// Definizione della classe Led
class Led {
public:
// Costruttore della classe Led
Led(int pin, unsigned long tBlinkL, unsigned long tBlinkH);
void accendi();
void spegni();
void inverti();
void lampeggia(int nr);
void lampeggia(int nr, int ritardo);
void setLuminosita(int luminosita);
void test(int nr);
void blinkTask();
private:
// Pin del LED
int pin;
// Durata degli stati in millisecondi
unsigned long tBlinkL;
unsigned long tBlinkH;
// Variabile per la gestione del tempo
unsigned long tStart;
// Stati della macchina a stati finiti
enum State {
LED_OFF,
LED_ON
} state;
};
//#endif //Led.h
// -----------------------------------------------------------------
// Led.cpp
//#include "Arduino.h"
//#include "LED.h"
Led::Led(int pin, unsigned long tBlinkL, unsigned long tBlinkH)
: pin(pin), tBlinkL(tBlinkL), tBlinkH(tBlinkH), state(LED_OFF) {
pinMode(pin, OUTPUT);
}
// Metodo per aggiornare lo stato del LED
void Led::blinkTask() {
unsigned long tNow = millis();
switch (state) {
case LED_OFF:
//Azione do dello stato corrente
//Condizione
if (tNow - tStart >= tBlinkL) {
//Transizione
state = LED_ON;
//Azione exit dello stato corrente
//Azione entry del nuovo stato
tStart = tNow;
accendi();
}
break;
case LED_ON:
//Condizione
if (tNow - tStart >= tBlinkH) {
//Transizione
state = LED_OFF;
//Azione entry del nuovo stato
tStart = tNow;
spegni();
}
break;
}
}
void Led::accendi() {
digitalWrite(pin, HIGH);
}
void Led::spegni() {
digitalWrite(pin, LOW);
}
// -----------------------------------------------------------------
// FSM_Led_task.ino
// Definizione dei pin per ciascun LED
const int LED_PIN_1 = 25;
const int LED_PIN_2 = 26;
const int LED_PIN_3 = 27;
// Creazione delle istanze della classe Led
Led led1(LED_PIN_1, 200, 1000);
Led led2(LED_PIN_2, 300, 300);
Led led3(LED_PIN_3, 700, 200);
void setup() {
}
void loop() {
// Aggiornamento dello stato di ciascun LED
led1.blinkTask();
led2.blinkTask();
led3.blinkTask();
}