ตัดวงจรชีวิตยุงร้าย! สร้างเครื่องดักยุงอัตโนมัติรักษ์โลกด้วย Arduino Nano

Eco-Friendly Automated Mosquito Trap using Arduino Nano

ปัญหายุงกวนใจ กับทริคเด็ดจากชาวสวน

ยุงมักจะชอบมาวางไข่ในน้ำนิ่งๆ ครับ ชาวสวนแถวบ้านผมเลยสอนทริคเด็ดให้คือ "ปล่อยให้ยุงวางไข่ไปเลย แต่ให้เราเทน้ำทิ้งก่อนที่ลูกน้ำจะฟักเป็นตัวยุง!" ซึ่งจะช่วยตัดวงจรการเกิดของยุงรุ่นต่อไปได้เลย ถ้าทำซ้ำทุกๆ 4 วัน ติดต่อกันไม่กี่สัปดาห์ ประชากรยุงแถวนั้นจะลดลงจนแทบไม่เหลือเลยครับ

ผมเลยลองตั้งอ่างน้ำเล็กๆ ในสวนเพื่อล่อยุงให้มาวางไข่ แต่ปัญหาคือ... เราต้องคอยเทน้ำทิ้งและเติมน้ำใหม่ทุก 4 วันเป๊ะๆ ถ้าเผลอลืมเมื่อไหร่นั่นแหละคือการเพาะพันธุ์ยุงชั้นดีเลย (ผมโดนภรรยาบ่นไปสองรอบเพราะลืมเทน้ำเนี่ยแหละ) ผมเลยตัดสินใจสร้างระบบเทน้ำอัตโนมัติด้วย Arduino Nano ซะเลย! ไม่ต้องพึ่งสารเคมี ไม่ต้องจุดตะไคร้หอม ไม่ต้องใช้เครื่องช็อตแมลง ใช้น้ำเปล่ากับระบบจับเวลาล้วนๆ

อุปกรณ์และเครื่องมือที่ต้องใช้ (Hardware & Tools)

ของที่ต้องเตรียมมีตามนี้ครับ:

  • บอร์ด Arduino Nano Every (1 บอร์ด)
  • โมดูลนาฬิกา RTC Maxim Integrated DS3231MPMB1 (1 ตัว)
  • โมดูลจัดการพลังงาน DFRobot Solar Power Manager 5V และ แบตเตอรี่ 3.7V
  • โมดูลรีเลย์ดิจิทัล 5V ของ Seeed Studio (2 ตัว)
  • ปั๊มน้ำจุ่ม 5V (Submersible pump)
  • โซลินอยด์วาล์วน้ำ 12V (Solenoid valve)
  • สวิตช์ลูกลอย (Float switch)
  • โมดูลลดแรงดันไฟ LM2596 Buck Converter
  • พาวเวอร์ซัพพลาย 12V DC
  • เครื่องมือช่าง: หัวแร้งบัดกรี, คีมปอก/ตัดสายไฟ, มัลติมิเตอร์, ไขควงอเนกประสงค์

ระบบนี้ทำงานยังไง? (How It Works)

ระบบนี้จะทำงานเป็นลูป (Loop) เรียบง่ายในกรอบเวลา 4 วันครับ:

  • ตัวตั้งเวลา (Timer) จะเริ่มนับจนครบ 96 ชั่วโมง (4 วัน)
  • รีเลย์ตัวที่ 1 ทำงาน -> สั่งปั๊มน้ำ 5V ดูดน้ำในอ่างทิ้ง จนกว่าสวิตช์ลูกลอยจะตก (ค่าอ่านเป็น LOW)
  • ระบบหน่วงเวลาพักเครื่องสั้นๆ ประมาณ 30 วินาที
  • รีเลย์ตัวที่ 2 ทำงาน -> โซลินอยด์วาล์ว 12V เปิดเพื่อเติมน้ำใหม่เข้าอ่าง จนกว่าสวิตช์ลูกลอยจะลอยขึ้นสุด (ค่าอ่านเป็น HIGH)
  • ระบบจะเข้าสู่โหมดหลับ (Sleep) รอจนกว่าจะครบ 4 วันในรอบถัดไป

เมื่อยุงถูกหลอกให้มาวางไข่ในน้ำนิ่ง ก่อนที่ลูกน้ำจะโตเต็มวัย (ซึ่งใช้เวลาประมาณ 4 วัน) น้ำก็จะถูกเททิ้งและเปลี่ยนใหม่หมด พอทำไปเรื่อยๆ วงจรการขยายพันธุ์ก็จะถูกตัดขาดครับ

ภาพรวมของวงจรไฟฟ้า (Circuit Overview)

ระบบนี้ใช้ไฟ 2 ระดับแรงดัน แต่รับไฟมาจากแหล่งจ่าย 12V เพียงตัวเดียวครับ:

  • สายไฟ 12V: จะถูกส่งตรงไปจ่ายให้โซลินอยด์วาล์ว ผ่านการควบคุมของรีเลย์ตัวที่ 2
  • สายไฟ 5V (ผ่านบอร์ด LM2596 Buck Converter): จะถูกนำไปจ่ายให้ขา 5V ของ Arduino Nano, จ่ายไฟเลี้ยงให้บอร์ดรีเลย์, และจ่ายไฟให้ปั๊มน้ำจุ่มผ่านรีเลย์ตัวที่ 1
  • สายสัญญาณ: สวิตช์ลูกลอยต่อเข้าขา Digital ของ Arduino (เปิดใช้ internal pull-up ในโค้ด) ส่วนขา Digital อื่นๆ ต่อเข้าช่อง IN1 และ IN2 ของบอร์ดรีเลย์เพื่อสั่งงาน

🚨 คำเตือนสำคัญมาก: คุณต้องใช้ไขควงหมุนปรับบอร์ด Buck Converter ให้จ่ายไฟออก "5V เป๊ะๆ" ก่อนที่จะเอาสายไฟไปต่อเข้าบอร์ด Arduino นะครับ ถ้าเผลอปล่อยไฟ 12V เข้าไป บอร์ดพังแน่นอน (ผมเจอมาแล้ว เจ็บปวดมาก)

วิธีประกอบเครื่องแบบ Step-by-Step

  1. เตรียมแหล่งจ่ายไฟ: นำพาวเวอร์ซัพพลาย 12V ต่อเข้ากับหัวแจ็ค DC แยกสายบวก-ลบออกเป็นสองทาง ทางแรกต่อเข้าจุด COM ของรีเลย์ตัวที่ 2 ส่วนอีกทางต่อเข้าอินพุตของ LM2596 Buck Converter
  2. ตั้งค่า Buck Converter: ก่อนต่อวงจรอื่นๆ ให้จ่ายไฟ 12V เข้าบอร์ด Buck Converter แล้วใช้มัลติมิเตอร์จิ้มวัดไฟขาออก หมุนไขควงปรับจนได้ 5.0V พอดี ไฟส่วนนี้จะใช้เลี้ยงระบบเกือบทั้งหมดครับ
  3. ต่อไฟเข้า Arduino Nano: นำสายไฟ 5V จาก Buck Converter ไปต่อเข้าขา 5V ของบอร์ด Nano (ห้ามต่อเข้าขา VIN เด็ดขาด) และต่อสาย GND เข้าด้วยกัน
  4. ต่อโมดูลรีเลย์: นำไฟ 5V และ GND จาก Buck Converter ไปต่อช่อง VCC และ GND ของบอร์ดรีเลย์ / ต่อขา Digital ของ Arduino ไปที่ช่อง IN1 (คุมปั๊ม) และ IN2 (คุมวาล์ว) / ต่อขา COM ของรีเลย์ 1 เข้ากับ 5V และขา NO ไปที่สายบวกของปั๊มน้ำ / ส่วนรีเลย์ 2 นำขา COM ต่อกับ 12V และขา NO ต่อเข้าสายบวกของวาล์วน้ำ
  5. ต่อสวิตช์ลูกลอย: สายเส้นหนึ่งต่อเข้าขา Digital ของ Arduino ส่วนอีกเส้นต่อลง GND เมื่อระดับน้ำสูง สวิตช์จะดันขึ้นและปิดวงจร (วงจรเชื่อมต่อกัน)
  6. ต่อปั๊มและวาล์วน้ำ: นำสายลบของปั๊มต่อลง GND (ฝั่ง 5V) และสายลบของวาล์วต่อลง GND (ฝั่ง 12V) นำปั๊มไปวางที่ก้นอ่าง และนำวาล์วไปต่อกับท่อน้ำประปาครับ
  7. อัปโหลดโค้ดและทดสอบ: อัปโหลดโค้ด เปิดหน้าต่าง Serial Monitor และลองจำลองการทำงานดูว่าปั๊มดูดน้ำออกจนหมด และวาล์วเติมน้ำจนได้ระดับที่ถูกต้องหรือไม่

การจัดวางอ่างน้ำและคำแนะนำ (Tips and Lessons Learned)

  • หาภาชนะอะไรก็ได้มาทำเป็นอ่าง เช่น ถังน้ำ หรือจานรองกระถางต้นไม้ นำไปวางในจุดที่เป็นร่มเงา (เพราะยุงชอบที่ร่ม) ใช้น้ำรีไซเคิลจากการล้างจานชามในบ้านก็ได้ ยุงไม่ได้เรื่องมากครับ
  • กันน้ำให้อุปกรณ์อิเล็กทรอนิกส์: ควรจับบอร์ด Arduino และรีเลย์ใส่กล่องกันน้ำให้มิดชิด มีแค่ปั๊มกับลูกลอยเท่านั้นที่สามารถแช่น้ำได้ นอกนั้นต้องแห้งสนิทครับ
  • ยึดสวิตช์ลูกลอยให้แน่น: ถ้าลูกลอยหลุดหรือขยับตำแหน่ง มันจะอ่านระดับน้ำเพี้ยน ทำให้ระบบทำงานผิดพลาดได้
  • ทดสอบเวลาก่อนใช้จริง: ตอนแรกควรแก้โค้ดให้ระบบทำงานทุกๆ 2-3 ชั่วโมงดูก่อน เพื่อเทสว่าระบบสูบและเติมน้ำทำงานได้ชัวร์ แล้วค่อยปรับไปใช้เวลา 4 วันครับ
  • อย่าให้ระบบขาดน้ำ: ถ้าน้ำประปาไม่ไหลหรือวาล์วเสีย อ่างจะแห้ง และยุงก็จะหนีไปวางไข่ที่อื่นแทน ระบบนี้จะเวิร์คก็ต่อเมื่อมีน้ำดึงดูดใจยุงอยู่ตลอดเวลานะครับ

ผลลัพธ์ที่ได้ (Results)

หลังจากเปิดระบบทิ้งไว้ประมาณ 3 สัปดาห์ สถานการณ์ยุงในสวนหลังบ้านจากที่เคยโดนกัดจนทนไม่ไหว กลายเป็นแทบไม่มียุงมารบกวนเลยครับ สามารถออกมานั่งเล่นชิลๆ ตอนเย็นได้สบายมาก ระบบทำงานอัตโนมัติโดยที่ผมแค่เดินไปเช็คความเรียบร้อยสัปดาห์ละครั้งเท่านั้น งบประมาณอุปกรณ์ทั้งหมดอยู่ที่ราวๆ $35-40 (ประมาณ 1,000 กว่าบาท) ถือว่าคุ้มสุดๆ ครับ

ในการทำโปรเจกต์นี้ ผมใช้เครื่องมือจากเว็บ Make-it ช่วยวางแผนลิสต์อุปกรณ์ การต่อวงจร และร่างโค้ดเบื้องต้นให้ ก่อนจะนำมาปรับแต่งให้เข้ากับระบบของผมเองครับ

แผนผังวงจรและโค้ดโปรแกรม (Schematics & Code)

สำหรับใครที่อยากลองทำตาม สามารถดูรูปแผนผังการต่อสายไฟ (Wire Diagram) และคัดลอกโค้ดไปใช้งานได้เลยครับ

View more (ดูแผนผังวงจร และกดคัดลอกโค้ด / Copy Code)

แผนผังการต่อวงจร (Wire Diagram):

Mosquito Trap Wire Diagram

Source Code สำหรับ Arduino:

// Mosquito Trap Automation by Make-It // This code uses a DS3231 Real-Time Clock (RTC) to trigger a water change every 4 days. #include <Wire.h> #include "RTClib.h" // Create an RTC object RTC_DS3231 rtc; // --- Pin Definitions --- #define EMPTY_PUMP_PIN 7 // Digital pin connected to IN1 on the relay module #define REFILL_PUMP_PIN 8 // Digital pin connected to IN2 on the relay module // --- Configuration --- const long CYCLE_INTERVAL_SECONDS = 345600; // 4 days (4 * 24 * 60 * 60 seconds) const int EMPTY_PUMP_DURATION_MS = 60000; // Run empty pump for 60 seconds const int REFILL_PUMP_DURATION_MS = 60000; // Run refill pump for 60 seconds // We need to store the time of the last cycle. We'll use a variable for this. // For a real-world device, this should be stored in EEPROM to survive power loss. long lastCycleTime = 0; void setup() { Serial.begin(9600); Wire.begin(); pinMode(EMPTY_PUMP_PIN, OUTPUT); pinMode(REFILL_PUMP_PIN, OUTPUT); // Make sure pumps are off at startup digitalWrite(EMPTY_PUMP_PIN, HIGH); // Relays are often LOW-triggered, so HIGH is OFF digitalWrite(REFILL_PUMP_PIN, HIGH); if (!rtc.begin()) { Serial.println("Couldn't find RTC"); Serial.flush(); abort(); } // UNCOMMENT THE FOLLOWING LINE THE *FIRST* TIME YOU UPLOAD // This sets the RTC to the date and time this sketch was compiled. // After setting the time, comment it out and re-upload to prevent resetting the time on every reboot. // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); Serial.println("Mosquito Trap Initialized."); // Get the current time to start our cycle timer DateTime now = rtc.now(); lastCycleTime = now.unixtime(); Serial.print("Current Unix time: "); Serial.println(lastCycleTime); } void loop() { // Get the current time from the RTC DateTime now = rtc.now(); long currentTime = now.unixtime(); Serial.print("Current Time: "); Serial.print(now.timestamp(DateTime::TIMESTAMP_FULL)); Serial.print(", Seconds since last cycle: "); Serial.println(currentTime - lastCycleTime); // Check if 4 days (CYCLE_INTERVAL_SECONDS) have passed since the last cycle if (currentTime - lastCycleTime >= CYCLE_INTERVAL_SECONDS) { Serial.println("--- Cycle time reached! Starting water change. ---"); runWaterChangeCycle(); // Update the last cycle time to the current time lastCycleTime = currentTime; Serial.println("--- Water change complete. Timer reset. ---"); } else { Serial.println("Not time yet. Waiting..."); } // Wait for a while before checking again to conserve power. // For ultra-low power, you would use deep sleep modes here. delay(3600000); // Check once per hour (3600 * 1000 ms) } void runWaterChangeCycle() { // Step 1: Turn on the emptying pump Serial.println("Starting empty pump..."); digitalWrite(EMPTY_PUMP_PIN, LOW); // LOW turns the relay ON delay(EMPTY_PUMP_DURATION_MS); // Step 2: Turn off the emptying pump digitalWrite(EMPTY_PUMP_PIN, HIGH); // HIGH turns the relay OFF Serial.println("Empty pump finished."); delay(5000); // Wait 5 seconds before refilling // Step 3: Turn on the refilling pump Serial.println("Starting refill pump..."); digitalWrite(REFILL_PUMP_PIN, LOW); // LOW turns the relay ON delay(REFILL_PUMP_DURATION_MS); // Step 4: Turn off the refilling pump digitalWrite(REFILL_PUMP_PIN, HIGH); // HIGH turns the relay OFF Serial.println("Refill pump finished."); }

อัปเดตไอเดียโปรเจกต์ Smart Home & IoT

อยากทำโปรเจกต์แก้ปัญหาในบ้านแบบนี้บ้าง หรือกำลังมองหาบอร์ดและเซ็นเซอร์อยู่? แวะมาพูดคุยและหาของเล่นสาย Tech กับเราได้เลยครับ!

คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา โปรดอ้างอิงข้อมูลการเดินสายไฟจาก Schematic ของต้นฉบับ
อ้างอิงจาก (References):

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี