กลับไปหน้ารวมไฟล์
mega-hydroponics-controller-111654.md

นี่คือเวอร์ชันอัพเกรดจากโปรเจค Hydroponics Controller ตัวแรกของพี่ ที่ตอนนั้นใช้ Arduino Uno เป็นตัวควบคุม และถือเป็นโปรเจคแรกๆ ที่พี่ได้ลองเขียนโค้ด Arduino เลย

Hydroponics Uno controller. Hydroponics Controller รุ่นที่ใช้ Arduino Uno

รอบนี้พี่อัพเกรดโดยเปลี่ยนจาก Uno มาใช้บอร์ด R3 ATmega2560+ESP8266 แถมยังเพิ่ม DFrobot SIM7000C Arduino NB-IoT/LTE/GPRS expansion shield และเซ็นเซอร์อีกนิดหน่อยเข้าไปด้วย งานนี้จัดเต็มเลยนะตัวนี้

MEGA + WiFi based Hydroponics Controller. Hydroponics Controller รุ่นใหม่ที่ใช้ MEGA + WiFi

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

บทเรียนที่พี่ได้จากโปรเจคแรก มีดังนี้จ้า:

1. แบ็กอัพโค้ดที่ทำงานได้ไว้ก่อนเริ่มแก้เสมอ ไม่มีอะไรแย่ไปกว่าการคอมไพล์ผ่านแต่โปรแกรมทำงานแปลกๆ ทั้งที่เรามั่นใจว่าไม่ได้เปลี่ยนอะไรเลย (ส่วนใหญ่พี่ทำของตกหรืออาหารหกใส่คีย์บอร์ดนี่แหละตัวการ)

2. ถ้าใช้ MPPT solar charge controller เป็นแหล่งจ่ายไฟหลัก (VCC) ให้ใช้ step-down DC-DC converter ตั้งค่าออกที่ 9-10VDC จะช่วยถนอมชิปรีจูเลเตอร์ 5V ของบอร์ด Arduino ได้ เพราะบางวันแดดดี MPPT อาจจ่ายไฟสูงถึง 14VDC ได้ (พี่เปลี่ยนชิปรีจูเลเตอร์ไป 2-3 ตัวแล้ว)

3. อย่าแก้โค้ดหลายจุดก่อนจะทดสอบรัน มันจะหาที่ผิดโค้ดยากมากถ้าเราแก้ทีละหลายๆ จุดแล้วโปรแกรมไม่ทำงาน

4. อ่านข้อมูลของอุปกรณ์ที่ใช้ให้ดี เพราะอาจมีปัญหาเรื่องความเข้ากันได้ เช่น การใช้ Shield SIM7000C กับบอร์ด MEGA หรือปัญหาเรื่องพอร์ตอนุกรม

5. ระวังเรื่อง EMI และกระแสกระชาก (Surge) เวลาใช้โหลดแบบมีขดลวด เช่น ปั๊มน้ำและพัดลม และถ้ามีแหล่งจ่ายไฟหลายตัว ต้องมี GND ร่วม (Common GND) ด้วยนะ

ระบบควบคุมตัวนี้จะสั่งงานปั๊มและพัดลมโดยใช้หลักการ AND ทางลอจิก ดูตัวอย่างโค้ดด้านล่าง ปั๊มจะทำงานเมื่อเวลาจากนาฬิกาจริง (RTC) อยู่ในช่วง 6 ถึง 21 โมง และนาทีที่ 0 ถึง 4 นาที เช่น ถ้าเวลา 07:00:00 ปั๊มจะทำงาน 5 นาที (ตั้งแต่ 07:00:00 ถึง 07:04:59)

// hydroponic gully pump timer

   if (nH >= 6 && nH <= 21 && nM >= 0 && nM <= 4 )
 {      digitalWrite (Pump, HIGH);
 display.setColor(RGB_COLOR16(255, 255 , 255));
 display.printFixed(0, 40, "Pump1 ON " );
 delay(400);    }

เซ็นเซอร์วัดการไหล (Flow Sensor) จะคอยตรวจสอบอัตราการไหลของปั๊ม และส่งสัญญาณเตือนถ้าพบว่าการไหลช้าหรือไม่ไหลเลย เรื่องนี้สำคัญเพราะปั๊มที่กำลังจะพังอาจกินกระแสไฟมากจนแบตเตอรี่หมด และถ้าปั๊มตายสนิท พืชก็จะไม่ได้รับสารอาหารเลย

โค้ดด้านล่างจะตรวจสอบค่าแรงดันที่แปลงแล้วจาก Flow Sensor ถ้าค่าน้อยกว่า 1 โวลต์ และ ปั๊มหลักกำลังทำงาน (สถานะ HIGH) และ สวิตช์ Manual อยู่ในโหมดออฟ (สถานะ HIGH) ระบบจะส่งการแจ้งเตือนไปที่หน้าจอแสดงผลและฐานข้อมูล Firebase Realtime Database พร้อมทั้งสั่งให้ปั๊มสำรอง (AuxPump) ทำงานแทน

if ((flow1V < 1)
       && (digitalRead(Pump) == HIGH)
       && ((digitalRead(S1)) == HIGH ))
  { display.setColor(RGB_COLOR16(255, 255 , 255));
    display.printFixed(104, 40, "FAIL");
    digitalWrite (AuxPump, HIGH);
    display.printFixed(0, 10, "Alert - AUX ON    ");
    display.setColor(RGB_COLOR16(255, 0 , 0));
    display.printFixed(0, 50, "AUX P ON ");
    dM[2] = "Gully1 - ALARM NO FLOW" + dH[3];

รูปด้านล่างแสดงตอนที่ Pump1 ทำงานและมีอัตราการไหลที่ดี สังเกตข้อความแสดงแรงดันจาก MPPT จะเป็นสีแดง ซึ่งหมายถึงแรงดันต่ำลงตามที่คาดไว้เมื่อปั๊มทำงาน การใช้สีเพื่อเน้นสถานะของระบบแบบนี้มีประโยชน์มาก ช่วยให้เราตรวจสอบปัญหาได้เร็วขึ้น

Pump1 activation with good flow

วงจรแบ่งแรงดัน (Voltage Divider) ที่ประกอบด้วยตัวต้านทาน (Resistor) 3 ตัว ถูกต่อคร่อมที่อินพุตของ DC-DC down converter เพื่อลดแรงดันจาก MPPT ลงเหลือหนึ่งในสาม ก่อนจะถูกอ่านด้วยขาแอนะล็อกอินพุต จากนั้นเราจะเอาแรงดันที่อ่านได้มาคูณด้วยค่าคาลิเบรชันและคูณสาม เพื่อให้ได้ค่าแรงดัน MPPT จริงๆ

 // read load voltage * cal factor * voltage divider mult
    char LoadValue[1];
    float Volts = ((analogRead(BattV)) * .0047 * 3);
    dtostrf(Volts, 0, 1, LoadValue);

เราใช้เซ็นเซอร์อัลตราโซนิกแบบคู่ (Dual Ultrasonic Sensor) ในการวัดระดับน้ำในถังสารอาหาร เวลาที่ใช้ในการส่งและรับสัญญาณ (Ping และ Echo) จะถูกแปลงเป็นระยะทางโดยฟังก์ชันในไลบรารี่ ด้านล่างนี้โค้ดจะนำระยะทางที่วัดได้ (ยิ่งระดับน้ำต่ำ ระยะทางยิ่งมาก) ไปลบออกจากค่าคงที่ที่แทนถังเต็ม เอาให้ได้เป็นระดับน้ำ ตัวรุ่นพี่ติดพัดลมไว้บนฝาถังด้วยนะ เพื่อหมุนเวียนอากาศข้างใน ป้องกันไม่ให้เซ็นเซอร์อัลตราโซนิกเป็นสนิมจากไอน้ำที่เกาะ

 // read nutrient tank level
    char Lbuf[1]; float uS = sonar.ping();
    float Lvl = (111 - (uS / US_ROUNDTRIP_CM));
    dtostrf(Lvl, 0, 1, Lbuf);

เซ็นเซอร์ ปั๊ม และพัดลมตัวอื่นๆ ก็ทำงานในลักษณะเดียวกันกับด้านบนทั้งหมดเลย โดยจะทำงานตามลำดับอย่างเป็นขั้นเป็นตอน และควบคุมเวลาในการทำงานให้เป๊ะ เพื่อประหยัดแบตเตอรี่ให้ได้มากที่สุด นอกจากนี้ยังมีสวิตช์แบบ Toggle ให้ใช้สำหรับสั่งรีเลย์ด้วยมือผ่านดิจิตอลอินพุตได้ด้วย ถ้าจำเป็น

แต่ละขั้นตอนการทำงานจะสร้างข้อมูลสถานะ (Status Data) ส่วนหนึ่งออกมา ซึ่งจะถูกส่งไปยัง Firebase Realtime Database ผ่าน WiFi และส่งไปยังมือถือผ่านชิลด์ RFrobot SIM7000C ด้านล่างคือตัวอย่างการจัดรูปแบบข้อความข้อมูลสุดท้าย ขนาดและโครงสร้างของข้อความสำคัญมากสำหรับการส่งไปยัง Realtime Database ให้ถูกต้อง รวมถึงการเว้นดีเลย์ให้พอสำหรับการประมวลผลคำสั่ง AT ของ SIM7000C ด้วย

 // send system status message to Firebird database via WiFi
    Serial3.print((dH[1]) + (dM[0]) + (dM[1])
                  + (dM[2]) + (dM[3]) + (dM[4])
                  + (dM[5]) + (dM[6]) + (dM[7])
                  + (dM[8]) + (dM[9]) + (dH[2]));

 // send system status message to cellphone.
    Text = ((dM[0]) + (dM[1]) + (dM[7])
            + (dM[8]) + (dM[4]) + (dM[5]));

    if ((nH == 17 && nM == 0 && nM == 0 && nS == 0 )
        || (digitalRead(AlmTEST)) == LOW )

    {      mySerial.print("AT+CSCA=\"+6421600600\"\r");
 delay(20);      mySerial.print("AT+CMGF=1\r");
 delay(20);      mySerial.print("AT+CMGS=\"**********\"\r");
 delay(20);      mySerial.print(Text);
 display.setColor(RGB_COLOR16(255, 255 , 0));
 display.printFixed(0, 10, "Calling **********");
 mySerial.write(0x1A); delay(500);    }

Firebase Realtime database Firebase Realtime database

Test message from smartphone Test message from smartphone

ระบบทั้งหมดนี้อยู่ภายใต้การดูแลของ Watchdog Timer ตัวเฝ้าดูที่คาดหวังให้ลำดับการทำงานทั้งหมดเสร็จภายในสองวินาที ถ้าไม่ มันจะสั่งรีเซ็ตบอร์ด MEGA และ SIM7000C ทันที ส่วนใหญ่ปัญหาค้างมักมาจาก RTC ติดเบรก ในกรณีที่หายากมากๆ การรีเซ็ตอาจไม่ช่วย ถ้าเวลาของ RTC ผิดเพี้ยนไปแล้ว ต้องมาเซ็ตเวลาใหม่ด้วยคำสั่ง rtc.adjust เอง

// real time clock
  rtc.begin();
//rtc.adjust(DateTime(22, 12, 30, 12, 43, 00));

รายละเอียดทางเทคนิคแบบจัดเต็ม

ออโตเมชั่นระดับโรงงาน

ใช้ Arduino Mega 2560 เพราะมันมีขาเยอะจัด ตัวคอนโทรลเลอร์นี้คุมระบบเลี้ยงชีวิตพืชในโรงเรือนไฮโดรโพนิกส์ขนาดใหญ่ได้แบบไม่ง้อใคร

  • กองทัพเซนเซอร์: คอยจับตาดู ค่า EC (Electrical Conductivity) เพื่อเช็คสารอาหาร, ค่า pH เพื่อดูความเป็นกรด-ด่างของน้ำ และ อุณหภูมิน้ำ ผ่านเซนเซอร์กันน้ำ DS18B20
  • จัดการสภาพแวดล้อม: ใช้ เซนเซอร์ DHT22 วัดความชื้นและอุณหภูมิอากาศรอบข้าง เพื่อปรับพัดลมและระบบพ่นหมอกแบบเรียลไทม์

การจ่ายสารและควบคุมของเหลว

  • ควบคุมปั๊มเพอริสตัลติก: Arduino Mega ใช้ รีเลย์หรือไดรเวอร์ PWM ควบคุมปั๊มความแม่นยำสูง เพื่อฉีดสารอาหารและตัวปรับ pH เข้าไปในถังหลักอัตโนมัติ
  • จอแสดงผลหลัก: ตัวเลขสำคัญทุกอย่างโชว์บน จอ LCD ขนาด 20x4 แบบ I2C ตัวใหญ่ ให้เกษตรกรเห็นสถานะคร่าวๆ ได้ในทีเดียว สบายตา สบายใจ

ข้อมูล Frontmatter ดั้งเดิม

title: "โปรเจกต์ควบคุมไฮโดรโพนิกส์สุดตึง! (Mega Edition)"
description: "ระบบควบคุมและตรวจสอบไร้ดินแบบจัดเต็ม ใช้ Duinotech "MEGA with Wi-Fi" จับคู่กับ DFRobot "SIM7000C Arduino NB-IoT/LTE/GPRS Expansion Shield" งานนี้ทั้งเซนเซอร์ ทั้งมอเตอร์ ควบคุมผ่านอินเตอร์รัพต์ได้แบบเทพๆ งานง่ายแต่หล่อมาก วัยรุ่นสายช่างต้องลอง!"
author: "pcnz22"
category: "Home & Automation"
tags:
  - "Garden"
  - "Internet Of Things"
views: 2902
likes: 0
price: 2450
difficulty: "Easy"
components:
  - "1x 8 Channel Relay Board 12VDC XC-4418"
  - "1x Real Time Clock Module XC-4450"
  - "1x Soil Moisture Sensor XC-4604"
  - "1x 150mm Plug to Socket Jumper Leads - 40 Pieces"
  - "1x Toggle and Push Button Switches."
  - "1x Red perspex-195-x-195-x-3mm"
  - "1x MEGA + WiFi (ATmega2560 + ESP8266) XC4421"
  - "1x Temperature & Humidity Sensor Module XC-4520"
  - "1x Mounting posts, screws, nuts and washers."
  - "1x SIM7000C Arduino NB-IoT/LTE/GPRS/GPS Expansion Shield"
  - "1x Dual Ultrasonic Sensor Module XC-4442"
  - "1x DC-DC Adjustable Step-Down Module XC-4514"
  - "1x 1.5\" 128x128 RGB Colour OLED Display XC3726"
tools: []
apps:
  - "1x Arduino IDE 1.8"
downloadableFiles:
  - "https://projects.arduinocontent.cc/eb4a8383-63ff-48da-a1f3-1f4b9b9a801c.ino"
  - "https://projects.arduinocontent.cc/2ec4977e-80c4-4af0-a57a-4d02461ce3d6.ino"
documentationLinks: []
passwordHash: "46357f4f578374119a43100969a1b46cc0f0d1a110d456e3bdbb6f0d911aabd5"
encryptedPayload: "U2FsdGVkX19thtRrfqWvGkUI6t7elM1zREIZE4bN3zKOswNhVOJgB00IY2XUIA0zFexDvDcq2Wr266x/NHPhY/R+A0d1FADZ+8ywhYKZsRA="
seoDescription: "Mega Hydroponics Controller for system control and monitoring using Mega with Wi-Fi and SIM7000C NB-IoT Shield."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/mega-hydroponics-controller-111654_cover.jpg"
lang: "en"