เกาะติดสถานการณ์ COVID-19 ด้วย ESPino32
บทความ “เกาะติดสถานการณ์ COVID-19 ด้วยบอร์ด ESPino32” เป็นบทความ ที่ใช้งานบอร์ด ESPino32 ติดตามสถานการณ์ COVID-19 ในประเทศไทยเเบบเรียลไทม์มาจากเเหล่งข้อมูลออนไลน์มาเเสดงผลบนจอ 20×4 Character LCD ดังรูป COVID-19 Monitor ด้วย ESPino32
โดยทั่วไปเเล้วหากต้องการเช็คสถานการณ์ COVID-19 จะต้องเช็คผ่านหน้าเว็บบราวน์เซอร์จากคอมพิวเตอร์ สมาร์ทโฟน แท็บเล็ต หรืออื่นๆ จากเว็บไซต์ต่างๆ ในบทความนี้เราจะมาสร้างอุปกรณ์ที่มีหน้าที่ในการดึงข้อมูลมาเเสดงผลโดยเฉพาะ สำหรับเเหล่งข้อมูลที่ใช้ในการอ้างอิงของบทความนี้จะใช้ Open Source จากเว็บไซต์ https://github.com/novelcovid/api ที่เป็นหนึ่งใน เเหล่งข้อมูล Open Source API สำหรับรายงานสถานการณ์ COVID-19 ทั่วโลก ที่มีการอัพเดทข้อมูลทุกๆวัน ไม่จำเป็นต้องขอ TokenKey สำหรับการเข้าถึงข้อมูล จึงง่ายเเละเหมาะสมต่อการใช้งาน
อุปกรณ์ที่ใช้
1. ESPino32 Wifi BLE Development Board (ETEE061S) จำนวน 1 pcs บอร์ดไมโครคอนโทรลเลอร์พร้อมโมดูลสื่อสาร Wireless LAN และ Bluetooth ใช้โมดูล ESP-WROOM-32 จาก Espressif Systems เป็นไมโครคอนโทรลเลอร์ขนาด 32-bit สามารถนำไปประยุกต์ใช้งานในโครงงานอิเล็กทรอนิกส์ได้อย่างหลากหลาย

2. Basic 20×4 Character LCD (EFDV561) จำนวน 1 pcs จอ LCD 20 ตัวอักษร จำนวน 4 บรรทัด แสดงผลตัวอักษรสีขาวบนพื้น (Background) สีน้ำเงิน ใช้งานง่าย ด้วย interface แบบ I2C สามารถปรับ contrast เพื่อเพิ่มความคมชัดบนหน้าจอ LCD ได้อีกด้วย

3. Female to Female Cable Jumper Wire 40 Pins (เมีย-เมีย) (ELNK051) จำนวน 1 pcs สาย Jumper Wire แบบสายแพ สามารถฉีกออกเป็นเล็กได้ 40 เส้น ความยาวสาย 20 cm ปลายทั้ง 2 ด้านเป็นหัว header ตัวเมีย

ในบทความนี้ จะใช้งานบอร์ด ESPino32 เป็นบอร์ดควบคุมการทำงานของอุปกรณ์ เเละใช้โปรเเกรม Arduino IDE ในการพัฒนาโปรเเกรม ดังนั้นหากยังไม่เคยใช้งานบอร์ดนี้สามารถอ่านเพิ่มเติมได้จากบทความ
>>> การติดตั้งชุดพัฒนา ESPino32 บนแพลตฟอร์ม Arduino <<<
ไลบรารี่ที่จำเป็นต้องติดตั้งเพิ่มเติม
เนื่องจากบทความนี้ใช้งานบอร์ด ESPino32 เเละ 20×4 Character LCD ร่วมกัน ดังนั้นจำเป็นต้องต่อบอร์ดเข้าด้วยกันดังรูป ESPino32 กับ Character LCD

โปรแกรมที่ใช้
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <TimeLib.h> #include <WiFi.h> #include <HTTPClient.h> LiquidCrystal_I2C lcd(0x27, 20, 4); const char* ssid = "YOUR_SSID_NAME"; const char* password = "YOUR_SSID_PASSWORD"; void setup() { Serial.begin(115200); lcd.begin(); lcd.clear(); lcd.setCursor(6, 1); lcd.print("COVID-19"); lcd.setCursor(6, 2); lcd.print("MONITOR"); delay(2000); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { lcd.clear(); lcd.setCursor(0, 1); lcd.print("Connecting to WiFi.."); delay(1000); } delay(2000); lcd.clear(); lcd.setCursor(4, 1); lcd.print("WiFi Connected"); } void loop() { if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status HTTPClient http; http.begin("https://corona.lmao.ninja/v2/countries/THA"); //Specify the URL int httpCode = http.GET(); //Make the request if (httpCode > 0) { //Check for the returning code String payload = http.getString(); Serial.println(httpCode); Serial.println(payload); String Data[45]; String country, cases, todayCases, deaths, todayDeaths, recovered, active, critical, updated; int count = 0, lastIndex = 0; for (int i = 0; i < payload.length(); i++) { if (payload.substring(i, i + 1) == "\"") { Data[count] = payload.substring(lastIndex, i); lastIndex = i + 1; count++; } else { Data[count] = payload.substring(lastIndex, payload.length()); } updated = Data[2].substring(1, Data[2].length() - 4); country = Data[5]; cases = Data[28].substring(1, Data[28].length() - 1); todayCases = Data[30].substring(1, Data[30].length() - 1); deaths = Data[32].substring(1, Data[32].length() - 1); todayDeaths = Data[34].substring(1, Data[34].length() - 1); recovered = Data[36].substring(1, Data[36].length() - 1); active = Data[38].substring(1, Data[38].length() - 1); critical = Data[40].substring(1, Data[40].length() - 1); } /* for (int i = 0; i < 45; i++) { Serial.print(i); Serial.print("="); Serial.println( Data[i]); } */ Serial.print("country"); Serial.print(" = ") ; Serial.println(country); Serial.print("cases"); Serial.print(" = ") ; Serial.println(cases); Serial.print("todayCases"); Serial.print(" = ") ; Serial.println(todayCases); Serial.print("deaths"); Serial.print(" = ") ; Serial.println(deaths); Serial.print("todayDeaths"); Serial.print(" = ") ; Serial.println(todayDeaths); Serial.print("recovered"); Serial.print(" = ") ; Serial.println(recovered); Serial.print("active"); Serial.print(" = ") ; Serial.println(active); Serial.print("critical"); Serial.print(" = ") ; Serial.println(critical); unsigned long t_unix_date = atol(updated.c_str()) + 25200; Serial.print("updated"); Serial.print(" = ") ; Serial.print(year(t_unix_date)); Serial.print("/"); Serial.print(month(t_unix_date)); Serial.print("/"); Serial.print(day(t_unix_date)); Serial.print("\t"); Serial.print(hour(t_unix_date)); Serial.print(":"); Serial.print(minute(t_unix_date)); Serial.print(":"); Serial.println(second(t_unix_date)); Serial.println(); lcdShow1(t_unix_date, cases, todayCases, deaths, todayDeaths); delay(5000); lcdShow2(t_unix_date, recovered, active, critical); delay(5000); } else { lcd.clear(); lcd.setCursor(0, 1); lcd.print("Error HTTP"); } http.end(); } } void lcdShow1(unsigned long t_unix_date, String cases, String todayCases, String deaths, String todayDeaths) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("UPDATE"); lcd.setCursor(10, 0); lcd.print(String(day(t_unix_date)) + "/" + String(month(t_unix_date)) + "/" + String(year(t_unix_date))); lcd.setCursor(0, 1); lcd.print("CASE"); lcd.setCursor(10, 1); lcd.print(cases); lcd.setCursor(0, 2); lcd.print("TODAYCASE"); lcd.setCursor(10, 2); lcd.print(todayCases); lcd.setCursor(0, 3); lcd.print("DEATH"); lcd.setCursor(6, 3); lcd.print(deaths); lcd.setCursor(10, 3); lcd.print("TDEATH"); lcd.setCursor(18, 3); lcd.print(todayDeaths); } void lcdShow2(unsigned long t_unix_date, String recovered, String active, String critical) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("UPDATE"); lcd.setCursor(11, 0); lcd.print(String(hour(t_unix_date)) + ":" + String(minute(t_unix_date)) + ":" + String(second(t_unix_date))); lcd.setCursor(0, 1); lcd.print("RECOVERED"); lcd.setCursor(11, 1); lcd.print(recovered); lcd.setCursor(0, 2); lcd.print("ACTIVE"); lcd.setCursor(11, 2); lcd.print(active); lcd.setCursor(0, 3); lcd.print("CRITICAL"); lcd.setCursor(11, 3); lcd.print(critical); }
อธิบายฟังก์ชันการทำงานต่างๆ
เรียกใช้งานไลบรารี่ที่เกี่ยวข้อง เเละ กำหนดชื่อเเละรหัส WiFi
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <TimeLib.h> #include <WiFi.h> #include <HTTPClient.h> LiquidCrystal_I2C lcd(0x27, 20, 4); const char* ssid = "YOUR_SSID_NAME"; เปลี่ยนเป็น WiFi ของตนเอง const char* password = "YOUR_SSID_PASSWORD"; เปลี่ยนเป็น Password ของตนเอง
เริ่มใช้งานหน้าจอ LCD เเละเชื่อมต่อ WiFi
void setup() { Serial.begin(115200); lcd.begin(); lcd.clear(); lcd.setCursor(6, 1); lcd.print("COVID-19"); lcd.setCursor(6, 2); lcd.print("MONITOR"); delay(2000); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { lcd.clear(); lcd.setCursor(0, 1); lcd.print("Connecting to WiFi.."); delay(1000); } delay(2000); lcd.clear(); lcd.setCursor(4, 1); lcd.print("WiFi Connected"); }
ฟังก์ชัน loop สำหรับอ่านข้อมูลจากหน้าเว็ปไซต์ หากต้องการเปลี่ยนเป็นประเทศอื่นๆ สามารถทำได้เช่นเดียวกัน โดยเปลี่ยนจาก
https://corona.lmao.ninja/v2/countries/THA เป็น USA, CHINA, Italy เป็นต้น
void loop() { if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status HTTPClient http; http.begin("https://corona.lmao.ninja/v2/countries/THA"); //http.begin("https://corona.lmao.ninja/v2/countries/USA"); //http.begin("https://corona.lmao.ninja/v2/countries/CHINA"); //http.begin("https://corona.lmao.ninja/v2/countries/ITALY"); . . . else { } http.end(); } }
ฟังก์ชันเเสดงผลลัพธ์ออกหน้าจอที่ 1 ผลลัพธ์ดังรูป หน้าจอเเสดงผลที่ 1
void lcdShow1 (Parameter) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("UPDATE"); lcd.setCursor(10, 0); lcd.print(String(day(t_unix_date)) + "/" + String(month(t_unix_date)) + "/" + String(year(t_unix_date))); lcd.setCursor(0, 1); lcd.print("CASE"); lcd.setCursor(10, 1); lcd.print(cases); lcd.setCursor(0, 2); lcd.print("TODAYCASE"); lcd.setCursor(10, 2); lcd.print(todayCases); lcd.setCursor(0, 3); lcd.print("DEATH"); lcd.setCursor(6, 3); lcd.print(deaths); lcd.setCursor(10, 3); lcd.print("TDEATH"); lcd.setCursor(18, 3); lcd.print(todayDeaths); }

ฟังก์ชันเเสดงผลลัพธ์ออกหน้าจอที่ 2 ผลลัพธ์ดังรูป หน้าจอเเสดงผลที่ 2
void lcdShow2 (Parameter) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("UPDATE"); lcd.setCursor(11, 0); lcd.print(String(hour(t_unix_date)) + ":" + String(minute(t_unix_date)) + ":" + String(second(t_unix_date))); lcd.setCursor(0, 1); lcd.print("RECOVERED"); lcd.setCursor(11, 1); lcd.print(recovered); lcd.setCursor(0, 2); lcd.print("ACTIVE"); lcd.setCursor(11, 2); lcd.print(active); lcd.setCursor(0, 3); lcd.print("CRITICAL"); lcd.setCursor(11, 3); lcd.print(critical); }

เพียงไม่กี่ขั้นตอนเท่านี้ก็จะได้เครื่องเกาะติดข้อมูล COVID-19 ด้วย ESPino32 เรียบร้อยเเล้ว ทางทีมงานหวังเป็นอย่างยิ่งว่าสถานการณ์ COVID-19 ในประเทศไทยจะไม่รุนเเรงเกินกว่านี้นะครับ เป็นกำลังใจให้ทุกคนผ่านเหตุการณ์นี้ไปด้วยกันครับ

ขอขอบคุณข้อมูลอ้างอิงเเละไลบรารี่จาก
– https://github.com/novelcovid/api
– https://covid-19-apis.postman.com/
– https://github.com/PaulStoffregen/Time
หากลูกค้าสนใจข้อมูลอุปกรณ์ในโครงงานนี้ สามารถสั่งซื้ออุปกรณ์ได้ทางหน้า เว็ปไซต์ หรือสอบถามเข้ามาได้ที่อีเมล sales@thaieasyelec.com หรือทางโทรศัพท์ 02-954-2408 และ 089-514-8111 รวมทั้งทาง LINE @thaieasyelec หรือทางเฟซบุค fb.com/ThaiEasyElec