// === Pin Mapping ===
#define RELAY_PUMP 13 // เขียว
#define RELAY_VALVE1 14 // แดง - เติมแทงค์
#define RELAY_VALVE2 27 // เหลือง - รดตรง
#define RELAY_VALVE3 26 // ม่วง - รดจากแทงค์
#define SOIL_PIN 34 // analog input ความชื้นดิน
#define LIGHT_PIN 35 // analog input ตรวจแดด
#define FLOAT_HIGH 4 // digital input ลูกลอย HIGH
// === ค่าที่ปรับได้ ===
const int SOIL_THRESHOLD = 2000; // ค่าความชื้นดิน ต่ำกว่า = ดินชื้น
const int LIGHT_THRESHOLD = 2000; // ค่าความเข้มแสง สูงกว่า = มีแดด
const unsigned long WATERING_TIME = 10UL * 1000U; // 10 วินาที (ms)
// === Setup ===
void setup() {
Serial.begin(115200);
// ตั้งขารีเลย์เป็น OUTPUT
pinMode(RELAY_PUMP, OUTPUT);
pinMode(RELAY_VALVE1, OUTPUT);
pinMode(RELAY_VALVE2, OUTPUT);
pinMode(RELAY_VALVE3, OUTPUT);
// ตั้งค่าเริ่มต้น (ปิดทั้งหมด)
digitalWrite(RELAY_PUMP, LOW);
digitalWrite(RELAY_VALVE1, LOW);
digitalWrite(RELAY_VALVE2, LOW);
digitalWrite(RELAY_VALVE3, LOW);
// ตั้งขาเซ็นเซอร์
pinMode(FLOAT_HIGH, INPUT_PULLUP); // ลูกลอยแบบสวิตช์
Serial.println("🌱 System Start");
}
// === Loop ===
void loop() {
int soil = analogRead(SOIL_PIN);
int light = analogRead(LIGHT_PIN);
bool tankFull = (digitalRead(FLOAT_HIGH) == LOW); // LOW = น้ำเต็ม (สวิตช์กด)
Serial.print("Soil: "); Serial.print(soil);
Serial.print(" | Light: "); Serial.print(light);
Serial.print(" | TankFull: "); Serial.println(tankFull);
// === 1. ตรวจสอบแดด ===
if (light > LIGHT_THRESHOLD) {
Serial.println("☀ มีแดด → เติมแทงค์");
digitalWrite(RELAY_PUMP, HIGH);
digitalWrite(RELAY_VALVE1, HIGH);
// เติมจนกว่าแทงค์เต็ม หรือแดดหมด
while (true) {
light = analogRead(LIGHT_PIN);
tankFull = (digitalRead(FLOAT_HIGH) == LOW);
if (tankFull || light <= LIGHT_THRESHOLD) {
break;
}
delay(1000); // เช็คทุก 1 วิ
}
// ปิดวาล์วเติม
digitalWrite(RELAY_VALVE1, LOW);
if (tankFull) Serial.println("✅ แทงค์เต็มแล้ว");
if (light <= LIGHT_THRESHOLD) Serial.println("🌑 แดดหมดก่อนแทงค์เต็ม");
// === 2. ตรวจสอบแดดอีกครั้งเพื่อรดตรง ===
light = analogRead(LIGHT_PIN);
if (light > LIGHT_THRESHOLD) {
Serial.println("☀ ยังมีแดด → รดตรงจากปั๊ม");
digitalWrite(RELAY_VALVE2, HIGH);
delay(WATERING_TIME);
digitalWrite(RELAY_VALVE2, LOW);
Serial.println("✅ รดตรงเสร็จสิ้น");
} else {
// === 3. ถ้าแดดหมดหลังเติมน้ำ → ตรวจสอบความชื้น ===
Serial.println("🌑 ไม่มีแดด → ตรวจสอบความชื้นดิน");
if (soil > SOIL_THRESHOLD) {
Serial.println("ดินแห้ง → รดจากแทงค์");
digitalWrite(RELAY_VALVE3, HIGH);
delay(WATERING_TIME);
digitalWrite(RELAY_VALVE3, LOW);
Serial.println("✅ รดจากแทงค์เสร็จสิ้น");
} else {
Serial.println("💧 ดินชื้นพอแล้ว → ไม่รด");
}
}
// ปิดปั๊ม
digitalWrite(RELAY_PUMP, LOW);
}
else {
// === ไม่มีแดดตั้งแต่แรก → ตรวจสอบความชื้น ===
Serial.println("🌑 ไม่มีแดดตั้งแต่แรก → ตรวจสอบความชื้นดิน");
if (soil > SOIL_THRESHOLD) {
Serial.println("ดินแห้ง → รดจากแทงค์");
digitalWrite(RELAY_VALVE3, HIGH);
delay(WATERING_TIME);
digitalWrite(RELAY_VALVE3, LOW);
Serial.println("✅ รดจากแทงค์เสร็จสิ้น");
} else {
Serial.println("💧 ดินชื้นพอแล้ว → ไม่รด");
}
}
// จำลองรอบการทำงานวันละครั้ง (ตอนนี้ 10 วิสำหรับทดสอบ)
delay(10000);
}