Macchina a stati finiti e Arduino

luca 30 aprile 2013 6

Dopo la pubblicazione dei miei sketch, ricevo spesso domande sul perché al loro interno vada a definire degli stati e più in generale su cosa sia una macchina a stati finiti. In questo tutorial, spiegherò come utilizzare tale modello per realizzare un semplice timer.

SimpleTimer

Utilizzeremo Arduino per realizzare un timer giornaliero, con un solo orario di accensione e spegnimento. Collegheremo Arduino ad un RTC (real-time clock) per avere l’ora corrente e ad un relay per controllare una lampadina.

Ho scelto di utilizzare due breakout board, una per l’integrato DS1307 (RTC) e una per il relay, così collegate ad Arduino:

L’integrato DS1307 ha una interfaccia i2c, utilizziamo quindi i PIN A4 (SDA) e A5 (SCL), mentre il modulo relay richiede un solo PIN digitale (nell’esempio il PIN 2).

RTC e Arduino

Per leggere l’orario dal modulo RTC, ho scelto la libreria RTCLib fornita da Adafruit, già usata in un precedente post.

Il suo utilizzo è semplice: per prima cosa dobbiamo includere nello sketch due files:

#include <Wire.h>
#include "RTClib.h"

Quindi definiamo un nuovo oggetto RTC_DS1307:

RTC_DS1307 RTC;

All’interno del setup(), inizializziamo la libreria Wire (i2c) e l’oggetto RTC:

Wire.begin();
RTC.begin();

Per leggere l’orario corrente, è quindi sufficiente chiamare il metodo now(), che restituisce un oggetto DateTime. Questo oggetto ha poi metodi per recuperare le varie parti (giorno, ora, minuto…) di data e ora:

DateTime now = RTC.now();
int hour = now.hour();
[...]

MSF

Una macchina a stati finiti è un modello che descrive il comportamento di un sistema. Il sistema può avere un numero finito di stati e in ogni istante può essere in un solo di essi, lo stato corrente. Il sistema può passare da uno stato all’altro in base ad eventi e/o condizioni: tale passaggio si chiama transizione.

Nel nostro esempio, il sistema potrà avere solo due stati:

  • luce accesa (= relay attivo)
  • luce spenta (= relay disattivo)

Il passaggio da uno stato all’altro dipende dall’orario corrente e dai due orari impostati di accensione e spegnimento. Una MSF si può visivamente definire tramite il suo diagramma degli stati:

All’interno dello sketch, definiamo due costanti che indicano i due diversi stati possibili:

#define STATE_OFF  0
#define STATE_ON   1

e una variabile che memorizzerà lo stato corrente:

int fsm_state;

Nel setup() è importante definire lo stato iniziale:

fsm_state = STATE_OFF;

All’interno del loop(), utilizziamo lo statement Switch per identificare lo stato attuale e verificare se ci sono le condizioni per una transizione di stato:

switch(fsm_state) {
  case STATE_OFF:
    if(now > START_TIME && now < END_TIME) {
        [...]
        fsm_state = STATE_ON;
      }
      break;
    case STATE_ON:
      if(now > END_TIME) {
      [...]
      fsm_state = STATE_OFF;
    }
    break;
}

Funzionamento

Lo sketch completo è disponibile nel mio repository su Github, ecco un paio di foto del progetto funzionante:

6 Comments »

  1. Ronald 1 ottobre 2013 at 01:35 - Reply

    Buongiorno Sig. Luca!
    Sono Ronald, mi trovo alle prime armi con Arduino, non ho problemi con l’hardware, essendo quadrista e anche un po’ di piu (faccio dei circuiti elettronici, è una passione) ma purtroppo come software, non conosco il linguaggio DELLA PROGRAMMAZIONE, volevo controllare dal cellulare (Android) via rete certe 0/1 del quadro di casa…
    volevo sapere da lei, visto la sua notevole conoscenza dell’argomento,
    quale software scaricare sul telefono (anche a pagamento) purche sia
    semplice nel futuro uso e che disponga di almeno 8 o 10 comandi apri/chiudi contatto, quindi molto semplice,
    rinominabili a piacere… e magari se si trovano degli sketch, come comunica android/rete – rete/scheda ethernet di Arduino…
    La ringrazio davvero per l’attenzione e spero di ricevere una risposta!!!
    A presto! GRAZIE MILLE!!!

    • luca 1 ottobre 2013 at 19:46 - Reply

      Ciao Ronald,

      visto che non hai molta esperienza di programmazione, ti consiglio di andare su una soluzione “chiavi in mano”, ad esempio il progetto Arduino Commander ti mette a disposizione una app per Android e il relativo sketch per Arduino, anche con shield Ethernet come serve a te. Buon divertimento!

  2. Beppe 2 ottobre 2013 at 10:02 - Reply

    Buongiorno Luca.
    Ho eseguito il tuo codice, ma non riesco a capire come impostare l’ora del timer, e neanche come faccia il programma a recuperare l’ora esatta, devo impostarla io?

    Ad esempio i minuti corrispondono con l’ora del PC, ma le ore sono otto ore avanti.

    Il problema e mio in quanto neofita, ti ringrazio lo stesso e ti faccio i complimenti per i tuoi tutorial.

    saluti
    Beppe

    • luca 3 ottobre 2013 at 19:10 - Reply

      Ciao Beppe,

      l’ora esatta è mantenuta dal CHIP RTC, che va pre-configurato… ho pronto un piccolo tutorial su come farlo!

  3. Beppe 5 ottobre 2013 at 17:56 - Reply

    Ciao Luca.
    Grazie per aver risposto.
    Ho capito come fare per configurarlo,solo che adesso mi da soltanto ff ff ff come risultato, mi sa che ho cimito l’rtc , non so cosa puo essere successo. Ne prendero un altro e provero di nuovo.
    Grazie
    Saluti Beppe

  4. raffaele 7 novembre 2013 at 12:27 - Reply

    Buongiorno,
    avrei dei progetti da realizzare con arduino , vorrei chiederle se è disposto a realizzarli o ha un nominativo al quale rivoelgermi

Leave A Response »