เปิดปิด LED Matrix ผ่าน Amazon Echo (KidBright)

Pawat Saengduan
Chiang Mai Maker Club
4 min readMay 14, 2020
Amazon Echo Dot 2nd Generation
KidBright V1.3

สวัสดีคร้าาบบบผม!! ก่อนอื่นผมขอแนะนำตัวก่อนนะครับผม…… ผมชื่อนนนะครับ

ในบทความนี้ผมจะมาสอนวิธีการ เปิดปิด LED Matrix ผ่าน Amazon Echo โดยใช้บอร์ด KidBright

เตรียมอุปกรณ์

ในบทความนี้ มีอุปกรณ์ที่ต้องใช้ดังนี้ครับ

  1. KidBright ( V อะไรก็ได้ที่ไม่ใช่ V1.0 ) x1
  2. Amazon Echo ( Gen ที่ผมใช้คือ Gen 2 ครับ ) x1

ในเมื่อมีอุปกรณ์พร้อมแล้ว ก็ไปลุยเขียนโค้ดต่อเลยดีกว่า คร้าบบผม..!?!!

เขียนโค้ด

เอาละคร้บ เขียนโค้ด… ในวันนี้ IDE ที่ผมใช้เป็น Visual Studio Code ที่ใช้ PlatformIO นะครับผม

PlatformIO บน Visual Studio Code

มาถึงก็สร้างโปรเจกต์… ถ้าไม่สร้างก็เขียนโค้ดไม่ได้หรอก!!

ชื่อโปรเจกต์อะไรก็ได้ครับ แต่บทความนี้ใช้บอร์ด KidBright ก็ต้องเลือก

Espressif ESP32 Dev Module
เลือก Espressif ESP32 Dev Module เพื่อบอร์ด KidBright

หลังจากนั้นก็กด Finish เพื่อสร้างโปรเจกต์.. แล้วก็ต้องรอ… กับอีกเช่นเคยฮะ!

…………

พอสร้างเสร็จแล้วก็คงต้อง ลงไลบรารี่กันแล้วว!!

  1. ลงไลบรารี่

ซึ่งก็มีอยู่ 3 ไลบรารี่ที่ได้ใช้ในบทความนี้นะครับ นั้นก็คือ

  1. Adafruit LED Backpack ( สำหรับ LED Matrix )
  2. Adafruit GFX Library ( สำหรับ LED Matrix )
  3. fauxmoESP ( สำหรับติดต่อกับ Amazon Echo )

ครับ…. หลังจากลงไลบรารี่เสร็จแล้ว.. เขียนโค้ดสิคร้าบบ รอไร!! 555+

อะ. แล้วก็อีกย่างครับ Fauxmo อ่านว่า Fauxmo (\ˈfō-mō) หรือเรียกง่ายๆ ว่า โฟโมนะครับ 555+

…………………..

2. เขียนโค้ด!!

เอาละ เอาละ เอาละครับ.. หลังจากที่ลงไลบรารี่เสร็จแล้ว.. เราก็ include ไลบรารี่ของเรามาเลย!!

#include <Arduino.h> /* สำหรับรองรับ Arduino */#ifdef ESP32 /* ตรวจสอบบอร์ดเพื่อเรียกใช้ไลบรารี่ WiFi */
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include "fauxmoESP.h" /* สำหรับติดต่อกับ Amazon Echo */
#include "Adafruit_GFX.h" /* สำหรับ LED Matrix */
#include "Adafruit_LEDBackpack.h" /* สำหรับ LED Matrix */
#include "SPI.h" /* สำหรับ Adafruit GFX */

ในเมื่อที่ include แล้ว.. ต่อไปเราก็เรียกใช้ไลบรารี่

Adafruit_8x16minimatrix matrix = Adafruit_8x16minimatrix();
fauxmoESP fauxmo;

ต่อไปก็กำหนดชื่อและรหัส Wi-Fi, Serial Baudrate และอีกอันก็คือชื่อเรียกอุปกรณ์

! ชื่อเรียกอุปกรณ์จะต้องไม่มีตัวอักษรตัวใหญ่.. ถ้ามี Echo ก็จะมอง Device ไม่เห็น

#define WIFI_SSID "WIFI_SSID" /* ชื่อ Wi-Fi */
#define WIFI_PASS "WIFI_PASSWORD" /* รหัสผ่าน Wi-Fi */
#define SERIAL_BAUDRATE 115200 /* ความเร็ว Baudrate */#define ID_MATRIX "device_name" /* ชื่ออุปกรณ์เพื่อที่จะเรียกผ่าน Amazon Echo

! ชื่อเรียกอุปกรณ์จะต้องไม่มีตัวอักษรตัวใหญ่.. ถ้ามี Echo ก็จะมอง Device ไม่เห็น

เสร็จแล้วเราก็จะกำหนดตัวแปรตรวจสอบสถานะของ LED Matrix, ตัวแปร Handle ของ Task ที่จะ Handle ( พูดขนาดนี้แล้ว.. แน่นอนครับว่าเราใช้ FreeRTOS ในการ Run อีก Task เพื่อเปิดปิด LED Matrix )

bool MatrixState = true; /* ดวขดุมสถานะของ LED Matrix */
TaskHandle_t MatrixHandle = NULL; /* Handle Task ของ LED Matrix */
TickType_t DELAY(unsigned long ms) /* เรียกการคำนวณ Delay RTOS */
{
return ms / portTICK_PERIOD_MS;
}

ต่อไปเราก็สร้างฟังก์ชั่นมา Setup Wi-Fi กันก่อนเลยคร้าบบ!

void wifiSetup()
{
WiFi.mode(WIFI_STA); /* ตั้งค่ารูปแบบการทำงานของ WiFi เป็น STA */
Serial.printf("[WIFI] Connecting to %s ", WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASS); /* เชื่อมต่อ Wi-Fi */
while (WiFi.status() != WL_CONNECTED) /* รอการเชื่อมต่อ */
{
Serial.print(".");
delay(100);
}

Serial.println();
Serial.printf("[WIFI] STATION Mode, SSID: %s, IP address: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
}

ต่อไปก็สร้างฟั่งก์ชั่นสำหรับเรียกผ่าน FreeRTOS ครับ

void Matrix(void *pvParameters)
{
for (;;) /* ลูปแบบไม่สิ้นสุด */
{
if (MatrixState == true) /* ถ้า LED Matrix ยังทำงาน */
{
matrix.setRotation(1); /* ตั้งค่า LED */
matrix.setTextSize(1); /* ตั้งค่า LED */
matrix.setTextWrap(false); /* ตั้งค่า LED */
matrix.setTextColor(LED_ON); /* ตั้งค่า LED */
for (int8_t x = 16; x >= -25; x--)
{
/* เลื่อนตัวอักษร "On!" */
matrix.clear();
matrix.setCursor(x, 0);
matrix.print("On!");
matrix.writeDisplay();
vTaskDelay(DELAY(100));
}
vTaskDelay(DELAY(120));
}
else if (MatrixState == false) /* ถ้า LED Matrix ยังไม่ทำงาน */
{
matrix.setRotation(1); /* ตั้งค่า LED */
matrix.setTextSize(1); /* ตั้งค่า LED */
matrix.setTextWrap(false); /* ตั้งค่า LED */
matrix.setTextColor(LED_ON); /* ตั้งค่า LED */
for (int8_t x = 16; x >= -25; x--)
{
/* เลื่อนตัวอักษร "Off!" */
matrix.clear();
matrix.setCursor(x, 0);
matrix.print("Off!");
matrix.writeDisplay();
vTaskDelay(DELAY(100));
}
vTaskDelay(DELAY(120));
}
}
/* ลบ Task */
vTaskDelete(NULL);
}

ต่อไปก็เรียกฟังก์ชั่น setup() แล้วก็ setup ครับ!

void setup()
{
Serial.begin(SERIAL_BAUDRATE); /* ตั้งค่า Serial Baudrate */
Serial.println();
Serial.println();
wifiSetup(); /* เรียกฟังก์ชั่นต้งค้่า Wi-Fi */ fauxmo.createServer(true); /* สร้าง Server สำหรับรองรับ Echo */
fauxmo.setPort(80); /* Port คือ 8080 */
fauxmo.enable(true); /* ให้ Fauxmo เริ่มทำงาน */ matrix.begin(0x70); /* ตั้งค่า Address ของ LED Matrix matrix.clear(); /* ลบล้างการแสดงผลทั้งหมดจาก LED Matrix */
matrix.writeDisplay();
matrix.setRotation(1); /* ตั้งค่า LED */
matrix.setTextSize(1); /* ตั้งค่า LED */
matrix.setTextWrap(false); /* ตั้งค่า LED */
matrix.setTextColor(LED_ON); /* ตั้งค่า LED */
fauxmo.addDevice(ID_MATRIX); /* เพิ่่มอุปกรณืและเรียกชื่อตาม ID_MATRIX */ xTaskCreate(Matrix, "Matrix Task", 1024, (void *)MatrixState, 1, &MatrixHandle); /* สร้าง Task มารัน LED Matrix */ fauxmo.onSetState([](unsigned char device_id, const char *device_name, bool state, unsigned char value) {
Serial.printf("[MAIN] Device #%d (%s) state: %s value: %d\n", device_id, device_name, state ? "ON" : "OFF", value); /* แสดง Payload ผ่านทาง Serial */
if (strcmp(device_name, ID_MATRIX) == 0)
{
MatrixState = state ? true : false; /* ถ้า Payload เป็น logic แบบ true หรือ false ให้บันทึกค่าลงบนตัวแปรที่พร้อมทำงานใน Task FreeRTOS */
}
});
}

ต่อไปก็ลูปคร้าบบผม! แต่ก็ไม่มากก็แค่ให้ Fauxmo วนลูป Data และถ่ายโอนการทำงานของ Loop Task มารัน Matrix Task

void loop()
{
fauxmo.handle(); /* วนลูป Data ของ Fauxmo */
taskYIELD(); /* ถ่ายโอนการทำงาน */
}

หลังจากนั้นก็เสียบบอร์ดและ Amazon Echo แล้ว..!! Flash (Upload) ไปเลย..!!?!

ผลลัพท์

จบบทความนี้แล้วคร้าบบ! แล้วเจอกันใหม่นะค้าบบ!! สวัสดีคร้าบบ..!!?!

--

--