#include <Wire.h> // ไลบรารีสำหรับสื่อสารผ่าน I2C
#include <Adafruit_GFX.h> // ไลบรารีสำหรับจัดการกราฟิกพื้นฐาน
#include <Adafruit_SSD1306.h> // ไลบรารีสำหรับควบคุมจอ OLED ที่ใช้ชิป SSD1306
#include "DHT.h" // ไลบรารีสำหรับเซนเซอร์ DHT
// กำหนดขนาดจอ OLED
#define SCREEN_WIDTH 128 // ความกว้างของจอ OLED (พิกเซล)
#define SCREEN_HEIGHT 64 // ความสูงของจอ OLED (พิกเซล)
// ที่อยู่ I2C ของจอ OLED
#define OLED_ADDR 0x3C // ที่อยู่ I2C ของจอ (มักเป็น 0x3C หรือ 0x3D)
// กำหนดพินที่เซนเซอร์เชื่อมต่อ
#define DHTPIN 4 // กำหนดพินที่เซนเซอร์เชื่อมต่อ
#define DHTTYPE DHT22 // กำหนดประเภทเซนเซอร์ (DHT22)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire); // สร้างออบเจ็กต์สำหรับจอ OLED
DHT dht(DHTPIN, DHTTYPE); // สร้างออบเจ็กต์ DHT
void setup() {
Serial.begin(115200); // เริ่มการเชื่อมต่อ Serial ที่ความเร็ว 115200 baud
Serial.println("Hello, ESP32!"); // แสดงข้อความใน Serial Monitor
// เริ่มต้นการทำงานของจอ OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
// หากการเริ่มต้นจอล้มเหลว ให้แสดงข้อความใน Serial Monitor
Serial.println(F("SSD1306 allocation failed"));
while (true); // หยุดการทำงานทั้งหมด
}
// เริ่มต้นเซนเซอร์ DHT
dht.begin(); // เริ่มต้นเซนเซอร์
// ล้างหน้าจอและตั้งค่าข้อความ
display.clearDisplay(); // ล้างข้อมูลทั้งหมดบนจอ
display.setTextSize(1); // ตั้งขนาดข้อความเป็น 1 เท่า
display.setTextColor(SSD1306_WHITE); // ตั้งสีข้อความเป็นสีขาว
display.setCursor(0, 0); // ตั้งตำแหน่งข้อความที่พิกัด (0,0)
}
void loop() {
// หน่วงเวลา 2 วินาที
delay(2000);
// อ่านค่าความชื้น
float h = dht.readHumidity();
// อ่านค่าอุณหภูมิ (Celsius)
float t = dht.readTemperature();
// ตรวจสอบว่าอ่านค่าไม่ได้ (NaN คือค่าไม่ถูกต้อง)
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
return; // ถ้าอ่านค่าไม่ได้ ให้กลับไปเริ่มต้นใหม่
}
// ล้างหน้าจอและแสดงข้อมูลใหม่
display.clearDisplay();
display.setCursor(0, 0); // ตั้งตำแหน่งข้อความที่พิกัด (0,0)
// แสดงอุณหภูมิและความชื้น
display.print(F("Temp: "));
display.print(t); // แสดงค่าอุณหภูมิ
display.print(F(" C Humidity: "));
display.print(h); // แสดงค่าความชื้น
display.print(F(" %"));
// อัปเดตจอภาพเพื่อแสดงข้อมูลทั้งหมด
display.display();
}