DHT22 + LCD1602 I2C แสดงค่าอุณหภูมิและความชื้นด้วย ESP32

บทนำ

หลายคนที่เริ่มเล่น ESP32 อาจจะสงสัยว่า “เราจะทำยังไงให้ค่าอุณหภูมิและความชื้นโชว์บนจอได้จริง?”
บทความนี้พี่จะพาน้องมาลองต่อ DHT22 (วัดอุณหภูมิและความชื้น) ร่วมกับ LCD1602 I2C (จอแสดงผลข้อความ) กันครับ

แสดงผลอุณหภูมิ 29.4°C และความชื้น 76.8% บนจอ LCD1602 I2C ที่เชื่อมกับ ESP32 และเซนเซอร์ DHT22

ถ้ายังไม่รู้จัก ESP32 คืออะไร แนะนำให้อ่านบทความนี้ก่อน:
ESP32 คืออะไร? การใช้งานเบื้องต้น

อุปกรณ์ที่ใช้

  • ESP32 DevKit V1
  • DHT22 Sensor
  • LCD1602 + โมดูล I2C (Address ปกติ 0x27)
  • สาย Jumper + Breadboard

แนะนำบทความอ่านเพิ่มเติม:
การใช้งาน DHT22 เบื้องต้น
การใช้งาน LCD1602 I2C กับ ESP32

การต่อวงจร

การต่อขา DHT22

  • VCC → 3.3V
  • GND → GND
  • DATA → GPIO 4 (กำหนดในโค้ด)

การต่อ LCD1602 I2C

  • VCC → 5V
  • GND → GND
  • SDA → GPIO 21 (Default I2C SDA ของ ESP32)
  • SCL → GPIO 22 (Default I2C SCL ของ ESP32)

โค้ด ESP32 (Arduino IDE)

/* Deva DIY : DHT22 + LCD1602 I2C */

// ----------------- Include Library -----------------
#include <Wire.h>                // ใช้ I2C
#include <LiquidCrystal_I2C.h>   // ไลบรารี LCD I2C
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

// ----------------- กำหนดค่า Pin -------------------
#define DHTPIN 4        // กำหนดขา DATA ของ DHT22
#define DHTTYPE DHT22   // ระบุชนิดเซนเซอร์

// ----------------- สร้าง Object -------------------
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);  // Address 0x27, ขนาด 16x2

void setup() {
  Serial.begin(115200);

  // เริ่มต้น LCD
  lcd.init();           
  lcd.backlight();      // เปิดไฟแบคไลท์

  // เริ่มต้น DHT22
  dht.begin();

  // ข้อความเริ่มต้น
  lcd.setCursor(0, 0);
  lcd.print("Deva DIY Demo");
  lcd.setCursor(0, 1);
  lcd.print("DHT22 + LCD1602");
  delay(2000);
  lcd.clear();
}

void loop() {
  // อ่านค่าเซนเซอร์
  float h = dht.readHumidity();     // ความชื้น (%)
  float t = dht.readTemperature();  // อุณหภูมิ (C)

  // ตรวจสอบว่าค่าอ่านสำเร็จหรือไม่
  if (isnan(h) || isnan(t)) {
    Serial.println("อ่านค่า DHT22 ไม่สำเร็จ!");
    lcd.setCursor(0, 0);
    lcd.print("Sensor Error   ");
    delay(2000);
    return;
  }

  // แสดงค่า Serial Monitor
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print("%  Temp: ");
  Serial.print(t);
  Serial.println("C");

  // แสดงผลบน LCD
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C   ");  // เคลียร์ช่องเก่า

  lcd.setCursor(0, 1);
  lcd.print("Hum : ");
  lcd.print(h);
  lcd.print(" %   ");

  delay(2000); // หน่วงเวลา 2 วินาที
}


ก่อนเขียนโปรแกรมให้บอร์ด Arduino อย่าลืมติดตั้ง IDE ให้ถูกต้องก่อน ตามคำแนะนำใน Arduino IDE Download & Install

ดาวน์โหลดโค้ดที่นี้

กรุณา เข้าสู่ระบบ เพื่อดาวน์โหลด

คำอธิบายโค้ด

  • LiquidCrystal_I2C lcd(0x27, 16, 2); → ระบุ address ของ LCD (เช็คด้วย i2c scanner ได้)
  • dht.readTemperature() → อ่านค่าอุณหภูมิ
  • dht.readHumidity() → อ่านค่าความชื้น
  • lcd.setCursor(col, row) → กำหนดตำแหน่งที่จะแสดงข้อความบน LCD
บอร์ด ESP32 DevKit V1 เชื่อมต่อกับ DHT22 และ LCD1602 ผ่านโมดูล I2C แสดงสถานะไฟทำงาน

ข้อควรระวัง

  • DHT22 ใช้เวลาตอบสนอง ~2 วินาที อย่า loop เร็วเกินไป
  • ตรวจสอบ address ของ LCD (บางทีเป็น 0x3F)
  • ต่อสาย SDA/SCL ไม่ถูก จอจะไม่ขึ้น

การนำไปต่อยอด

  • ใช้ Relay ควบคุมพัดลม/ปั๊มน้ำตามค่า DHT22
  • เก็บ Log ข้อมูลลง SD Card หรือ Firebase
  • แสดงผลบน OLED / Dashboard ในมือถือผ่าน web server

👉 ดูต่อ: ระบบควบคุม Relay ด้วย ESP32

FAQ – คำถามที่พบบ่อย

DHT22 ต่างจาก DHT11 ยังไง?
→ DHT22 แม่นกว่าและรองรับอุณหภูมิ/ความชื้นก

LCD1602 I2C ต้องใช้ไฟกี่โวลต์?
→ ใช้ 5V (บางรุ่นใช้ 3.3V ได้ แต่ไม่เสถียร)

ถ้าอยากใช้ OLED แทน LCD ทำได้ไหม?
→ ได้เลย ลองอ่าน การใช้งาน DHT + OLED 128×64

ESP32 มี DHT Library อยู่แล้วไหม?
→ ใช้ไลบรารีของ Adafruit ได้ (Adafruit Unified Sensor + DHT sensor library)

จอ LCD ไม่ขึ้น ต้องแก้ยังไง?
→ ตรวจสอบ I2C Address ด้วย i2c scanner

ถ้าต่อหลายจอพร้อมกันได้ไหม?
→ ได้ แต่ต้อง Address ไม่ซ้ำ หรือใช้ I2C Multiplexer

DHT22 ใช้กับ ESP8266 ได้ไหม?
→ ใช้ได้ โค้ดใกล้เคียงกัน

ความละเอียดของ DHT22 เท่าไร?
→ อุณหภูมิ 0.1°C / ความชื้น 0.1%

LCD1602 I2C ต่อกับ Arduino UNO ได้ไหม?
→ ได้เหมือนกัน เพียงเปลี่ยนขา SDA/SCL

ถ้าอยากแสดงค่าองศา F (Fahrenheit) ทำยังไง?
→ ใช้ dht.readTemperature(true)

Shopping Cart
Scroll to Top