ระบบตรวจความชื้นกระถางแขวน — ATtiny85 + LED แจ้งเมื่อดินแห้ง

เฟิร์นกระถางแขวน — ปัญหาที่เจอบ่อย

ต้นเฟิร์น (Fern) เป็นพืชที่ชอบความชื้นสม่ำเสมอ แต่ กระถางแขวน มีข้อจำกัด:

  • ❌ เดินสายไฟลำบาก — ไม่มีปลั๊กใกล้ ๆ
  • ❌ เช็คดินยาก — ต้องปีนหรือลดกระถางลงมา
  • ❌ ลืมรดน้ำบ่อย — โดยเฉพาะเฟิร์นที่ต้องการน้ำเกือบทุกวัน
  • ❌ รดน้ำเยอะไปก็แฉะ — รากเน่า

แนวทางแก้: ระบบตรวจเช็คความชื้นแบบไร้สาย ใช้แบตเตอรี่ อายุการใช้งานหลายเดือน แจ้งเตือนด้วย LED กระพริบเมื่อดินแห้ง

ระบบที่เราจะสร้าง

ชิ้นส่วนอุปกรณ์ราคา
🧠 MCUATtiny85 หรือ ESP8266 (Deep Sleep)~30-80 บาท
💧 เซ็นเซอร์ความชื้นCapacitive Soil Moisture Sensor v1.2~50-80 บาท
🔴 ไฟแจ้งLED + Resistor 220Ω~5 บาท
🔋 แบต18650 Li-Ion 3.7V 3,000mAh~80-150 บาท
📦 กล่องกล่องกันน้ำเล็ก + ท่อหด~50 บาท
รวม~215-365 บาท

ทำไมต้อง Capacitive Sensor?

YL-69 (Resistive) ที่มีบทความก่อนหน้านี้ — ใช้หลักการวัดความต้านทานระหว่างขั้วทองแดง 2 ขั้ว

ข้อเสีย: ทองแดง corrode ไวเพราะกระแสไฟฟ้าไหลผ่านดินชื้น → อายุสั้น (ไม่กี่เดือน)

Capacitive Sensor — วัดค่า capacitance ของดิน (ไม่มีขั้วเปลือย, เคลือบสารกันน้ำ)

  • ✅ ไม่มีการสึกกร่อน — อยู่ได้นานหลายปี
  • ✅ กินไฟน้อย — วัดทีเดียว (~5mA) แล้วปิด
  • ✅ ทนทาน — เคลือบอีพ็อกซีกันน้ำ

วงจรและการต่อ

แบต 18650 3.7V ────[ TP4056 charge ]──── 5V USB
                      │
                  [HT7833 3.3V reg]
                      │
                   3.3V ──── ATtiny85 Pin 8 (VCC)
                              ATtiny85 Pin 4 (GND)
                              ATtiny85 Pin 7 (PB2) → LED + 220Ω → GND
                              ATtiny85 Pin 5 (PB0) → Capacitive Sensor AOUT

หรือใช้ ESP8266 (NodeMCU) ถ้าอยากได้ WiFi แจ้งเตือน:

NodeMCU (ESP8266):
  D1 (GPIO5) → Capacitive Sensor VCC (ควบคุมเปิด-ปิด)
  A0        → Capacitive Sensor AOUT
  D2 (GPIO4) → LED + 220Ω → GND

  Deep Sleep: GPIO16 → RST (เชื่อมต่อเพื่อ wake)

Source Code — ATtiny85 (ประหยัดแบตที่สุด)

// Fern Watch — ATtiny85 + Capacitive Soil Sensor + LED Alert
// ทำงานทุก 30 นาที วัดความชื้น ถ้าแห้ง → กระพริบ LED 10 ครั้ง

const int SENSOR_PIN = PB0;  // AOUT
const int LED_PIN = PB2;     // LED + 220Ω
const int DRY_THRESHOLD = 550;  // ปรับตามเซ็นเซอร์ (0-1023)
const unsigned long SLEEP_MIN = 30;  // ตรวจทุก 30 นาที

void setup() {
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
}

void loop() {
  int moisture = readMoisture();
  
  if (moisture > DRY_THRESHOLD) {
    // ดินแห้ง — กระพริบ LED
    for (int i = 0; i < 10; i++) {
      digitalWrite(LED_PIN, HIGH);
      delay(200);
      digitalWrite(LED_PIN, LOW);
      delay(200);
    }
  }
  
  // Deep Sleep
  sleep(SLEEP_MIN * 60000L);  // แปลงนาทีเป็น ms
}

int readMoisture() {
  // Capacitive sensor: ยิ่งชื้น → ยิ่งได้ค่าต่ำ
  // ยิ่งแห้ง → ยิ่งได้ค่าสูง
  int total = 0;
  for (int i = 0; i < 5; i++) {
    total += analogRead(SENSOR_PIN);
    delay(10);
  }
  return total / 5;  // ค่าเฉลี่ย
}

// ATtiny85 Deep Sleep — ใช้ Watchdog Timer
#include <avr/sleep.h>
#include <avr/wdt.h>

void sleep(unsigned long ms) {
  int cycles = ms / 8000;  // WDT สูงสุด 8 วินาที
  for (int i = 0; i < cycles; i++) {
    wdt_enable(WDTO_8S);
    WDTCSR |= (1 << WDIE);  // Enable interrupt mode
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_mode();
    // กลับมาทำงานต่อเมื่อ WDT interrupt
    sleep_disable();
    wdt_disable();
  }
}

// WDT Interrupt — ปลุก ATtiny85
ISR(WDT_vect) {
  // แค่ปลุก — ไม่ต้องทำอะไร
}

Source Code — ESP8266 (มี WiFi แจ้ง LINE/Telegram)

// Fern Watch ESP8266 — เช็คความชื้น + Deep Sleep + (optional) WiFi alert

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

const int SENSOR_POWER = 5;   // D1 — ควบคุม VCC เซ็นเซอร์
const int SENSOR_PIN = A0;    // A0 — อ่านค่า
const int LED_PIN = 4;        // D2 — LED

const int DRY_THRESHOLD = 550;
const int SLEEP_MIN = 60;     // ตรวจทุก 1 ชม.

// WiFi (optional — ถ้าต้องการแจ้งเตือน)
const char* ssid = "HOME_WIFI";
const char* pass = "wifi_password";

void setup() {
  pinMode(SENSOR_POWER, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  
  // เปิดไฟเซ็นเซอร์เฉพาะตอนวัด
  digitalWrite(SENSOR_POWER, HIGH);
  delay(100);
  
  int moisture = readMoisture();
  
  // ปิดเซ็นเซอร์
  digitalWrite(SENSOR_POWER, LOW);
  
  if (moisture > DRY_THRESHOLD) {
    // ดินแห้ง — กระพริบ LED
    blinkLED(10);
    
    // Optional: ส่งแจ้งเตือน WiFi
    // sendAlert("🌿 เฟิร์นแห้ง! กรุณารดน้ำ");
  }
  
  // Deep Sleep
  ESP.deepSleep(SLEEP_MIN * 60 * 1000000ULL);
}

void loop() {}  // ไม่ได้ใช้ — Deep Sleep ตลอด

int readMoisture() {
  int total = 0;
  for (int i = 0; i < 5; i++) {
    total += analogRead(SENSOR_PIN);
    delay(10);
  }
  return total / 5;
}

void blinkLED(int times) {
  for (int i = 0; i < times; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    delay(200);
  }
}

void sendAlert(String msg) {
  WiFi.begin(ssid, pass);
  int tries = 0;
  while (WiFi.status() != WL_CONNECTED && tries < 20) {
    delay(500);
    tries++;
  }
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin("https://api.telegram.org/botTOKEN/sendMessage");
    http.addHeader("Content-Type", "application/json");
    String body = "{\"chat_id\":\"CHAT_ID\",\"text\":\"" + msg + "\"}";
    http.POST(body);
    http.end();
  }
}

อายุแบตเตอรี่ — ทำงานได้นานแค่ไหน?

ATtiny85 + CR2032 (แบตกระดุม)

กระแสตอน Deep Sleep:   < 0.1 µA
กระแสตอนวัด:           ~5 mA (100ms)
กระแสตอน LED กระพริบ:  ~10 mA (4 วินาที 10 ครั้ง)
แบต CR2032:            ~220 mAh

Scenario: เช็คทุก 30 นาที, แห้งวันละ 2 ครั้ง

ต่อวัน:
  Deep Sleep 23 ชม. 59 นาที: 0.1µA × 24h = 0.0024 mAh
  วัด 48 ครั้ง/วัน: 5mA × 0.1s × 48 = 0.0067 mAh
  LED กระพริบ 2 ครั้ง/วัน: 10mA × 4s × 2 = 0.022 mAh

รวม/วัน ≈ 0.03 mAh
**CR2032 220 mAh อยู่ได้ ≈ 7,333 วัน ≈ 20 ปี!** 🤯

ในโลกจริง: Self-discharge ของ CR2032 (~1-2% ต่อปี) ทำให้อายุจริง ~5-8 ปี — ซึ่งมากเกินพอสำหรับเฟิร์นกระถางแขวน

ESP8266 + 18650 (พร้อม WiFi)

กระแส Deep Sleep:   ~20 µA (ESP8266)
กระแสวัด + WiFi:    ~80 mA (10 วินาที)
แบต 18650 3.7V 3,000 mAh

Scenario: เช็คทุก 1 ชม., แห้งวันละ 1 ครั้ง (ส่งแจ้งเตือน)

ต่อวัน:
  Deep Sleep 23 ชม. 59 นาที: 20µA × 24h = 0.48 mAh
  วัด 24 ครั้ง/วัน: 80mA × 10s × 24 = 5.33 mAh
  ส่งแจ้ง 1 ครั้ง: 80mA × 5s = 0.11 mAh

รวม/วัน ≈ 6 mAh
**18650 3,000 mAh อยู่ได้ ≈ 500 วัน = 1 ปี 4 เดือน** ✅

การติดตั้งสำหรับเฟิร์นกระถางแขวน

  1. ติดเซ็นเซอร์: เสียบ Capacitive Sensor ลงดินเฉียง 45° ห่างจากโคนต้น ~3-5 ซม. depth ~4-6 ซม.
  2. ยึดกล่อง: ใช้ Cable Tie รัดกล่องกันน้ำเข้ากับขากระถางหรือโซ่แขวน
  3. LED: เจาะรูเล็ก ๆ ที่กล่อง หรือใช้ Flashing LED สีแดง (กระพริบในตัว)
  4. สายเซ็นเซอร์: ถ้าต้องยาว ใช้สาย Siamese (VCC+GND+AOUT คู่กัน) หรือเพิ่มขด filter capacitor 0.1µF ที่หัวเซ็นเซอร์
  5. กันน้ำ: จุ่มข้อต่อสายด้วย Liquid Tape หรือ Tesa 4651 — โดยเฉพาะจุดต่อที่โดนน้ำรด

ปรับค่า Threshold สำหรับเฟิร์น

เฟิร์นชอบความชื้นสูง (อย่าให้แห้งสนิท) — ควรตั้งค่าให้แจ้งเตือนเมื่อดินเริ่มแห้ง ยังไม่ถึงขั้นแห้งสนิท

  • 🔵 เปียกมาก: 200-350 — เพิ่งรดน้ำ ไม่ต้องทำอะไร
  • 🟢 ชื้น: 350-500 — ยังโอเค เฝ้าดู
  • 🟡 เริ่มแห้ง: 500-650 — แจ้งเตือน!
  • 🔴 แห้ง: 650-800 — รีบรดน้ำ!

Tip: ทดสอบโดยจุ่มเซ็นเซอร์ในน้ำ แล้วค่อย ๆ ดึงขึ้นมา อ่านค่า analog → ตั้ง threshold ที่ 60-70% ของช่วง

Pro Tips สำหรับต้นเฟิร์น

  • 🌿 เฟิร์นชอบความชื้นสูง แต่รากอย่าแช่น้ำ — กระถางต้องมีรูระบายน้ำ
  • 💧 ถ้า LED กระพริบ — ให้รดน้ำ แบบช้า ๆ จนน้ำไหลออกก้นกระถาง
  • ☀️ เฟิร์นชอบ แสงรำไร — ไม่ถูกแดดโดยตรง (จะทำให้ดินแห้งเร็ว)
  • 🌬️ กระถางแขวนมักลมโกรก — ดินแห้งเร็วกว่าปกติ ตั้ง threshold ให้ไวขึ้นอีกหน่อย
  • 🔋 ถ้าใช้ ATtiny85 + CR2032 — อายุแบตแทบไม่ต้องคิด ใส่แล้วลืมได้เลย

⚠️ หมายเหตุ: เนื้อหาค้นคว้าและเรียบเรียงโดย Hermes AI — ข้อมูลทางเทคนิคควรตรวจสอบก่อนนำไปใช้งานจริง

⚠️ เนื้อหาถูกสร้างโดย AI (Hermes AI) — ข้อมูลทางเทคนิคอาจต้องตรวจสอบก่อนนำไปใช้งานจริง