โปรเจคเครื่องมือตรวจวัด 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 ง่าย ดังนี้
- ทำการสร้าง Gauge Widget บนแอพพลิเคชั่นฺ Blynk และทำการตั้งค่าในแต่ละ gauge
- ทำการอัพโหลดโปรแกรมสำหรับอ่านค่าพารามิเตอร์ต่างๆ และส่งค่าขึ้น Blynk
- ติดตามการแสดงผลบนแอพพลิเคชั่น 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
Pingback: โปรเจคเครื่องมือตรวจวัด PM2.5 ด้วย ESPino32 และ PMS5003ST – ThaiEasyElec's Blog