Hackster is hosting Hackster Holidays, Ep. 7: Livestream & Giveaway Drawing. Watch previous episodes or stream live on Friday!Stream Hackster Holidays, Ep. 7 on Friday!
phpoc_man
Published © GPL3+

Controlling Arduino State Machine via Web

This video shows how to change state of state machine on Arduino via web.

IntermediateFull instructions provided4,348
Controlling Arduino State Machine via Web

Things used in this project

Story

Read more

Schematics

Wiring

Code

Normal code for controlling LED via webpage

Arduino
/* arduino web server - remote control (push button) */

#include "SPI.h"
#include "Phpoc.h"

#define STATE_YELLOW	'A'
#define STATE_GREEN		'B'
#define STATE_RED		'C'

#define PIN_LED_YELLOW 		3
#define PIN_LED_GREEN 		8
#define PIN_LED_RED			9

PhpocServer server(80);

char current_led = STATE_RED;
int pins[3] = {PIN_LED_YELLOW, PIN_LED_GREEN, PIN_LED_RED};

void handleEvent(char stt);

void setup(){
	Serial.begin(9600);
	while(!Serial)
		;

	Phpoc.begin(PF_LOG_SPI | PF_LOG_NET);
	//Phpoc.begin();

	server.beginWebSocket("remote_push");

	Serial.print("WebSocket server address : ");
	Serial.println(Phpoc.localIP());  
	
	pinMode(PIN_LED_YELLOW, OUTPUT);
	pinMode(PIN_LED_GREEN, OUTPUT);
	pinMode(PIN_LED_RED, OUTPUT);
	
	digitalWrite(PIN_LED_RED, HIGH);
	
}

void loop() {
	//Wait for a new client:
	PhpocClient client = server.available();

	if (client) {
		if (client.available() > 0) {
			//Read the bytes incoming from the client:
			char event = client.read();
			if(event == 'A' || event == 'B' || event == 'C')
				if(event != current_led)
					handleEvent(event);
		}
	}
}

void handleEvent(char event){
	
	for(int i = 0; i < 5; i++){
		digitalWrite(pins[current_led - 'A'], (i%2));
		delay(100);
	}
	//Turn on green led
	digitalWrite(pins[event - 'A'], HIGH);
	
	// update current state
	current_led = event;
}

Finite State Machine Code for controlling LED via webpage

Arduino
This code have the same functionality as normal code but using Finite State Machine model
/* arduino web server - remote control (push button) */

#include "SPI.h"
#include "Phpoc.h"

#define STATE_YELLOW	'A'
#define STATE_GREEN		'B'
#define STATE_RED		'C'

#define PIN_LED_YELLOW 		3
#define PIN_LED_GREEN 		8
#define PIN_LED_RED			9

PhpocServer server(80);

char fsm_state = STATE_RED;

void FSMEvent(char stt);

void setup(){
	Serial.begin(9600);
	while(!Serial)
		;

	Phpoc.begin(PF_LOG_SPI | PF_LOG_NET);
	//Phpoc.begin();

	server.beginWebSocket("remote_push");

	Serial.print("WebSocket server address : ");
	Serial.println(Phpoc.localIP());  
	
	pinMode(PIN_LED_YELLOW, OUTPUT);
	pinMode(PIN_LED_GREEN, OUTPUT);
	pinMode(PIN_LED_RED, OUTPUT);
	
	digitalWrite(PIN_LED_RED, HIGH);
}

void loop() {
	//Wait for a new client:
	PhpocClient client = server.available();

	if (client) {
		if (client.available() > 0) {
			//Read the bytes incoming from the client:
			char event = client.read();
			if(event == 'A' || event == 'B' || event == 'C')
				if(event != fsm_state)
					FSMEvent(event);
		}
	}
}

void FSMEvent(char event){
	
	//Action is taken based on current state and event
	switch(fsm_state){
		case STATE_YELLOW:
			
			if(event == STATE_GREEN){
				//Blink yellow led in a second and then turn off
				for(int i = 0; i < 5; i++){
					digitalWrite(PIN_LED_YELLOW, (i%2));
					delay(100);
				}
				//Turn on green led
				digitalWrite(PIN_LED_GREEN, HIGH);
			}
			else if(event == STATE_RED){
				//Blink yellow led in a second and then turn off
				for(int i = 0; i < 5; i++){
					digitalWrite(PIN_LED_YELLOW, (i%2));
					delay(100);
				}
				//Turn on red led
				digitalWrite(PIN_LED_RED, HIGH);
			}
			
			break;
			
		case STATE_GREEN:
			
			if(event == STATE_YELLOW){
				//Blink green led in a second and then turn off
				for(int i = 0; i < 5; i++){
					digitalWrite(PIN_LED_GREEN, (i%2));
					delay(100);
				}
				//Turn on yellow led
				digitalWrite(PIN_LED_YELLOW, HIGH);
			}
			else if(event == STATE_RED){
				//Blink green led in a second and then turn off
				for(int i = 0; i < 5; i++){
					digitalWrite(PIN_LED_GREEN, (i%2));
					delay(100);
				}
				//Turn on red led
				digitalWrite(PIN_LED_RED, HIGH);
			}
			
			break;
			
		case STATE_RED:
			
			if(event == STATE_YELLOW){
				//Blink red led in a second and then turn off
				for(int i = 0; i < 5; i++){
					digitalWrite(PIN_LED_RED, (i%2));
					delay(100);
				}
				//Turn on yellow led
				digitalWrite(PIN_LED_YELLOW, HIGH);
			}
			else if(event == STATE_GREEN){
				//Blink red led in a second and then turn off
				for(int i = 0; i < 5; i++){
					digitalWrite(PIN_LED_RED, (i%2));
					delay(100);
				}
				//Turn on green led
				digitalWrite(PIN_LED_GREEN, HIGH);
			}
			
			break;
	}
	
	// update current state
	fsm_state = event;
}

Credits

phpoc_man
62 projects • 408 followers

Comments