Schema naar Code
Nu we weten hoe een schema van een FSM eruit ziet willen we deze om kunnen zetten naar code. Welke componenten, functies, operaties en variabelen zullen we nodig hebben voor de structuur?
- Variabele voor de huidige state, zodat het programma weet welke state er is
- Een loop waar het programma naar de huidige state gaat
- Functies voor alle states
- In deze functies een deel die kijkt of de huidige state veranderd moet worden
- Een functie die alle inputs verzameld
Variabelen en Setup
Eerst willen we alle variabelen goed definiëren. De Input en Output variabelen moeten bekend zijn voor bijvoorbeeld een knop of een led. Maar nieuwe variabelen zijn de State variabelen. Elke state heeft zijn eigen variabele. Om niet elke keer deze waarde in te hoeven vullen maken we er een variabele van, net zoals bij de Input/Output gevallen. Vaak wordt de functie '#define' gebruikt. Deze functie veranderd alle delen met de '#define' voor die waarde VOORDAT de code compileert. Dit versnelt het programma en gebruikt minder geheugen. Naast de variabelen voor de states hebben we ook een variabele nodig voor de huidige state in welke het programma zich bevind. In de setup veranderd niets speciaals. Een voorbeeldcode is hieronder te zien.// IO variabelen
#define LED 13
#define BTN 12
int button_state = 0;
// State variables
#define OFF 0
#define ON 1
#define BLINK 2
int current_state = 0;
// Input en output in de setup
void setup(){
pinMode(LED, OUTPUT);
pinMode(BTN, INPUT);
}
Loop
In de loop luisteren we eerst naar de input en geven we deze een waarde. Daarna gebruiken we een switch die luister naar de current_state, deze kiest dan één van de 3 states. De default is nodig voor als de current_state een andere waarde heeft wat niet zou moeten kunnen. Elke case stuurt dan een functie aan.void loop(){
button_state = digitalRead(BTN); // lees de knop
// kies de huidige state
switch(current_state){
// off state
case OFF:
off();
break;
// on state
case ON:
on();
break;
// blink state
case BLINK:
blink();
break;
// default state
default:
break;
}
}
Functies (states)
In de functies voert de functie eerst uit wat de state moet doen, daarna kijkt de functie naar de inputs en of de state moet veranderen of niet. Dit word simpelweg gedaan met een paar if functies zoals te zien in het voorbeeld hieronder:// off state functie
void off(){
digitalWrite(LED, LOW);
if(button_state == HIGH){
current_state = ON;
delay(1000);
}
}
// on state functie
void on(){
digitalWrite(LED, HIGH);
if(button_state == HIGH){
current_state = BLINK;
delay(1000);
}
}
// blink state functie
void blink(){
digitalWrite(LED, LOW);
delay(100);
digitalWrite(LED, HIGH);
delay(100);
if(button_state == HIGH){
current_state = OFF;
delay(1000);
}
}
Schema van voorbeeld
Het schema van het voorbeeld moet zelf gemaakt kunnen worden aan de hand van deze code. Probeer deze eerst zelf te maken voordat er naar het schema gekeken wordt hieronder: