Skip to content

Instantly share code, notes, and snippets.

@fxprime
Created October 16, 2020 16:34
Show Gist options
  • Select an option

  • Save fxprime/96e58a56d3ec0a1f67e88516e1064131 to your computer and use it in GitHub Desktop.

Select an option

Save fxprime/96e58a56d3ec0a1f67e88516e1064131 to your computer and use it in GitHub Desktop.
/**
* www.ModuleMore.com
* ตัวอย่างการใช้งาน Shield LCD พร้อมปุ่มกด
*/
#include <Arduino.h>
/************************************************************************/
#include <Wire.h>
#include <LiquidCrystal.h>
const int LCD_RS = 8;
const int LCD_EN = 9;
const int LCD_D0 = 4;
const int LCD_D1 = 5;
const int LCD_D2 = 6;
const int LCD_D3 = 7;
const int BUTTON_INPUT = A0;
// const int LCD_BLACKLIGHT = 10;
LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D0, LCD_D1, LCD_D2, LCD_D3);
const int KEY_RIGHT = 0;
const int KEY_UP = 1;
const int KEY_DOWN = 2;
const int KEY_LEFT = 3;
const int KEY_SELECT = 4;
const int KEY_INVALID = 5;
static int readKey() {
int val = analogRead(BUTTON_INPUT);
if (val < 60)
{
return KEY_RIGHT;
}
else if (val < 200)
{
return KEY_UP;
}
else if (val < 400)
{
return KEY_DOWN;
}
else if (val < 600)
{
return KEY_LEFT;
}
else if (val < 800)
{
return KEY_SELECT;
}else {
return KEY_INVALID;
}
}
/************************************************************************/
#include "Fsm.h"
// State machine variables แทนการกระทำแต่ละเหตุการณ์
#define BUTTON_LEFT 0
#define BUTTON_RIGHT 1
// Transition callback functions ฟังก์ชันการเปลี่ยนแปลง State
void on_page_exit();
void on_page1_enter();
void on_page2_enter();
void on_page3_enter();
void page1_on_state();
void page2_on_state();
void page3_on_state();
// States สถานะ (ฟังก์ชันเข้าสถานะ, ฟังก์ชันระหว่างอยู่ในสถานะ, ฟังก์ชันขณะออกจากสถานะ)
State state_page1(&on_page1_enter, &page1_on_state, &on_page_exit);
State state_page2(&on_page2_enter, &page2_on_state, &on_page_exit);
State state_page3(&on_page3_enter, &page3_on_state, &on_page_exit);
// สร้างตัวแปร State-machine และกำหนดสถานะเริ่มต้น
Fsm fsm(&state_page1);
void on_page1_enter()
{
lcd.setCursor(0,0);
lcd.print("Page1");
delay(300);
}
void on_page2_enter()
{
lcd.setCursor(0,0);
lcd.print("Page2");
delay(300);
}
void on_page3_enter()
{
lcd.setCursor(0,0);
lcd.print("Page3");
delay(300);
}
void on_page_exit()
{
lcd.clear();
}
void page1_on_state() {
int key = readKey();
if(key== KEY_LEFT) {
fsm.trigger(BUTTON_LEFT);
}else if(key==KEY_RIGHT) {
fsm.trigger(BUTTON_RIGHT);
}
}
void page2_on_state() {
int key = readKey();
if(key== KEY_LEFT) {
fsm.trigger(BUTTON_LEFT);
}else if(key==KEY_RIGHT) {
fsm.trigger(BUTTON_RIGHT);
}
}
void page3_on_state() {
int key = readKey();
if(key== KEY_LEFT) {
fsm.trigger(BUTTON_LEFT);
}else if(key==KEY_RIGHT) {
fsm.trigger(BUTTON_RIGHT);
}
}
/************************************************************************/
void setup()
{
lcd.begin(16, 2);
//กำหนดเส้นทางการเปลี่ยนแปลงของแต่ละสถานะ โดยเลือกจากสถานะที่เป็นอยู่ และการกระทำที่เกิดขึ้น
fsm.add_transition(&state_page1, &state_page2, BUTTON_RIGHT, NULL);
fsm.add_transition(&state_page1, &state_page3, BUTTON_LEFT, NULL);
fsm.add_transition(&state_page2, &state_page3, BUTTON_RIGHT, NULL);
fsm.add_transition(&state_page2, &state_page1, BUTTON_LEFT, NULL);
fsm.add_transition(&state_page3, &state_page1, BUTTON_RIGHT, NULL);
fsm.add_transition(&state_page3, &state_page2, BUTTON_LEFT, NULL);
}
void loop()
{
fsm.run_machine();
delay(100);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment