#include <DHT.h>
#include <Wire.h> // ไลบรารี I2C
#include <Adafruit_GFX.h> // ไลบรารีสำหรับกราฟิก
#include <Adafruit_SSD1306.h> // ไลบรารีสำหรับหน้าจอ OLED SSD1306
// ตั้งค่าหน้าจอ
#define SCREEN_ADDRESS 0x3C
#define DISPLAY_WIDTH 128 // ความกว้างของหน้าจอ OLED
#define DISPLAY_HEIGHT 64 // ความสูงของหน้าจอ OLED
// ตั้งค่าเซ็นเซอร์
#define DHTPIN 5 // พินที่เชื่อมต่อเซ็นเซอร์ DHT
#define DHTTYPE DHT22 // ประเภทเซ็นเซอร์ DHT (DHT11 หรือ DHT22)
DHT dht(DHTPIN, DHTTYPE); // สร้างออบเจ็กต์ DHT
Adafruit_SSD1306 display(DISPLAY_WIDTH, DISPLAY_HEIGHT, &Wire, -1); // สร้างออบเจ็กต์สำหรับหน้าจอ OLED
const int analogInPin = 0; // กำหนดขา input เซ็นเซอร์
const int Relay = 2; // กำหนดขา input รีเลย์
int sensorValue = 0; // ตัวแปรค่า Analog
int outputValue = 0; // ตัวแปรสำหรับ Map เพื่อคิด %
const int sensorwater = 4; // ขา analog ที่ต่อกับเซ็นเซอร์
float sensorValuewater; // ตัวแปรเก็บค่าจากเซ็นเซอร์
float level; // ตัวแปรเก็บระดับน้ำ
void setup() {
Serial.begin(9600); // เริ่มต้นการสื่อสาร Serial
dht.begin(); // เริ่มต้นการทำงานของเซ็นเซอร์ DHT
pinMode(Relay, OUTPUT);
// เริ่มต้นการทำงานของหน้าจอ OLED
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.display();
display.clearDisplay();
}
void loop() {
sensorValuewater = analogRead(sensorwater); // อ่านค่าจากเซ็นเซอร์
level = map(sensorValuewater, 0, 1023, 100, 0); // แปลงค่าเป็นระดับน้ำ (0-100%)
sensorValue = analogRead(analogInPin);
outputValue = map(sensorValue, 0, 1023, 100, 0);
if (outputValue <= 40) { //ตั้งค่า % ที่ต้องการจะรดน้ำต้นไม้
digitalWrite(Relay, HIGH); // เมื่อความชื้นน้อยกว่า 40% ให้เปิดปั๊มน้ำ
}
else {
digitalWrite(Relay, LOW); // เมื่อความชื้นมากกว่า 40% ปิดปั๊ม
}
// อ่านค่าอุณหภูมิและความชื้น
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// ตรวจสอบว่าค่าอุณหภูมิและความชื้นถูกต้องหรือไม่
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// แสดงค่าอุณหภูมิบนหน้าจอ OLED
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("Temp: ");
display.print(temperature);
display.print("C\n");
display.print("\nHum: ");
display.print(humidity);
display.print("%\n");
display.print("\nWater level: ");
display.print(level);
display.print("%");
display.display();
// แสดงค่าอุณหภูมิและความชื้นบน Serial
Serial.print("Temp: ");
Serial.print(temperature);
Serial.print(" C, Hum: ");
Serial.print(humidity);
Serial.println("%");
Serial.print(" \nWater level\t");
Serial.print(level);
Serial.println("%");
Serial.print("Ground level\t");
Serial.print(outputValue);
Serial.println(" %");
delay(2000); // รอ 2 วินาที
}