โปรเจคเครื่องมือตรวจวัด PM2.5(PMS5003ST) ด้วย ESPino32 และส่งค่าขึ้น Blynk อย่างง่ายๆ

โปรเจคเครื่องมือตรวจวัด PM2.5(PMS5003ST) ด้วย ESPino32 และส่งค่าขึ้น Blynk อย่างง่ายๆ

บทความนี้ต่อเนื่องมาจาก “บทความโปรเจคเครื่องมือตรวจวัด PM2.5 ด้วย ESPino32 และ PMS5003ST ” หลังจากที่ได้ทำการแสดงค่า PM2.5 ขึ้นบนจอ OLED 128×64 แล้ว ในบทความนี้จะมีการประยุกต์เพิ่มเติมเพื่อให้สามารถดูค่า PM2.5 บนแอพพลิเคชั่น Blynk ที่รองรับการใช้งานบนอุปกรณ์ที่รองรับระบบ Android และ IOS ไม่ว่าจะอยู่ที่ไหน เพียงแค่ต่ออินเตอร์เน็ต ก็สามารถอ่านค่า PM2.5 ได้ 

  • หากยังไม่รู้จัก Blynk Platform สามารถอ่านเพิ่มเติม ได้ที่ “เริ่มต้น IoT App ด้วย Blynk
  • ผู้ใช้งานจะต้องเริ่มศึกษา การใช้งาน Blynk โดยสามารถอ่านได่จากบทความ “เริ่มต้น Blynk ด้วย ESPino32” ก่อนเพื่อเรียนรู้เกี่ยวกับการใช้งาน Blynk และการสร้าง Widget ต่างๆ

อุปกรณ์ที่ใช้ภายในบทความนี้ประกอบด้วย

1 . ESPino32 Wifi BLE Development Board (ETEE061S) จำนวน 1 pcs เป็นไมโครคอนโทรลเลอร์ที่ใช้สำหรับอ่านค่าจากเซ็นเซอร์

2 . PMS5003ST Dust Formaldehyde, Temperature and Humidity Sensor (ESEN298) จำนวน 1 pcs เป็นเซ็นเซอร์ตรวจวัดฝุ่นที่สามารถวัดค่า PM1.0 PM2.5 และ PM10 โดยเซ็นเซอร์วัดค่าอนุภาคของฝุ่นที่มีขนาดเล็กถึง 0.3 ไมโครเมตร อีกทั้งยังสามารถวัดค่าฟอร์มาลดีไฮด์ อุณหภูมิและความชื้น

3 . จอ 128×64 OLED Display (EDPM046) จำนวน 1 pcs จอแสดงผลแบบ OLED (Organic Light-Emitting Diode) หรือ ไดโอดเปล่งแสงอินทรีย์ ซึ่งถูกนำเอาใช้แทนจอ LCD ในรูปแบบเดิม โมดูลนี้ออกมาให้ใช้งานร่วมกับ Microcontroller โดยเชื่อมต่อผ่าน I2C เพื่อแสดงค่าจากตัวเซ็นเซอร์

4.โทรศัพท์มือถือ (Android , IOS) ที่สามารถติดตั้ง Blynk Application ได้ 

โดยจะเริ่มจาก 3 Steps ง่าย ดังนี้

  1. ทำการสร้าง Gauge Widget บนแอพพลิเคชั่นฺ Blynk และทำการตั้งค่าในแต่ละ gauge
  2. ทำการอัพโหลดโปรแกรมสำหรับอ่านค่าพารามิเตอร์ต่างๆ และส่งค่าขึ้น Blynk 
  3. ติดตามการแสดงผลบนแอพพลิเคชั่น Blynk

Step 1 หลังจากที่ได้ทำการล็อกอิน Blynk Account เรียบร้อยแล้ว ให้ทำการสร้าง Gauge Widget ขึ้นมา 4 บล็อก  เมื่อทำการสร้าง Gauge มา 4 บล็อกจะได้ monitor ดังนี้ (ดูวีธีการใช้งาน Blynk เบื้องต้น)

รูปการเลือก Gauge Widget

จากนั้นทำการตั้งค่าใน Gauge Widget แต่ละบล็อกดังนี้

1 . Gauge Widget สำหรับแสดงค่าอุณหภูมิ โดยให้ทำการ

  • เปลี่ยนชื่อเป็น Temperature 
  • ตั้งค่า Virtual Pin เป็น V1 และกำหนดช่วงค่าอุณหภูมิ
  • ใส่หน่วยเป็นองศาเซลเซียส °C 
  • ทำการตั้งค่าขนาดของตัวอักษรและเปลี่ยนสีตามต้องการ

2 . Gauge Widget สำหรับแสดงค่าความชื้น โดยให้ทำการ

  • เปลี่ยนชื่อเป็น Humidity
  • ตั้งค่า Virtual Pin เป็น V2 และกำหนดช่วงค่าความชื้น
  • ใส่หน่วยเป็นเปอร์เซ็นต์ %
  • ทำการตั้งค่าขนาดของตัวอักษรและเปลี่ยนสีตามต้องการ

3 . Gauge Widget สำหรับแสดงค่าPM2.5 โดยให้ทำการ

  • เปลี่ยนชื่อเป็น PM2.5
  • ตั้งค่า Virtual Pin เป็น V3 กำหนดช่วงค่าPM2.5
  • ใส่หน่วยเป็นไมโครกรัมต่อลูกบาศก์เมตร ug/m3
  • ทำการตั้งค่าขนาดของตัวอักษรและเปลี่ยนสีตามต้องการ

4 . Gauge Widget สำหรับแสดงค่าฟอร์มาลดีไฮด์ โดยให้ทำการ

  • เปลี่ยนชื่อเป็น Formaldehyde
  • ตั้งค่า Virtual Pin เป็น V4 กำหนดช่วงค่าฟอร์มาลดีไฮด์
  • ใส่หน่วยเป็นไมโครกรัมต่อลูกบาศก์เมตร ug/m3
  • ทำการตั้งค่าขนาดของตัวอักษรและเปลี่ยนสีตามต้องการ

เมื่อทำการตั้งค่าเสร็จแล้ว จะได้หน้าต่างดังนี้ 

Step 2 จากนั้นมาดูในส่วนของ ESPino32 ให้ทำการใส่ Authen , Wifi และ Password ในส่วนของโค้ด

จากนั้นทำการอัพโหลด

// ทำการเพิ่ม Library ที่เกี่ยวข้อง
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include "SSD1306Wire.h"
#include "OLEDDisplayUi.h"


char auth[] = "thaieasyelec_auth";
char ssid[] = "thaieasyelec_Wifi";
char pass[] = "thaieasyelec_password";

BlynkTimer timer;

//ตั้งค่าสำหรับจอ OLED
SSD1306Wire  display(0x3c, SDA, SCL);
OLEDDisplayUi ui     ( &display );

//ตั้งค่ารอบเวลาอ่านของเซ็นเซอร์ทุกๆ 10 วินาที หรือ 10000 ms
unsigned long previousMillis = 0;
const long interval = 10000;

//ประกาศตัวแปลที่จำเป็นในการอ่านค่าเซ็นเซอร์
char col;
unsigned int PMSa = 0, FMHDSa = 0, TPSa = 0, HDSa = 0, PMSb = 0, FMHDSb = 0, TPSb = 0, HDSb = 0;
unsigned int PMS = 0, FMHDS = 0, TPS = 0, HDS = 0, CR1 = 0, CR2 = 0;
unsigned char buffer_RTT[40] = {}; //Serial buffer; Received Data
char DataStr[15];
String temp, Humi;

//ฟังก์ชันสำหรับอ่านค่าจะเซ็นเซอร์ PMS5003ST
void Read_PMS_DATA() {
  
  while (!Serial2.available());
  while (Serial2.available() > 0) //Data check: weather there is any Data in Serial1
  {
    for (int i = 0; i < 40; i++)
    {
      col = Serial2.read();
      buffer_RTT[i] = (char)col;
      delay(2);
    }
    Serial2.flush();

    CR1 = (buffer_RTT[38] << 8) + buffer_RTT[39];
    CR2 = 0;
    for (int i = 0; i < 38; i++)
      CR2 += buffer_RTT[i];
    if (CR1 == CR2)               //Check
    {
      PMSa = buffer_RTT[12];       //Read PM2.5 High 8-bit
      PMSb = buffer_RTT[13];       //Read PM2.5 Low 8-bit
      PMS = (PMSa << 8) + PMSb;    //PM2.5 value
      FMHDSa = buffer_RTT[28];       //Read Formaldehyde High 8-bit
      FMHDSb = buffer_RTT[29];       //Read Formaldehyde Low 8-bit
      FMHDS = (FMHDSa << 8) + FMHDSb; //Formaldehyde value
      TPSa = buffer_RTT[30];        //Read Temperature High 8-bit
      TPSb = buffer_RTT[31];        //Read Temperature Low 8-bit
      TPS = (TPSa << 8) + TPSb;  //Temperature value
      HDSa = buffer_RTT[32];        //Read Humidity High 8-bit
      HDSb = buffer_RTT[33];        //Read Humidity Low 8-bit
      HDS = (HDSa << 8) + HDSb; //Humidity value
    }/*
    else
    {
      PMS = 0;
      FMHDS = 0;
      TPS = 0;
      HDS = 0;
    }*/
    sprintf(DataStr, "%d%d.%d", TPS / 100, (TPS / 10) % 10, TPS % 10);
    temp = DataStr;
    sprintf(DataStr, "%d%d.%d", HDS / 100, (HDS / 10) % 10, HDS % 10);
    Humi = DataStr;
  }
}

//ฟังก์ชันสำหรับแสดงค่าเซ็นเซอร์ PMS5003ST บน Serial monitor
void PRINT_PMS_DATA() {
  Serial.println("-----------------------PMS5003ST--------------------------");
  Serial.print("Temp : ");
  Serial.print(temp);
  Serial.println("C");               //Serial pring Temperature
  Serial.print("RH   : ");
  Serial.print(Humi);            //Serial print humidity
  Serial.println(" %");               //"%"
  Serial.print("HCHO : ");
  Serial.print(FMHDS);
  Serial.println(" ug/m3");        // Serial print formaldehyde, unit: ug/m³
  Serial.print("PM2.5: ");
  Serial.print(PMS);
  Serial.println(" ug/m3");       // Serial print PM2.5, unit: ug/m³
  Serial.println();
}

//ฟังก์ชันสำหรับออกแบบหน้าจอ โดยจะแบ่งเป็น 4 เฟรม ในแต่ละเฟรมจะแสดงค่าต่างๆที่อ่านมาจากเซ็นเซอร์
void drawFramePM2_5(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
  display->setTextAlignment(TEXT_ALIGN_CENTER);
  display->setFont(ArialMT_Plain_16);
  display->drawString(64 + x, 0 + y, "PM 2.5");

  display->setFont(ArialMT_Plain_24);
  display->drawString(64 + x, 19 + y, String(PMS));

  display->setFont(ArialMT_Plain_10);
  display->drawString(64 + x, 45 + y, "ug/m3");
}

void drawFrameTemp(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
  display->setTextAlignment(TEXT_ALIGN_CENTER);
  display->setFont(ArialMT_Plain_16);
  display->drawString(64 + x, 0 + y, "TEMPERATURE");

  display->setFont(ArialMT_Plain_24);
  display->drawString(64 + x, 19 + y, String(temp));

  display->setFont(ArialMT_Plain_10);
  display->drawString(64 + x, 45 + y, "°C");
}

void drawFrameHumi(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
  display->setTextAlignment(TEXT_ALIGN_CENTER);
  display->setFont(ArialMT_Plain_16);
  display->drawString(64 + x, 0 + y, "HUMIDITY");

  display->setFont(ArialMT_Plain_24);
  display->drawString(64 + x, 19 + y, String(Humi));

  display->setFont(ArialMT_Plain_10);
  display->drawString(64 + x, 45 + y, "%");
}

void drawFrameFormal(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {
  display->setTextAlignment(TEXT_ALIGN_CENTER);
  display->setFont(ArialMT_Plain_16);
  display->drawString(64 + x, 0 + y, "Formaldehyde");

  display->setFont(ArialMT_Plain_24);
  display->drawString(64 + x, 19 + y, String(FMHDS));

  display->setFont(ArialMT_Plain_10);
  display->drawString(64 + x, 45 + y, "ug/m3");
}

FrameCallback frames[] = { drawFramePM2_5, drawFrameTemp, drawFrameHumi, drawFrameFormal};
int frameCount = 4;

//ฟังก์ชันสำหรับส่งค่าไปยัง Blynk
void BlynkEvent()
{
  Blynk.virtualWrite(V1,temp);
  Blynk.virtualWrite(V2,Humi);
  Blynk.virtualWrite(V3,PMS);
  Blynk.virtualWrite(V4,FMHDS);
}



//เริ่มใช้งานฟังก์ชันและประกาศตั้งค่าเริ่มต้นการทำงานของฟังก์ชันจอแสดงผล
void setup() {
  Serial.begin(115200);
  Serial2.begin(9600);
  Blynk.begin(auth, ssid, pass);
  timer.setInterval(20000L, BlynkEvent); // ตั้งเวลาส่งค่าไปยัง Blynk ทุกๆ 20 วินาที
  Read_PMS_DATA();
  PRINT_PMS_DATA();
  ui.setTargetFPS(60);
  ui.setIndicatorPosition(BOTTOM);
  ui.setIndicatorDirection(LEFT_RIGHT);
  ui.setFrameAnimation(SLIDE_LEFT);
  ui.setFrames(frames, frameCount);
  ui.init();
  display.flipScreenVertically();
}

//การทำงานในลูป จะทำงานฟังก์ชันอ่านค่าจากเซ็นเซอร์ทุกๆ 10 วินาทีและแสดงผลบนหน้าจอ จะทำงานวนไปเรื่อยๆ
void loop() {
  ui.update();
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    Read_PMS_DATA();
    PRINT_PMS_DATA();
  }
  Blynk.run();
  timer.run();
}

จากนั้นทำการเปิด Serial monitor เพื่อดูการเชื่อมต่อไปยัง Blynk Server

Step 3 สังเกตในแอพพลิเคชั่น Blynk จะมีการส่งค่าแสดงบน Monitor แล้ว

เป็นอย่างไรกันบ้างครับ สำหรับตัวอย่างการใช้งานบอร์ด ESPino32 ร่วมกับ PMS5003ST และส่งค่าขึ้น Blynk  ง่ายๆเพียงไม่กี่ขั้นตอน หากท่านใดติดปัญหาในส่วนไหนสามารถติดต่อสอบถามเพิ่มเติมได้ที่ E-mail : support@thaieasyelec.com 

One thought on “โปรเจคเครื่องมือตรวจวัด PM2.5(PMS5003ST) ด้วย ESPino32 และส่งค่าขึ้น Blynk อย่างง่ายๆ

  1. Pingback: โปรเจคเครื่องมือตรวจวัด PM2.5 ด้วย ESPino32 และ PMS5003ST – ThaiEasyElec's Blog

Comments are closed.