สวัสดีครับในบทความนี้เราจะมาลงมือทำโปรเจกต์พื้นฐานยอดนิยม แต่สามารถเอาไปต่อยอดทำระบบสมาร์ตฟาร์มหรือระบบตรวจวัดสภาพอากาศในบ้านได้จริง นั่นคือ "การอ่านค่าอุณหภูมิและความชื้นจากเซนเซอร์ DHT11 แล้วส่งขึ้นไปแสดงผลสวยๆ บนแอปพลิเคชัน Blynk IoT ด้วยบอร์ด ESP32" ผ่าน Wi-Fi ครับ
ถ้าพร้อมแล้ว เตรียมอุปกรณ์แล้วมาเริ่มกันเลย!
ระบบมีขั้นตอนการทำงานดังนี้
การต่อสายระหว่าง ESP32 กับ DHT11 (แบบโมดูล 3 ขา) ทำได้ง่ายๆ ดังนี้ครับ:
| ขาของ DHT11 | ขาของ ESP32 | หน้าที่ |
|---|---|---|
| VCC (+) | 3.3V หรือ 5V | จ่ายไฟเลี้ยงเซนเซอร์ |
| GND (-) | GND | ต่อสาย - |
| DATA (OUT) | GPIO 2 | ส่งสัญญาณข้อมูล |
⚠️ ข้อควรระวัง: ตรวจสอบขา VCC และ GND ให้ดีก่อนป้อนไฟ หากต่อสลับกันอาจทำให้เซนเซอร์เสียหายได้ครับ
นี่คือโค้ดที่เราจะใช้เขียนลงบอร์ด ESP32 ครับ ก๊อปปี้ไปวางในโปรแกรม Arduino IDE ได้เลย แต่ก่อนอัปโหลด เรามาทำความเข้าใจการทำงานของแต่ละส่วนกันอย่างละเอียดก่อนครับ
#define BLYNK_TEMPLATE_ID "TEMPLATE_ID_ของคุณ"
#define BLYNK_TEMPLATE_NAME "TEMPLATE_NAME_ของคุณ"
#define BLYNK_AUTH_TOKEN "AUTH_TOKEN_ของคุณ"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
// กำหนดค่า Wi-Fi และ Auth Token
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "ชื่อ_WiFi_ของคุณ";
char pass[] = "รหัสผ่าน_WiFi_ของคุณ";
// กำหนดขาและชนิดของเซนเซอร์
#define DHTPIN 2 // ขา Data ของ DHT11 ต่อที่ GPIO 2
#define DHTTYPE DHT11 // ชนิด DHT 11
DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;
void sendSensor() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// ส่งค่าไปยัง Blynk Virtual Pins
Blynk.virtualWrite(V0, t); // ส่งอุณหภูมิไปที่ V0
Blynk.virtualWrite(V1, h); // ส่งความชื้นไปที่ V1
}
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
dht.begin();
// ตั้งเวลาให้ส่งข้อมูลทุกๆ 1 วินาที
timer.setInterval(1000L, sendSensor);
}
void loop() {
Blynk.run();
timer.run();
}เพื่อให้เข้าใจการทำงานของโปรเจกต์นี้อย่างลึกซึ้ง เรามาดูรายละเอียดของโค้ดในแต่ละส่วนกันครับ
#define BLYNK_TEMPLATE_ID "TEMPLATE_ID_ของคุณ"
#define BLYNK_TEMPLATE_NAME "TEMPLATE_NAME_ของคุณ"
#define BLYNK_AUTH_TOKEN "AUTH_TOKEN_ของคุณ"หน้าที่: กำหนดข้อมูลสำคัญสำหรับใช้ในการยืนยันตัวตนและเชื่อมต่อกับระบบ Blynk Cloud
BLYNK_TEMPLATE_ID: หมายเลขประจำ Template เพื่อระบุว่าบอร์ด ESP32 นี้ต้องเชื่อมต่อเข้ากับ Template ไหนบนหน้าเว็บ BlynkBLYNK_TEMPLATE_NAME: ชื่อของโปรเจกต์ (เช่น Smart Farm หรือ Temperature Monitor)BLYNK_AUTH_TOKEN: รหัสผ่านเฉพาะของอุปกรณ์ เปรียบเสมือนกุญแจยืนยันตัวตนก่อนส่งข้อมูลขึ้น Cloud หาก Token ไม่ถูกต้องจะไม่สามารถเชื่อมต่อได้#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>หน้าที่: ดึงโค้ดสำเร็จรูปเข้ามาช่วยจัดการระบบต่าง ๆ โดยมีหน้าที่แยกตามแต่ละ Library ดังนี้:
WiFi.h: ใช้ควบคุมและสั่งการเชื่อมต่อเครือข่าย Wi-Fi (หากไม่มีฟังก์ชันนี้ ESP32 จะเชื่อมต่ออินเทอร์เน็ตไม่ได้)WiFiClient.h: ใช้จัดการด้านการส่งข้อมูลผ่านโปรโตคอล TCP/IP เพื่อให้ติดต่อกับเซิร์ฟเวอร์ของ Blynk ได้อย่างราบรื่นBlynkSimpleEsp32.h: คลังคำสั่งหลักของ Blynk ประกอบไปด้วยฟังก์ชันสำคัญ เช่น Blynk.begin(), Blynk.run() และ Blynk.virtualWrite()DHT.h: ใช้รับส่งข้อมูลและควบคุมเซนเซอร์ DHT11 ประกอบด้วยฟังก์ชันอ่านค่าอย่าง readHumidity() และ readTemperature()char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "ชื่อ_WiFi_ของคุณ";
char pass[] = "รหัสผ่าน_WiFi_ของคุณ";หน้าที่: ประกาศตัวแปรอาร์เรย์ชนิดอักขระ (Character Array) เพื่อจัดเก็บข้อมูลเครือข่ายปลายทาง
auth: ตัวแปรเก็บรหัส Token สำหรับใช้งาน Blynkssid: ตัวแปรเก็บชื่อสัญญาณ (SSID) เครือข่าย Wi-Fi ของคุณpass: ตัวแปรเก็บรหัสผ่านสำหรับเข้าใช้งาน Wi-Fi💡 เมื่อเปิดเครื่องขึ้นมา บอร์ด ESP32 จะดึงข้อมูลจากตัวแปรทั้งสามนี้ไปใช้เชื่อมต่ออินเทอร์เน็ตโดยอัตโนมัติ
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);หน้าที่: กำหนดรายละเอียดทางกายภาพให้กับตัวเซนเซอร์วัดอุณหภูมิและความชื้น
DHTPIN 2: ระบุว่าต่อสายสัญญานข้อมูล (Data) เข้ากับพิน GPIO 2 ของบอร์ด ESP32DHTTYPE DHT11: เจาะจงชนิดรุ่นของเซนเซอร์ว่าเป็นรุ่น DHT11DHT dht(...): เป็นการสร้างอินสแตนซ์หรือวัตถุตัวแทนเซนเซอร์ขึ้นมา เพื่อใช้อ้างอิงคำสั่งอ่านค่าในบรรทัดถัด ๆ ไป เช่น dht.readTemperature() และ dht.readHumidity()BlynkTimer timer;หน้าที่: ประกาศใช้ตัวนับเวลา (Timer) เพื่อกำหนดช่วงความถี่ในการทำงาน
ข้อดีของการใช้ BlynkTimer: ช่วยตั้งเวลาการทำงานได้โดยไม่ทำให้โปรแกรมหลักหยุดชะงัก (Non-blocking) สามารถประมวลผลงานอื่น ๆ ควบคู่กันไปได้ ซึ่งเหมาะและปลอดภัยสำหรับสถาปัตยกรรมการเขียนโค้ดระบบ IoT เป็นอย่างมาก
void sendSensor() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
Blynk.virtualWrite(V0, t);
Blynk.virtualWrite(V1, h);
}หน้าที่: อ่านค่าสภาพแวดล้อมปัจจุบันแล้วจัดส่งขึ้นสู่หน้าแดชบอร์ด มีขั้นตอนย่อยดังนี้:
float ในการเก็บค่าที่อ่านได้ เช่น 28.6 หรือ 31.2 โดย h คือความชื้น และ t คืออุณหภูมิisnan() (Is Not A Number) เพื่อเช็กว่ามีข้อผิดพลาดจากการอ่านค่าหรือไม่ หากสายหลุดหรือเซนเซอร์พัง ระบบจะแสดงคำว่า "Failed..." บน Serial Monitor และสั่ง return เพื่อออกจากฟังก์ชันทันที ช่วยป้องกันการส่งข้อมูลขยะขึ้น CloudBlynk.virtualWrite() ส่งข้อมูลไปยังช่องสัญญานจำลอง โดยส่งค่าอุณหภูมิไปที่ V0 และส่งค่าความชื้นไปที่ V1 เพื่อแสดงผลบนหน้าจอแอปพลิเคชันแบบเรียลไทม์void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
dht.begin();
timer.setInterval(1000L, sendSensor);
}หน้าที่: ส่วนเริ่มต้นระบบ ซึ่งจะทำงานเพียง "ครั้งแรกและครั้งเดียว" เมื่อเปิดเครื่องหรือกดรีเซ็ต
Serial.begin(115200);: เปิดพอร์ตการสื่อสารแบบอนุกรมด้วยความเร็ว 115200 bps สำหรับดูผลผ่านจอ Serial Monitor บนคอมพิวเตอร์Blynk.begin(...): สั่งให้อุปกรณ์ทำการล็อกอินเข้า Wi-Fi และเชื่อมต่อเข้ากับเซิร์ฟเวอร์ Blynk Cloud ไปพร้อมกันdht.begin();: ส่งสัญญาณเปิดระบบและเริ่มสั่งตัวเซนเซอร์ DHT11 ให้พร้อมสแตนด์บายทำงานtimer.setInterval(1000L, sendSensor);: ตั้งเวลาให้ระบบเรียกฟังก์ชัน sendSensor() ทำงานซ้ำทุกๆ 1000 มิลลิวินาที (หรือทุก 1 วินาที)void loop() {
Blynk.run();
timer.run();
}หน้าที่: ส่วนประมวลผลหลักที่จะทำงานวนซ้ำต่อเนื่องไปเรื่อย ๆ อย่างไม่มีที่สิ้นสุด
Blynk.run();: คอยทำหน้าที่เคลียร์คิว คอยตรวจสอบสถานะ และรักษาสายการเชื่อมต่อกับระบบ Cloud ตลอดเวลา รวมถึงรับคำสั่งการกดปุ่มจากหน้าแอปพลิเคชันลงมาที่บอร์ดtimer.run();: คอยตรวจเช็กเวลาที่วิ่งอยู่ตลอดเวลา หากตรวจสอบแล้วพบว่าเวลาเดินผ่านไปครบรอบ 1 วินาทีตามที่ตั้งไว้ ระบบจะกระโดดไปเรียกฟังก์ชัน sendSensor() เพื่อส่งข้อมูลชุดใหม่ทันทีหากคุณสามารถเชื่อมต่อบอร์ด ESP32, อ่านค่าเซนเซอร์ DHT11 และส่งข้อมูลขึ้น Blynk ได้สำเร็จแล้ว นี่คือไอเดียและแนวทางในการท้าทายตัวเองเพื่ออัปเกรดโปรเจกต์ให้เจ๋งยิ่งขึ้น หรือนำไปต่อยอดเป็นโครงงาน (Project) ครับ
sendSensor() ว่าถ้าอุณหภูมิเกิน 35 องศา ให้ส่งแจ้งเตือน (Push Notification) เข้ามือถือทันทีผ่านคำสั่ง Blynk.logEvent("hot_alert", "อากาศร้อนเกินไปแล้ว!");นักเรียนและนักศึกษาสามารถนำความรู้และโค้ดฐานจากโปรเจกต์นี้ ไปพัฒนาเป็นโครงงานประเภทต่าง ๆ ที่ตอบโจทย์การใช้งานจริงได้ดังนี้:
🏢 ด้านอาคารและที่อยู่อาศัย
| 🌱 ด้านการเกษตรและอุตสาหกรรม
|
🎯 สรุป: การทำความเข้าใจหลักการพื้นฐาน เช่น การอ่านค่าจากเซนเซอร์, การเชื่อมต่อเครือข่าย Wi-Fi และการรับส่งข้อมูลขึ้นระบบ Cloud เป็นหัวใจสำคัญที่จะช่วยให้นักศึกษาสามารถเปลี่ยนไปประยุกต์ใช้กับเซนเซอร์ประเภทอื่น ๆ ได้อย่างง่ายดายในอนาคต ไม่ว่าจะเป็น DHT22 (แม่นยำสูง), Soil Moisture (วัดความชื้นในดิน), MQ Gas Sensor (ตรวจจับแก๊ส), PIR Motion Sensor (ตรวจจับความเคลื่อนไหว) หรือเซนเซอร์วัดความเข้มแสง เพื่อพัฒนาไปสู่ระบบ IoT ที่ซับซ้อนและตอบโจทย์โลกยุคดิจิทัลได้อย่างแท้จริงครับ