• ติดตามบน
[Step-by-Step] เรียนรู้การสร้างระบบ IoT วัดอุณหภูมิและความชื้นด้วย ESP32 + DHT11 ส่งข้อมูลเข้า Blynk

[Step-by-Step] เรียนรู้การสร้างระบบ IoT วัดอุณหภูมิและความชื้นด้วย ESP32 + DHT11 ส่งข้อมูลเข้า Blynk

Chalothorn Kosakul 06 กรกฎาคม 2569 24 ครั้ง

สวัสดีครับในบทความนี้เราจะมาลงมือทำโปรเจกต์พื้นฐานยอดนิยม แต่สามารถเอาไปต่อยอดทำระบบสมาร์ตฟาร์มหรือระบบตรวจวัดสภาพอากาศในบ้านได้จริง นั่นคือ "การอ่านค่าอุณหภูมิและความชื้นจากเซนเซอร์ DHT11 แล้วส่งขึ้นไปแสดงผลสวยๆ บนแอปพลิเคชัน Blynk IoT ด้วยบอร์ด ESP32" ผ่าน Wi-Fi ครับ

ถ้าพร้อมแล้ว เตรียมอุปกรณ์แล้วมาเริ่มกันเลย!


อุปกรณ์ที่ต้องใช้ในโปรเจกต์นี้

รายการอุปกรณ์ลิงก์จัดซื้อ
1. บอร์ด ESP32 DevKit V1 (หรือรุ่นใดก็ได้ เช่น NodeMCU)🛒 สั่งซื้อ
2. เซนเซอร์ DHT11 (โมดูลวัดอุณหภูมิและความชื้น)🛒 สั่งซื้อ
3. สายจัมเปอร์ (Female to Female หรือ Male to Female ขึ้นอยู่กับบอร์ด)🛒 สั่งซื้อ



หลักการทำงานของระบบ

ระบบมีขั้นตอนการทำงานดังนี้

  1. ESP32 เชื่อมต่อ Wi-Fi
  2. ESP32 เชื่อมต่อกับ Blynk Cloud
  3. DHT11 อ่านค่าอุณหภูมิ
  4. DHT11 อ่านค่าความชื้น
  5. ESP32 ส่งข้อมูลไปยัง Blynk ผ่าน Virtual Pin
  6. แอป Blynk แสดงผลบน Dashboard

การต่อวงจร (Wiring Diagram)

การต่อสายระหว่าง ESP32 กับ DHT11 (แบบโมดูล 3 ขา) ทำได้ง่ายๆ ดังนี้ครับ:

ขาของ DHT11ขาของ ESP32หน้าที่
VCC (+)3.3V หรือ 5Vจ่ายไฟเลี้ยงเซนเซอร์
GND (-)GNDต่อสาย -
DATA (OUT)GPIO 2ส่งสัญญาณข้อมูล
⚠️ ข้อควรระวัง: ตรวจสอบขา 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 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();
}

📝 อธิบายการทำงานของโค้ดทีละส่วน

เพื่อให้เข้าใจการทำงานของโปรเจกต์นี้อย่างลึกซึ้ง เรามาดูรายละเอียดของโค้ดในแต่ละส่วนกันครับ


📌 ส่วนที่ 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 ไหนบนหน้าเว็บ Blynk
  • BLYNK_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 สำหรับใช้งาน Blynk
  • ssid: ตัวแปรเก็บชื่อสัญญาณ (SSID) เครือข่าย Wi-Fi ของคุณ
  • pass: ตัวแปรเก็บรหัสผ่านสำหรับเข้าใช้งาน Wi-Fi

💡 เมื่อเปิดเครื่องขึ้นมา บอร์ด ESP32 จะดึงข้อมูลจากตัวแปรทั้งสามนี้ไปใช้เชื่อมต่ออินเทอร์เน็ตโดยอัตโนมัติ


📌 ส่วนที่ 4: ตั้งค่าและสร้างวัตถุเซนเซอร์ (Object)

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

หน้าที่: กำหนดรายละเอียดทางกายภาพให้กับตัวเซนเซอร์วัดอุณหภูมิและความชื้น

  • DHTPIN 2: ระบุว่าต่อสายสัญญานข้อมูล (Data) เข้ากับพิน GPIO 2 ของบอร์ด ESP32
  • DHTTYPE DHT11: เจาะจงชนิดรุ่นของเซนเซอร์ว่าเป็นรุ่น DHT11
  • DHT 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);
}

หน้าที่: อ่านค่าสภาพแวดล้อมปัจจุบันแล้วจัดส่งขึ้นสู่หน้าแดชบอร์ด มีขั้นตอนย่อยดังนี้:

  1. อ่านค่าเข้าตัวแปร: ใช้ตัวแปรทศนิยมประเภท float ในการเก็บค่าที่อ่านได้ เช่น 28.6 หรือ 31.2 โดย h คือความชื้น และ t คืออุณหภูมิ
  2. ตรวจสอบความถูกต้อง: ใช้ฟังก์ชัน isnan() (Is Not A Number) เพื่อเช็กว่ามีข้อผิดพลาดจากการอ่านค่าหรือไม่ หากสายหลุดหรือเซนเซอร์พัง ระบบจะแสดงคำว่า "Failed..." บน Serial Monitor และสั่ง return เพื่อออกจากฟังก์ชันทันที ช่วยป้องกันการส่งข้อมูลขยะขึ้น Cloud
  3. ส่งข้อมูลขึ้น 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

นักเรียนและนักศึกษาสามารถนำความรู้และโค้ดฐานจากโปรเจกต์นี้ ไปพัฒนาเป็นโครงงานประเภทต่าง ๆ ที่ตอบโจทย์การใช้งานจริงได้ดังนี้:

🏢 ด้านอาคารและที่อยู่อาศัย

  • ระบบตรวจวัดและควบคุมอุณหภูมิภายในห้องเรียน
  • ระบบเฝ้าระวังอุณหภูมิห้องเซิร์ฟเวอร์ (Server Room Monitor)
  • ระบบแจ้งเตือนอัจฉริยะเมื่ออุณหภูมิสูงเกินกำหนด

🌱 ด้านการเกษตรและอุตสาหกรรม

  • ระบบโรงเรือนอัจฉริยะ (Smart Greenhouse / Smart Farm)
  • ระบบควบคุมพัดลมระบายอากาศและปั๊มน้ำอัตโนมัติ
  • ระบบบันทึกข้อมูลสภาพอากาศย้อนหลังเพื่อนำมาวิเคราะห์ (Data Logging)

🎯 สรุป: การทำความเข้าใจหลักการพื้นฐาน เช่น การอ่านค่าจากเซนเซอร์, การเชื่อมต่อเครือข่าย Wi-Fi และการรับส่งข้อมูลขึ้นระบบ Cloud เป็นหัวใจสำคัญที่จะช่วยให้นักศึกษาสามารถเปลี่ยนไปประยุกต์ใช้กับเซนเซอร์ประเภทอื่น ๆ ได้อย่างง่ายดายในอนาคต ไม่ว่าจะเป็น DHT22 (แม่นยำสูง), Soil Moisture (วัดความชื้นในดิน), MQ Gas Sensor (ตรวจจับแก๊ส), PIR Motion Sensor (ตรวจจับความเคลื่อนไหว) หรือเซนเซอร์วัดความเข้มแสง เพื่อพัฒนาไปสู่ระบบ IoT ที่ซับซ้อนและตอบโจทย์โลกยุคดิจิทัลได้อย่างแท้จริงครับ

แชร์บทความนี้