Created
October 16, 2020 16:34
-
-
Save fxprime/96e58a56d3ec0a1f67e88516e1064131 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * 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