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

ถ้ายังไม่รู้จัก 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

ข้อควรระวัง
- 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)






