เกาะติดสถานการณ์ COVID-19 ด้วย ESPino32

เกาะติดสถานการณ์ 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 <<<

ไลบรารี่ที่จำเป็นต้องติดตั้งเพิ่มเติม

– Time Library

– LiquidCrystal_I2C Library

เนื่องจากบทความนี้ใช้งานบอร์ด ESPino32 เเละ 20×4 Character LCD ร่วมกัน ดังนั้นจำเป็นต้องต่อบอร์ดเข้าด้วยกันดังรูป ESPino32 กับ 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);
}
หน้าจอเเสดงผลที่ 1

ฟังก์ชันเเสดงผลลัพธ์ออกหน้าจอที่ 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);
}
หน้าจอเเสดงผลที่ 2

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

COVID-19 Monitor ด้วย ESPino32

ขอขอบคุณข้อมูลอ้างอิงเเละไลบรารี่จาก

– 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