สวัสดีครับในบทความนี้เราจะมาลงมือทำโปรเจกต์พื้นฐานยอดนิยม แต่สามารถเอาไปต่อยอดทำระบบสมาร์ตฟาร์มหรือระบบตรวจวัดสภาพอากาศในบ้านได้จริง นั่นคือ "การอ่านค่าอุณหภูมิและความชื้นจากเซนเซอร์ DHT11 แล้วส่งขึ้นไปแสดงผลสวยๆ บนแอปพลิเคชัน Blynk IoT ด้วยบอร์ด ESP32" ผ่าน Wi-Fi ครับ
ถ้าพร้อมแล้ว เตรียมอุปกรณ์แล้วมาเริ่มกันเลย!
อุปกรณ์ที่ต้องใช้ในโปรเจกต์นี้
| รายการอุปกรณ์ | ลิงก์จัดซื้อ |
|---|---|
| 1. บอร์ด ESP32 DevKit V1 (หรือรุ่นใดก็ได้ เช่น NodeMCU) | 🛒 สั่งซื้อ |
| 2. เซนเซอร์ DHT11 (โมดูลวัดอุณหภูมิและความชื้น) | 🛒 สั่งซื้อ |
| 3. สายจัมเปอร์ (Female to Female หรือ Male to Female ขึ้นอยู่กับบอร์ด) | 🛒 สั่งซื้อ |
หลักการทำงานของระบบ
ระบบมีขั้นตอนการทำงานดังนี้
- ESP32 เชื่อมต่อ Wi-Fi
- ESP32 เชื่อมต่อกับ Blynk Cloud
- DHT11 อ่านค่าอุณหภูมิ
- DHT11 อ่านค่าความชื้น
- ESP32 ส่งข้อมูลไปยัง Blynk ผ่าน Virtual Pin
- แอป Blynk แสดงผลบน Dashboard
การสร้าง Datastream (รับ-ส่งข้อมูล)
Datastream เปรียบเสมือน "ข้อมูลจำลอง" ที่เชื่อมระหว่างโค้ดใน ESP32 กับหน้าจอแสดงผลครับ ในโค้ดของเรามีการใช้ V0 (อุณหภูมิ) และ V1 (ความชื้น) ดังนั้นเราต้องมาสร้าง 2 สิ่งนี้บนเว็บ Blynk ก่อน
- เข้าไปที่เว็บ Blynk.cloud แล้วล็อกอินเข้าบัญชี
- ไปที่เมนู Developer Zone (ไอคอนรูปค้อนหรือฟันเฟืองด้านซ้าย) -> เลือก Templates
- คลิกเลือก Template ที่เราสร้างไว้ (หรือกด + New Template หากยังไม่มี)
- คลิกไปที่แท็บ Datastreams
- คลิกปุ่ม + New Datastream แล้วเลือก Virtual Pin
- สร้างตัวที่ 1 (อุณหภูมิ):
- Name: ตั้งชื่อว่า
Temperature - Virtual Pin: เลือก
V0(ต้องตรงกับในโค้ดBlynk.virtualWrite(V0, t)) - Data Type: เลือก
DoubleหรือInteger(ในโค้ดใช้ float แนะนำให้เลือก Double เพื่อให้เห็นทศนิยม) - Unit: เลือกเป็น
Celsius (°C) - Min / Max: ตั้งค่าเป็น
0ถึง100 - กด Create
- Name: ตั้งชื่อว่า
- สร้างตัวที่ 2 (ความชื้น):
- คลิก + New Datastream -> Virtual Pin อีกครั้ง
- Name: ตั้งชื่อว่า
Humidity - Virtual Pin: เลือก
V1(ต้องตรงกับในโค้ดBlynk.virtualWrite(V1, h)) - Data Type: เลือก
DoubleหรือInteger - Unit: เลือกเป็น
Percentage (%) - Min / Max: ตั้งค่าเป็น
0ถึง100 - กด Create
- เมื่อได้ Datastream ครบทั้ง V0 และ V1 แล้ว ให้กดปุ่ม Save ที่มุมขวาบนทุกครั้ง!
ต่อมาจะเป็นการออกแบบ Web Dashboard
หลังจากมีช่องรองรับข้อมูลเพื่อโชว์ให้ผู้ใช้เห็นครับ
- ในหน้า Template เดิม ให้คลิกไปที่แท็บ Web Dashboard
- ด้านซ้ายมือจะมีแถบ Widget Box (กล่องเครื่องมือแสดงผล) ให้เราเลือกใช้
- ออกแบบการแสดงผลอุณหภูมิ (V0):
- ลาก Widget ที่ชื่อว่า Gauge (เกจวัด) หรือ Value Display มาวางบนพื้นที่ว่างตรงกลาง
- เอาเมาส์ไปชี้ที่ Widget นั้นแล้วคลิก ไอคอนฟันเฟือง (Settings)
- Title: ตั้งชื่อว่า
อุณหภูมิ - Datastream: เลือก
Temperature (V0) - กด Save
- ออกแบบการแสดงผลความชื้น (V1):
- ลาก Widget Gauge หรือ Value Display อีกอันมาวางข้างๆ กัน
- คลิก ไอคอนฟันเฟือง (Settings)
- Title: ตั้งชื่อว่า
ความชื้น - Datastream: เลือก
Humidity (V1) - กด Save
- (แนะนำเพิ่มเติม) สามารถลาก Widget ที่ชื่อว่า Chart (กราฟ) มาวางด้านล่าง แล้วตั้งค่าให้ดึงข้อมูลจากทั้ง
V0และV1มารวมกัน เพื่อดูแนวโน้มอุณหภูมิย้อนหลังแบบกราฟเส้นเส้นสวยๆ ได้ครับ - จัดแต่งขนาดและตำแหน่งตามใจชอบ เสร็จแล้วกด Save มุมขวาบน
การต่อวงจร (Wiring Diagram)

การต่อสายระหว่าง ESP32 กับ DHT11 (แบบโมดูล 3 ขา) ทำได้ง่ายๆ ดังนี้ครับ:
| ขาของ DHT11 | ขาของ ESP32 | หน้าที่ |
|---|---|---|
| VCC (+) | 3.3V หรือ 5V | จ่ายไฟเลี้ยงเซนเซอร์ |
| GND (-) | GND | ต่อสาย - |
| DATA (OUT) | GPIO 5 | ส่งสัญญาณข้อมูล |
⚠️ ข้อควรระวัง: ตรวจสอบขา VCC และ GND ให้ดีก่อนป้อนไฟ หากต่อสลับกันอาจทำให้เซนเซอร์เสียหายได้ครับ
💻 โค้ดโปรแกรม (Code)
นี่คือโค้ดที่เราจะใช้เขียนลงบอร์ด 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 5 // ขา Data ของ DHT11 ต่อที่ GPIO 5
#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();
}📝 อธิบายการทำงานของโค้ดทีละส่วน
เพื่อให้เข้าใจการทำงานของโปรเจกต์นี้อย่างลึกซึ้ง เรามาดูรายละเอียดของโค้ดในแต่ละส่วนกันครับ
ส่วนที่ 1: กำหนดข้อมูลของ Blynk (Configuration)
#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 ไม่ถูกต้องจะไม่สามารถเชื่อมต่อได้
ส่วนที่ 2: การเรียกใช้งานคลังคำสั่ง (Library)
#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()
ส่วนที่ 3: กำหนดค่าการเชื่อมต่อ Wi-Fi และเครือข่าย
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "ชื่อ_WiFi_ของคุณ";
char pass[] = "รหัสผ่าน_WiFi_ของคุณ";หน้าที่: ประกาศตัวแปรอาร์เรย์ชนิดอักขระ (Character Array) เพื่อจัดเก็บข้อมูลเครือข่ายปลายทาง
auth: ตัวแปรเก็บรหัส Token สำหรับใช้งาน Blynkssid: ตัวแปรเก็บชื่อสัญญาณ (SSID) เครือข่าย Wi-Fi ของคุณpass: ตัวแปรเก็บรหัสผ่านสำหรับเข้าใช้งาน Wi-Fi
💡 เมื่อเปิดเครื่องขึ้นมา บอร์ด ESP32 จะดึงข้อมูลจากตัวแปรทั้งสามนี้ไปใช้เชื่อมต่ออินเทอร์เน็ตโดยอัตโนมัติ
ส่วนที่ 4: ตั้งค่าและสร้างวัตถุเซนเซอร์ (Object)
#define DHTPIN 5
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);หน้าที่: กำหนดรายละเอียดทางกายภาพให้กับตัวเซนเซอร์วัดอุณหภูมิและความชื้น
DHTPIN 5: ระบุว่าต่อสายสัญญานข้อมูล (Data) เข้ากับพิน GPIO 5 ของบอร์ด ESP32DHTTYPE DHT11: เจาะจงชนิดรุ่นของเซนเซอร์ว่าเป็นรุ่น DHT11DHT dht(...): เป็นการสร้างอินสแตนซ์หรือวัตถุตัวแทนเซนเซอร์ขึ้นมา เพื่อใช้อ้างอิงคำสั่งอ่านค่าในบรรทัดถัด ๆ ไป เช่นdht.readTemperature()และdht.readHumidity()
ส่วนที่ 5: สร้างระบบนับเวลาถอยหลัง (Timer)
BlynkTimer timer;หน้าที่: ประกาศใช้ตัวนับเวลา (Timer) เพื่อกำหนดช่วงความถี่ในการทำงาน
ข้อดีของการใช้ BlynkTimer: ช่วยตั้งเวลาการทำงานได้โดยไม่ทำให้โปรแกรมหลักหยุดชะงัก (Non-blocking) สามารถประมวลผลงานอื่น ๆ ควบคู่กันไปได้ ซึ่งเหมาะและปลอดภัยสำหรับสถาปัตยกรรมการเขียนโค้ดระบบ IoT เป็นอย่างมาก
ส่วนที่ 6: ฟังก์ชันการอ่านและส่งข้อมูลส่งเซนเซอร์
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เพื่อออกจากฟังก์ชันทันที ช่วยป้องกันการส่งข้อมูลขยะขึ้น Cloud - ส่งข้อมูลขึ้น Blynk: ใช้คำสั่ง
Blynk.virtualWrite()ส่งข้อมูลไปยังช่องสัญญานจำลอง โดยส่งค่าอุณหภูมิไปที่ V0 และส่งค่าความชื้นไปที่ V1 เพื่อแสดงผลบนหน้าจอแอปพลิเคชันแบบเรียลไทม์
ส่วนที่ 7: ฟังก์ชันตั้งค่าเริ่มต้น (Setup)
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 วินาที)
ส่วนที่ 8: ฟังก์ชันทำงานวนซ้ำหลัก (Loop)
void loop() {
Blynk.run();
timer.run();
}หน้าที่: ส่วนประมวลผลหลักที่จะทำงานวนซ้ำต่อเนื่องไปเรื่อย ๆ อย่างไม่มีที่สิ้นสุด
Blynk.run();: คอยทำหน้าที่เคลียร์คิว คอยตรวจสอบสถานะ และรักษาสายการเชื่อมต่อกับระบบ Cloud ตลอดเวลา รวมถึงรับคำสั่งการกดปุ่มจากหน้าแอปพลิเคชันลงมาที่บอร์ดtimer.run();: คอยตรวจเช็กเวลาที่วิ่งอยู่ตลอดเวลา หากตรวจสอบแล้วพบว่าเวลาเดินผ่านไปครบรอบ 1 วินาทีตามที่ตั้งไว้ ระบบจะกระโดดไปเรียกฟังก์ชันsendSensor()เพื่อส่งข้อมูลชุดใหม่ทันที
💡 แนวทางการนำไปประยุกต์ใช้งานและพัฒนาโครงงาน
หากคุณสามารถเชื่อมต่อบอร์ด ESP32, อ่านค่าเซนเซอร์ DHT11 และส่งข้อมูลขึ้น Blynk ได้สำเร็จแล้ว นี่คือไอเดียและแนวทางในการท้าทายตัวเองเพื่ออัปเกรดโปรเจกต์ให้เจ๋งยิ่งขึ้น หรือนำไปต่อยอดเป็นโครงงาน (Project) ครับ
ไอเดียการปรับยุกต์ใช้งาน
- ระบบเตือนภัย (Notification System): เขียนโค้ดเพิ่มเงื่อนไขในฟังก์ชัน
sendSensor()ว่าถ้าอุณหภูมิเกิน 35 องศา ให้ส่งแจ้งเตือน (Push Notification) เข้ามือถือทันทีผ่านคำสั่งBlynk.logEvent("hot_alert", "อากาศร้อนเกินไปแล้ว!"); - ระบบควบคุมอัตโนมัติ (Automation Control): นำโมดูลรีเลย์ (Relay) มาต่อเพิ่มเข้ากับ ESP32 เพื่อควบคุมพัดลมหรือปั๊มน้ำ จากนั้นเขียนเงื่อนไขสั่งการ เช่น "ถ้าความชื้นต่ำกว่าค่าที่กำหนด ให้เปิดพัดลมพ่นหมอกโดยอัตโนมัติ"
- เพิ่มหน้าจอแสดงผลภายนอก (Physical Display): นำหน้าจอ OLED I2C มาต่อใช้งานร่วมกับบอร์ด เพื่อให้สามารถอ่านค่าอุณหภูมิและความชื้นได้จากทั้งหน้าจอตั้งโต๊ะ และบนหน้าจอสมาร์ตโฟนผ่านแอปพลิเคชัน Blynk พร้อมกัน
ตัวอย่างการต่อยอดเป็นโครงงาน IoT
นักเรียนและนักศึกษาสามารถนำความรู้และโค้ดฐานจากโปรเจกต์นี้ ไปพัฒนาเป็นโครงงานประเภทต่าง ๆ ที่ตอบโจทย์การใช้งานจริงได้ดังนี้:
🏢 ด้านอาคารและที่อยู่อาศัย
| 🌱 ด้านการเกษตรและอุตสาหกรรม
|
🎯 สรุป: การทำความเข้าใจหลักการพื้นฐาน เช่น การอ่านค่าจากเซนเซอร์, การเชื่อมต่อเครือข่าย Wi-Fi และการรับส่งข้อมูลขึ้นระบบ Cloud เป็นหัวใจสำคัญที่จะช่วยให้นักศึกษาสามารถเปลี่ยนไปประยุกต์ใช้กับเซนเซอร์ประเภทอื่น ๆ ได้อย่างง่ายดายในอนาคต ไม่ว่าจะเป็น DHT22 (แม่นยำสูง), Soil Moisture (วัดความชื้นในดิน), MQ Gas Sensor (ตรวจจับแก๊ส), PIR Motion Sensor (ตรวจจับความเคลื่อนไหว) หรือเซนเซอร์วัดความเข้มแสง เพื่อพัฒนาไปสู่ระบบ IoT ที่ซับซ้อนและตอบโจทย์โลกยุคดิจิทัลได้อย่างแท้จริงครับ
