สวัสดีครับนักศึกษาทุกคน ในบทที่แล้วเราพา ESP32 เชื่อมต่อ WiFi ได้สำเร็จแล้ว วันนี้เราจะมาหา “ข้อมูลจริง” เพื่อเตรียมส่งขึ้นระบบ Cloud กันครับ

เซนเซอร์ที่นักศึกษาอิเล็กทรอนิกส์ทุกคนต้องเคยผ่านมือคือ DHT11 (สีฟ้า) หรือ DHT22 (สีขาว) ซึ่งทำหน้าที่วัดอุณหภูมิและความชื้นในอากาศ แต่การจะอ่านค่าจากมันนั้นไม่ง่ายเหมือนการอ่านค่า Analog (บทที่ 6) เพราะมันใช้การส่งข้อมูลแบบดิจิทัลที่มีรูปแบบเฉพาะตัว (Digital Signal)

ดังนั้น บทนี้เราจะมาเรียนรู้วิธีลัดและวิธีที่ถูกต้อง คือการใช้ Library (ชุดคำสั่งสำเร็จรูป) ที่ผู้เชี่ยวชาญเขียนไว้ให้แล้ว มาช่วยให้เราเขียนโค้ดได้ง่ายขึ้นครับ


1. รู้จักกับ DHT11 vs DHT22

แม้หน้าตาจะคล้ายกัน แต่สเปกต่างกันพอสมควรครับ:

  • DHT11 (สีฟ้า): ราคาถูก, วัดอุณหภูมิได้ 0-50°C (ความแม่นยำ ±2°C), ความชื้น 20-80% -> เหมาะสำหรับการเรียนรู้เบื้องต้น

  • DHT22 (สีขาว): ราคาแพงกว่า, วัดได้กว้างกว่า -40 ถึง 80°C (แม่นยำ ±0.5°C), ความชื้น 0-100% -> เหมาะสำหรับงานจริง/โรงเรือน

2. วิธีติดตั้ง Library (สำคัญมาก!)

ก่อนจะเขียนโค้ด เราต้องติดตั้ง “เครื่องมือแปลภาษา” ของ DHT11 ลงใน Arduino IDE ก่อนครับ

  1. เปิดโปรแกรม Arduino IDE
  2. ไปที่เมนู Sketch > Include Library > Manage Libraries… (หรือกดปุ่มรูปหนังสือซ้อนกันแถบซ้ายมือ)
  3. ในช่องค้นหา พิมพ์คำว่า DHT sensor library
  4. มองหาชื่อ “DHT sensor library by Adafruit”
  5. กดปุ่ม INSTALL
    • ข้อควรระวัง: ถ้ามีหน้าต่างเด้งขึ้นมาถามว่าให้ลง “Dependencies” (เช่น Adafruit Unified Sensor) ด้วยไหม? ให้กด Install ALL (ลงทั้งหมด) ไม่งั้นจะคอมไพล์ไม่ผ่านครับ

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

เซนเซอร์ DHT11 ที่ขายกันมักจะมาในรูปแบบ “โมดูล” (มีแผ่นวงจร PCB เล็กๆ รองรับ) ซึ่งจะมี 3 ขา:

  1. VCC (+): ต่อเข้าไฟ 3.3V (หรือ 5V ก็ได้ แต่ ESP32 แนะนำ 3.3V)
  2. DATA (Out): ต่อเข้าขา GPIO ของ ESP32 (ในที่นี้เราจะใช้ GPIO 15)
  3. GND (-): ต่อเข้า GND

หมายเหตุ: หากนักศึกษาใช้ DHT11 แบบตัวเปล่าๆ (4 ขา) ต้องต่อตัวต้านทาน Pull-up 10kΩ ระหว่างขา VCC กับขา Data ด้วย แต่ถ้าเป็นโมดูลสำเร็จรูป ส่วนใหญ่จะมีมาให้แล้วครับ


4. โค้ดโปรแกรมอ่านค่าอุณหภูมิ

C++
#include "DHT.h" // เรียกใช้ Library

#define DHTPIN 15     // ขา GPIO ที่ต่อกับขา Data ของเซนเซอร์
#define DHTTYPE DHT11 // กำหนดรุ่นเซนเซอร์ (ถ้าใช้สีขาวให้แก้เป็น DHT22)

// ประกาศ Object ชื่อ dht
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  Serial.println("DHT11 Test!");

  dht.begin(); // เริ่มต้นการทำงานของเซนเซอร์
}

void loop() {
  // รอสัก 2 วินาที (DHT11 อ่านค่าถี่เกินไปไม่ได้)
  delay(2000);

  // อ่านค่าความชื้น
  float h = dht.readHumidity();
  // อ่านค่าอุณหภูมิ (Celsius)
  float t = dht.readTemperature();

  // ตรวจสอบว่าอ่านค่าสำเร็จไหม (Check if any reads failed)
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return; // จบรอบนี้ไปก่อน เริ่ม loop ใหม่
  }

  // แสดงผลทาง Serial Monitor
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %");
  Serial.print("  |  ");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.println(" °C");
}

5. ปัญหาที่พบบ่อย (Troubleshooting)

  1. ขึ้นว่า “Failed to read…”:
    • เช็คสายไฟว่าหลวมหรือไม่?
    • เสียบขาถูกไหม? (บางยี่ห้อเรียงขาไม่เหมือนกัน ให้ดูสกรีนบนบอร์ด S, -, + เป็นหลัก)
    • เลือก DHTTYPE ในโค้ดผิดรุ่นหรือไม่?
  2. ค่าอุณหภูมิเพี้ยนเวอร์:
    • สายยาวเกินไปหรือไม่? (สาย Data ไม่ควรยาวเกิน 20 เมตร)
    • ไฟเลี้ยงไม่พอ (ลองเปลี่ยนจาก 3.3V เป็น 5V ดูเฉพาะขา VCC)

สรุปท้ายบท

การใช้ Library ช่วยให้ชีวิตนักพัฒนา IoT ง่ายขึ้นมากครับ แทนที่จะต้องมานั่งเขียนโค้ดจับเวลาสัญญาณระดับไมโครวินาที เราแค่สั่ง dht.readTemperature() ก็ได้ค่ามาใช้งานเลย

ภารกิจต่อไป: ตอนนี้เรามีครบองค์ประกอบแล้วครับ

  1. เชื่อมต่อเน็ตได้ (จากบทที่ 8)
  2. มีข้อมูลอุณหภูมิ (จากบทที่ 9)

ในบทความหน้า เราจะนำสองอย่างนี้มารวมกัน เพื่อ “ส่งข้อมูลอุณหภูมิขึ้นสู่เว็บไซต์” ผ่านโปรโตคอลพื้นฐานที่สุดของโลกอินเทอร์เน็ต นั่นคือ HTTP GET/POST ครับ เตรียมตัวให้พร้อม!


หมายเหตุ:

  • ผมเน้นเรื่องการกด Install ALL ตอนลง Library เพราะเป็นจุดที่มือใหม่ตกม้าตายบ่อยที่สุด (ลงไม่ครบแล้ว Compile Error)