ระบบเปลี่ยนน้ำในตู้ปลาอัตโนมัติ(Automated Fish Tank Water Replacement System)

ผู้เขียนบทความ : 049 นายอภิเดช ฟุ้งเฟื่อง COE #15

คณะวิศวกรรมศาตร์ : สาขาวิศวกรรมคอมพิวเตอร์

วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ขั้นสูง 1/2566

1.ความเป็นมา

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

2.วัตถุประสงค์

2.1 เพื่อพัฒนา ระบบเปลี่ยนน้ำในตู้ปลาอัตโนมัติ
2.2 เพื่อเรียนรู้บอร์ด Esp32 และเซนเซอร์ต่างๆ

3.ขอบเขต

3.1 วัดคุณภาพของน้ำในตู้ปลา
3.2 วัดปริมาณน้ำเพื่อป้องน้ำล้นออกตู้ปลา

4.ประโยชน์ที่คาดว่าจะได้รับ

4.1 ความสะดวกสบายในการดูแล
4.2 คุณภาพน้ำที่ดีขึ้น
4.3 การเติบโตและสุขภาพที่ดีของปลา
4.4 ประหยัดเวลาและแรงงาน
4.5 ลดความเสี่ยงของการลืมหรือทำผิดพลาด

5.ความรู้ที่เกี่ยวข้อง

5.1 ESP32 30 Pin เป็นโมดูลคอมพิวเตอร์เล็กขนาดเล็กที่ออกแบบมาเพื่อใช้ในการพัฒนาและสร้างโครงการที่เกี่ยวข้องกับอินเทอร์เน็ตของสร้างขึ้นโดยมีความหลากหลายในการใช้งาน โมดูล ESP32 พัฒนาโดย Espressif Systems ซึ่งเป็นบริษัทที่มีความเชี่ยวชาญในด้านเทคโนโลยีอินเทอร์เน็ตของสร้าง (IoT) และมีความนิยมในงานสร้างโปรเจ็กต์ที่ต้องการการเชื่อมต่อแบบไร้สาย ด้วยข้อดีในด้านประสิทธิภาพและความครอบคลุมในการรองรับการสื่อสารแบบไร้สายเช่น Wi-Fi และ Bluetooth Low Energy (BLE) รวมถึงความสามารถในการทำงานในโหมด低พลังงาน (low power mode) เหมาะสำหรับการใช้ในอุปกรณ์ที่ใช้แบตเตอรี่

ESP32

5.2 US-100 Ultrasonic Sensor Module โมดูลวัดระยะทาง US-100 โมดูลวัดระยะด้วยอัลตร้าโซนิคแบบมีเซ็นเซอร์วัดอุณหภูมิในตัว สามารถวัดระยะทางได้ตั้งแต่ 2cm – 450cm ใช้ไฟได้ตั้งแต่ 2.4V-5V โดยโมดูล Ultrasonic US-100 นี้มีความแม่นยำที่สูง เพราะมีเซนเซอร์วัดอุณหภูมิในตัวเพื่อใช้ค่าอุณหภูมิมาร่วมคำนวณหาระยะทางด้วย Output ของโมดูลสามารถให้ Output ได้ทั้งแบบ Serial และแบบ Digital

หลักการทำงาน คือ
1.การส่งคำสั่ง: ระบบที่ใช้เซนเซอร์มักจะส่งคำสั่งผ่านช่องสื่อสาร UART เพื่อเรียกใช้การวัดระยะทาง. คำสั่งนี้อาจีรวมถึงการเริ่มกระบวนการวัดระยะทางหรือคำสั่งอื่น ๆ ที่เซนเซอร์สนับสนุน.
2.การส่งสัญญาณ Ultrasonic: เซนเซอร์ส่งสัญญาณ ultrasonic ไปยังวัตถุที่ต้องการวัดระยะทาง. สัญญาณ ultrasonic นี้มักเป็นชนิดของคลื่นเสียงที่มีความถี่สูงเกินไปสำหรับการรับรู้ของมนุษย์.
3.การรับสัญญาณ Ultrasonic: เมื่อสัญญาณ ultrasonic ชนกับวัตถุและส่งกลับมา, เซนเซอร์รับสัญญาณที่ส่งกลับมานี้.
4.การส่งข้อมูลผ่าน UART: เมื่อเซนเซอร์ได้รับสัญญาณ ultrasonic แล้ว, มันนำข้อมูลที่ได้ไปส่งผ่านช่องสื่อสาร UART กลับไปยังระบบหรือไมโครคอนโทรลเลอร์ที่ควบคุมเซนเซอร์.
5.การประมวลผลข้อมูล: ระบบหรือไมโครคอนโทรลเลอร์รับข้อมูลที่ถูกส่งมาผ่าน UART และนำไปประมวลผลเพื่อคำนวณระยะทางที่วัดได้.
6.การส่งผลลัพธ์: หลังจากที่ได้รับข้อมูลและประมวลผลเสร็จสิ้น, ระบบหรือไมโครคอนโทรลเลอร์อาจส่งผลลัพธ์ผ่านช่องสื่อสาร UART กลับไปยังระบบหรืออุปกรณ์ที่ใช้งาน.

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

ข้อมูลจำเพาะ (specifications) ของเซนเซอร์ US-100 :
1.คลื่น Ultrasonic: US-100 ใช้คลื่น ultrasonic ที่ความถี่ประมาณ 40 kHz เป็นส่วนมาก ส่วนความถี่ขึ้นอยู่กับรุ่นและการใช้งานที่แตกต่างกัน.
2.ระยะทางการวัด: ระยะทางที่ US-100 สามารถวัดได้อยู่ในช่วงที่กว้าง ตั้งแต่ประมาณ 2 ซน. ถึง 4 ม. (ขึ้นอยู่กับแต่ละรุ่น).
3.การสื่อสาร: US-100 สามารถสื่อสารผ่าน UART (Universal Asynchronous Receiver-Transmitter) ที่ให้ความเร็วในการสื่อสารตั้งแต่ 9600 bps ถึง 115200 bps ซึ่งเป็นที่นิยมในการเชื่อมต่อกับไมโครคอนโทรลเลอร์หรือบอร์ดอิเล็กทรอนิกส์อื่น ๆ.
4.มุมการวัด: US-100 มักมีมุมการวัดประมาณ 15 องศา ซึ่งหมายถึงว่ามันสามารถวัดระยะทางจากระดับนอกสู่ระดับในมุมที่กว้าง.
5.ความแม่นยำ: ความแม่นยำขึ้นอยู่กับการใช้งานและเงื่อนไขในสภาพแวดล้อม โดยทั่วไปแล้วมีความแม่นยำที่ประมาณเป็นเซนติเมตร.
6.แหล่งจ่ายไฟ: US-100 มักใช้แหล่งจ่ายไฟ DC 5V และมีการใช้กระแสไฟต่ำ.
7.ขนาดและน้ำหนัก: ขนาดและน้ำหนักขึ้นอยู่กับรุ่นที่ใช้งาน โดยทั่วไปมีขนาดที่เล็กและเบา สามารถใช้งานได้ง่าย.

US-100 Ultrasonic Sensor

โค้ดสำหรับการใช้งาน US-100 Ultrasonic Sensor พร้อมทั้งการส่งค่าผ่าน Blynk โดยผ่านขา Virtual Pin V0

#include <SoftwareSerial.h>

class US100UltrasonicSensor {
private:
  SoftwareSerial serial;
  int MSByteDist;
  int LSByteDist;
  int mmDist;
  int cmDist;

public:
  US100Sensor(int rxPin, int txPin) : serial(rxPin, txPin) {}

  void begin() {
    serial.begin(9600);
  }

  void measureDistance() {
    serial.flush();
    serial.write(0x55);
    delay(500);

    if (serial.available() >= 2) {
      MSByteDist = serial.read();
      LSByteDist = serial.read();
      mmDist = MSByteDist * 256 + LSByteDist;
      cmDist = mmDist / 2;

      if ((cmDist > 1) && (cmDist < 10000)) {
        Serial.print("Distance: ");
        Serial.print(cmDist, DEC);
        Serial.println(" cm");
      }
    }
  }

  void updateBlynk() {
    Blynk.virtualWrite(V0, cmDist);
  }

  void measureTemperature() {
    serial.flush();
    serial.write(0x50);
    delay(500);

    if (serial.available() >= 1) {
      int temp = serial.read();
      if ((temp > 1) && (temp < 130)) {
        temp -= 45;
        Serial.print("Temperature: ");
        Serial.print(temp, DEC);
        Serial.println(" C.");
      }
    }
  }
};

5.3 Turbidity sensor เป็นเซ็นเซอร์ที่ใช้เพื่อวัดระดับความขุ่นของของเหลว หรือน้ำ. ความขุ่นของน้ำหมายถึงการมีสิ่งสกปรก, ภาวะน้ำที่มีตะกอน, ภาวะที่มีแก๊สหรือสารละลายอื่น ๆ ที่ทำให้มีการเปลี่ยนแปลงในการสะท้อนแสงหรือการส่องทางตรงข้ามของน้ำ.

หลักการทำงาน คือ
ใช้หลักการการส่องทางตรงข้าม (Direct-incident) โดยเมื่อมีการส่องทางแสงผ่านน้ำ, แสงจะถูกสะท้อนหรือทำให้มีการเปลี่ยนทิศทาง. เซ็นเซอร์Turbidity จะวัดระดับของแสงที่ถูกสะท้อนหรือทำให้มีการเปลี่ยนแปลง, ซึ่งเกิดจากการสะท้อนของสิ่งขุ่นในน้ำ. จำนวนแสงที่ถูกสะท้อนเทียบกับแสงที่ส่งเข้าไปเป็นตัวชี้ของความขุ่นของน้ำ.

ข้อมูลจำเพาะ (specifications) ของเซนเซอร์ Turbidity :
1.ช่วงการวัด (Measurement Range): ระยะทางที่เซ็นเซอร์สามารถวัดได้, 通常อยู่ในช่วงของหน่วย NTU (Nephelometric Turbidity Units) หรือ FTU (Formazin Turbidity Units). ตัวอย่างเช่น, 0-1000 NTU.
2.ความละเอียด (Resolution): ความละเอียดของเซ็นเซอร์ในการวัด, บ่งบอกถึงความสามารถในการแยกแยะระดับความขุ่นที่ต่างกัน. ตัวอย่างเช่น, 0.1 NTU.
3.ความแม่นยำ (Accuracy): ระดับความแม่นยำของเซ็นเซอร์ในการวัด, บ่งบอกถึงความใกล้เคียงของค่าที่วัดกับค่าที่เป็นความจริง. ตัวอย่างเช่น, ±2% FS (Full Scale).
4.อุณหภูมิการทำงาน (Operating Temperature): ช่วงอุณหภูมิที่เซ็นเซอร์สามารถทำงานได้. ตัวอย่างเช่น, 0-50°C.
5.การเชื่อมต่อ (Interface): ประเภทของการเชื่อมต่อที่ใช้ในการติดต่อกับระบบคอมพิวเตอร์หรืออุปกรณ์อื่น ๆ, เช่น อนาล็อก (Analog), ดิจิตอล (Digital), หรือการสื่อสารผ่านสายหรือไร้สาย.
6.การติดตั้ง (Mounting): วิธีการติดตั้งเซ็นเซอร์, อาจมีตัวต่อหรือหัวเซ็นเซอร์ที่สามารถนำไปติดตั้งในท่อน้ำหรือบ่อน้ำ.
7.การทำความสะอาด (Cleaning System): ระบบที่ใช้ในการทำความสะอาดเซ็นเซอร์จากสิ่งขุ่นหรือสารตกค้าง, เพื่อให้เซ็นเซอร์มีประสิทธิภาพสูง.
8.การตรวจสอบและบำรุงรักษา (Calibration and Maintenance): วิธีการตรวจสอบและบำรุงรักษาเซ็นเซอร์ เพื่อให้ค่าที่วัดมีความถูกต้อง.
9.การตรวจสอบข้อมูลจำเพาะเหล่านี้เป็นสิ่งสำคัญเพื่อให้แน่ใจว่าเซ็นเซอร์ทับิดิตี้ทำงานได้อย่างถูกต้องในสภาพแวดล้อมที่กำหนดและตรงตามความต้องการของการใช้งาน.

Turbidity Sensor

โค้ดสำหรับการใช้งาน Turbidity Sensor พร้อมทั้งการส่งค่าผ่าน Blynk โดยผ่านขา Virtual Pin V1

class TurbiditySensor {
private:
  int pin;

public:
  TurbiditySensor(int turbidityPin) : pin(turbidityPin) {}

  int readValue() {
    return analogRead(pin);
  }

  void updateBlynk() {
    Blynk.virtualWrite(V1, readValue());
  }
};

5.4 Water Pump โดยทั่วไปจะใช้ในการส่งน้ำหรือขับเคลื่อนน้ำไปยังที่ต่างๆหรือ ใช้สำหรับส่งน้ำในระบบท่อขึ้นไปสู่สถานที่ที่ตั้งสูงกว่าระดับน้ำในที่ตั้งของปั้มน้ำนั้น ๆ ซึ่งช่วยในการดูดน้ำจากที่ต่ำขึ้นไปที่สูง หรือในการส่งน้ำไปยังที่ที่ตั้งที่สูงขึ้น ทำให้น้ำสามารถไหลไปยังที่ที่ต้องการได้ โดยมักใช้ในการเพิ่มแรงดันของน้ำในระบบท่อน้ำหรือการดูดน้ำจากบ่อน้ำหรือแหล่งน้ำอื่น ๆ ที่ต่ำกว่าระดับน้ำในที่ตั้งของปั้มน้ำนั้น ๆ เพื่อให้น้ำไหลไปยังที่ตั้งที่สูงขึ้นได้.

หลักการทำงาน คือ
สร้างแรงดันในน้ำเพื่อส่งน้ำจากจุดหนึ่งไปยังจุดอื่น ๆ โดยใช้พลังงานที่ให้โดยแหล่งพลังงานขับเคลื่อน ซึ่งอาจมาจากไฟฟ้าหรือพลังงานอื่น ๆ ตามรุ่นและการใช้งาน

ข้อมูลจำเพาะ (specifications) ของเซนเซอร์ Water Pump:
1.แรงดันใช้งาน: DC 12 V
2.กระแสไฟไม่โหลด: 0.23 A
3.น้ำหนักบรรทุก: 450 ฮ่าวอัน
4.อัตราการไหลสูงสุด: 2-3 ลิตร/นาที
5.ระยะดูดสูงสุด : 2 เมตร
6.เส้นผ่านศูนย์กลางขาเข้าและทางออก: เส้นผ่านศูนย์กลางภายนอก 8 มม
7.ความยาวมอเตอร์: 32 มม
8.เส้นผ่านศูนย์กลางมอเตอร์: 28x36x69MM
9.เส้นผ่านศูนย์กลางปั๊ม: 40 มม.x 35 มม

Water Pump

5.5 LM2596 DC-DC Buck Converter Step Down Module คืออุปกรณ์ที่ใช้ในการลดแรงดันไฟฟ้า หรือ Step Down Voltage Regulator การลดแรงดันนั้นเป็นกระบวนการที่ใช้ตัวตัดจ่าย (switching) และการควบคุมรอบเพื่อลดแรงดันเข้ามาที่ระดับที่ต้องการ.

หลักการทำงาน คือ
1.Input Voltage (Vin): รับแรงดันจากแหล่งจ่ายไฟฟ้า.
2.Switching Element (Transistor): ในกระบวนการลดแรงดันนี้, มีตัวสวิตช์หรือ Transistor ที่ทำหน้าที่เปิดและปิดตัวเองเพื่อสร้างกระบวนการตัดจ่าย (switching process).
3.Inductor (L): มีอินดัคเตอร์ที่เป็นส่วนหนึ่งของกระบวนการ. การปิดตัวสวิตช์ทำให้กระแสไหลผ่านอินดัคเตอร์ และเกิดการเก็บพลังงานในรูปแบบของกระแสแม่เหล็ก.
4.Diode (D): มีไดโอดที่ทำหน้าที่ในการทำให้กระแสไปกลับได้ (freewheeling) หลังจากที่ตัวสวิตช์ปิด.
5.Output Capacitor (Cout): มีคอนเดนเซอร์ที่ใช้ในการเก็บพลังงานและควบคุมแรงดัน DC ที่ได้.
6.Feedback Circuit: ประกอบด้วยตัวต้านทานและไอซีที่ใช้ในการวัดแรงดัน DC ที่ Output และควบคุมการทำงานของตัวสวิตช์เพื่อให้ได้แรงดัน DC ที่ต้องการ.
7.7Segment Display: แสดงผลข้อมูลหรือค่าต่าง ๆ ที่เกี่ยวข้องกับการทำงานของ LM2596.

ข้อมูลจำเพาะ (specifications) ของ LM2596 DC-DC Buck Converter Step Down Module :
1.แรงดันขาเข้า :3-34 V
2.แรงดันขาออก :1.5-32 V( ปรับตั้งได้)
3.กระแสไฟฟ้า(Current) : กระแสใช้งานที่ 1-2 A

LM2596 DC-DC Buck Converter 12V to 5V

5.6 Relay 5V Ative Low คืออุปกรณ์ทางไฟฟ้าที่ใช้เป็นสวิตช์ที่ถูกควบคุมด้วยสัญญาณไฟฟ้าขนาด 5 โวลต์ (5V) เพื่อทำให้กระแสไฟฟ้าได้มีการไหลผ่านหรือไม่ไหลผ่านไปยังอุปกรณ์หรือระบบอื่นๆ ภายใต้การควบคุมของสัญญาณไฟฟ้าลบ.

Relay มีหลายประการใช้งานแตกต่างกันตามวัตถุประสงค์และการออกแบบ ซึ่งสามารถแบ่งออกเป็นส่วนสำคัญดังนี้:
1.Coil (คอยล์): เป็นส่วนที่ได้รับสัญญาณไฟฟ้าเพื่อควบคุมการทำงานของ Relay. การกระทำของ Coil ทำให้มีการสร้างสนามแม่เหล็กภายใน Relay ซึ่งเปลี่ยนแปลงทิศทางของตัวสวิตช์ภายใน.
2.Contacts (ติดต่อ): เป็นส่วนที่เป็นสวิตช์และทำหน้าที่เปิดหรือปิดการไหลของกระแสไฟฟ้าในวงจร. มีหลายประเภทขึ้นอยู่กับการทำงาน เช่น Normally Open (NO), Normally Closed (NC), และ Common (COM).

การทำงาน คือ
การเปิด-ปิดทำให้กระแสไฟฟ้าได้มีการไหลผ่านหรือไม่ไหลผ่านไปยังอุปกรณ์หรือระบบอื่นๆ ภายใต้การควบคุมของสัญญาณไฟฟ้า. Relay ทำหน้าที่เป็นตัวกลางในการควบคุมอุปกรณ์ที่มีกำลังไฟฟ้ามากๆ โดยที่ไม่ต้องให้สัมผัสตรงๆกับอุปกรณ์ที่ต้องการควบคุม.

ข้อมูลจำเพาะ (specifications) ของ Relay 5v Ative Low:
1.สามารถควบคุมอุปกรณ์ที่ใช้ไฟได้ทั้ง AC และ DC ไม่เกิน DC30V / AC250V 10A
2.ทำงานเมื่อได้รับไฟทริก(สัญญาณเข้ามา)ที่ขา In ช่วง 3 – 5 V

Relay 5V 2ch Ative Low

5.7 Blynk App คือ แอปพลิเคชันสำเร็จรูปที่ใช้สำหรับงานที่เกี่ยวกับอินเทอร์เน็ตของสรรพสิ่ง (Internet of Things, IoT) ที่ทำให้เราสามารถเชื่อมต่ออุปกรณ์ต่าง ๆ เข้ากับอินเทอร์เน็ตในลักษณะการเชื่อมต่อเครื่องแม่ข่าย (Server) ไปยังอุปกรณ์ลูกข่าย (Client) เช่น Arduino, ESP-8266, ESP-32, NodeMCU แอปพลิเคชัน Blynk สามารถใช้งานได้ฟรีและใช้งานได้ทั้งบนระบบปฏิบัติการ IOS และ Android โดยการใช้งานให้อุปกรณ์ส่งขาผ่าน Blynk นั้น สามารถเชื่อมต่อได้โดยใช้ขา Virtual Pin

UI Blynk App For Mobile

โดยจะต้องประกาศ BLYNK_TEMPLATE_ID, BLYNK_TEMPLATE_NAME, BLYNK_AUTH_TOKEN เสร็จแล้วต้องลงไลบารี่ Wifi โดยสามารถโหลดได้ทั่วไป จากนั้น ประกาศชื่อ ID, Password ของ Wifi ที่จะใช้งาน

#define BLYNK_PRINT Serial

#define BLYNK_TEMPLATE_ID "TMPL6yjwCl1GP"                             // TEMPLATE_ID จาก Blynk
#define BLYNK_TEMPLATE_NAME "MyProject Microcontroller"               // TEMPLATE_NAME จาก Blynk
#define BLYNK_AUTH_TOKEN "FHslTuZqGRz6-h-iKv9KmRKICSzYMJ9z"           // TOKEN จาก Blynk

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

char auth[] = "FHslTuZqGRz6-h-iKv9KmRKICSzYMJ9z";                     // TOKEN จาก Blynk
char ssid[] = "FordApidetAP";                                         // ชื่อ Wifi
char pass[] = "FordApidetAP";                                         // รหัส Wifi

ต่อไปคือขั้นตอนการเชื่อมต่อ Wifi และการเชื่อมต่อกับ Sever Blynk

    Serial.println("กำลังเชื่อมต่อ Wi-Fi...");
    WiFi.begin(ssid, pass);

    unsigned long wifiConnectStartTime = millis();
    bool isWifiConnected = false;

    while (!isWifiConnected && (millis() - wifiConnectStartTime <= 10000)) {
      if (WiFi.status() == WL_CONNECTED) {
        isWifiConnected = true;
        Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
      }
    }

ใน Blynk, มี Widget ที่ได้ถูกกำหนดหมายเลข V0, V1 โดยจะแสดงข้อมูลปริมาณน้ำ และแสดงค่าความขุ่นของน้ำตามลำดับ

  void updateBlynk() {
    Blynk.virtualWrite(V0, cmDist);
  }
void updateBlynk() {
    Blynk.virtualWrite(V1, readValue());
  }

วิจัยที่เกี่ยวข้อง

          Nivedita Pande, Aakib Sayyad (Electronics and Telecommunication Engineering, Yeshwantrao Chavan College of Engineering, Nagpur, Maharashtra)  การใช้ปุ๋ยและสารเคมีที่เพิ่มขึ้นอย่างต่อเนื่องส่งผลกระทบต่อคุณภาพน้ำทั่วโลก ซึ่งน้ำเป็นสิ่งจำเป็นอย่างยิ่งต่อการดำรงอยู่ของมนุษย์และสัตว์น้ำ ดังนั้นควรมีกลไกในการทดสอบความเหนือกว่าของน้ำที่หาได้จากแหล่งน้ำ เพื่อให้เข้าถึงน้ำที่มีคุณภาพดีซึ่งเป็นสิ่งสำคัญในการหลีกเลี่ยงโรคที่มากับน้ำที่ส่งผลต่อสิ่งมีชีวิต การตรวจสอบคุณภาพน้ำและ IOTสามารถปรับปรุงการวัดที่มีอยู่ได้      
          Padma Theagarajan, Barath Padmanaban, Kishore Palanisamy, Pavithra Raja,Praveenkumar Poomagan (Department of Computer Applications, Sona College of Technology, Salem, India)      เนื่องจากปลาอาศัยอยู่ในสภาพแวดล้อมที่หลากหลายโดยชิ้นเชิงเมื่อเทียบกับมนุษย์ทั้งเรื่อง อาหาร น้ำ ที่อยู่ที่เหมาะสม ซึ่งตู้ปลาค่อนข้างแตกต่างจากที่อยู่ตามธรรมชาติเนื่องจากเป็นระบบปิดที่มีความจุของน้ำจำกัด จึงต้องทำความสะอาดของเสียเป็นประจำเพื่อให้ผู้เลี้ยงดูแลรักษาตู้ปลาได้ง่ายจึงเสนอระบบ IOT เพื่อความสะดวกสบายและปลอดภัย

Diagram ของระบบ เป็นภาพรวมการทำงานของระบบ เพื่อทำให้เข้าใจการทำงานของระบบมากขึ้น

6.ผลการดำเนินงาน

ในส่วนนี้จะกล่าวถึงการวัดทดลอง คือ 1.การวัดระดับน้ำในตู้ปลา 2.การวัดคุณภาพน้ำ 3.การทำงานร่วมกัน 4.ภาพรวมการทำงาน โดยจะแบ่งเป็น 4 ส่วนคือ

6.1 การวัดระดับน้ำในตู้ปลา ทดลองการวัดระดับน้ำจากในตู้ปลาโดยการเขียนโปรแกรมเพื่อใช้งาน Ultrasonic Sensor

6.2 การวัดคุณภาพน้ำในตู้ปลา ทดลองวัดคุณภาพน้ำใช้งานโดยการเขียนโปรแกรมเพื่อใช้งาน Turbidity Sensor

6.3 การทำงานร่วมกันของ เซนเซอร์และอุปกรณ์ต่างๆ ของระบบเปลี่ยนน้ำในตู้ปลาอัตโนมัติ

6.4 ผลการทดลองของภาพรวมในการทำงานของระบบ

และสามารถรับชมการทำงานแบบเต็มๆได้ที่

และนี่คือโค้ดการทำงานของระบบทั้งหมด

#define BLYNK_PRINT Serial

#define BLYNK_TEMPLATE_ID "TMPL6yjwCl1GP"                             // TEMPLATE_ID จาก Blynk
#define BLYNK_TEMPLATE_NAME "MyProject Microcontroller"               // TEMPLATE_NAME จาก Blynk
#define BLYNK_AUTH_TOKEN "FHslTuZqGRz6-h-iKv9KmRKICSzYMJ9z"           // TOKEN จาก Blynk

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <SoftwareSerial.h>

char auth[] = "FHslTuZqGRz6-h-iKv9KmRKICSzYMJ9z";                     // TOKEN จาก Blynk
char ssid[] = "FordApidetAP";                                         // ชื่อ Wifi
char pass[] = "FordApidetAP";                                         // รหัส Wifi
 

class TurbiditySensor {
private:
  int pin;

public:
  TurbiditySensor(int turbidityPin) : pin(turbidityPin) {}

  int readValue() {
    return analogRead(pin);
  }

  void updateBlynk() {
    Blynk.virtualWrite(V1, readValue());
  }
};

class US100UltrasonicSensor {
private:
  SoftwareSerial serial;
  int MSByteDist;
  int LSByteDist;
  int mmDist;
  int cmDist;

public:
  US100Sensor(int rxPin, int txPin) : serial(rxPin, txPin) {}

  void begin() {
    serial.begin(9600);
  }

  void measureDistance() {
    serial.flush();
    serial.write(0x55);
    delay(500);

    if (serial.available() >= 2) {
      MSByteDist = serial.read();
      LSByteDist = serial.read();
      mmDist = MSByteDist * 256 + LSByteDist;
      cmDist = mmDist / 2;

      if ((cmDist > 1) && (cmDist < 10000)) {
        Serial.print("Distance: ");
        Serial.print(cmDist, DEC);
        Serial.println(" cm");
      }
    }
  }

  void updateBlynk() {
    Blynk.virtualWrite(V0, cmDist);
  }

  void measureTemperature() {
    serial.flush();
    serial.write(0x50);
    delay(500);

    if (serial.available() >= 1) {
      int temp = serial.read();
      if ((temp > 1) && (temp < 130)) {
        temp -= 45;
        Serial.print("Temperature: ");
        Serial.print(temp, DEC);
        Serial.println(" C.");
      }
    }
  }
};

class PumpController {
private:
  int pumpInPin;
  int pumpOutPin;

public:
  PumpController(int inPin, int outPin) : pumpInPin(inPin), pumpOutPin(outPin) {}

  void startPump(int pumpPin) {
    digitalWrite(pumpPin, LOW);
  }

  void stopPump(int pumpPin) {
    digitalWrite(pumpPin, HIGH);
  }
};

class WaterSystem {
private:
  TurbiditySensor turbiditySensor;
  US100Sensor us100;
  PumpController pumpController;

public:
  WaterSystem(int turbidityPin, int rxPin, int txPin, int pumpInPin, int pumpOutPin)
      : turbiditySensor(turbidityPin), us100(rxPin, txPin), pumpController(pumpInPin, pumpOutPin) {}

  void setup() {
    pinMode(pumpController.pumpInPin, OUTPUT);
    pinMode(pumpController.pumpOutPin, OUTPUT);
    us100.begin();
    digitalWrite(pumpController.pumpInPin, HIGH);
    digitalWrite(pumpController.pumpOutPin, HIGH);

    Serial.begin(115200);
    Serial.println("กำลังเชื่อมต่อ Wi-Fi...");
    WiFi.begin(ssid, pass);

    unsigned long wifiConnectStartTime = millis();
    bool isWifiConnected = false;

    while (!isWifiConnected && (millis() - wifiConnectStartTime <= 10000)) {
      if (WiFi.status() == WL_CONNECTED) {
        isWifiConnected = true;
        Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
      }
    }
  }

  void loop() {
    turbiditySensor.updateBlynk();
    us100.measureDistance();
    us100.measureTemperature();
    ultrasonicSensor.updateBlynk();
    working();
    Blynk.run();
  }

  void working() {
    if (us100.cmDist > 9) {
      pumpController.startPump(pumpController.pumpInPin);
      while (us100.cmDist != 8) {
        us100.measureDistance();
      }
      pumpController.stopPump(pumpController.pumpInPin);
    }

    if (turbiditySensor.readValue() < 1500) {
      pumpController.startPump(pumpController.pumpOutPin);
      while (us100.cmDist != 19) {
        us100.measureDistance();
      }
      pumpController.stopPump(pumpController.pumpOutPin);
    }
  }
};

WaterSystem waterSystem(TURBIDITY_PIN, RX_PIN, TX_PIN, PUMPIN_PIN, PUMPOUT_PIN);

void setup() {
  waterSystem.setup();
}

void loop() {
  waterSystem.loop();
}

7.สรุปผลและข้อเสนอแนะ

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

ข้อเสนอแนะ
-โปรเจคระบบเปลี่ยนน้ำในตู้ปลาอัตโนมัติ สามารถเปลี่ยนแหล่งจ่ายให้เป็นจ่ายจากธรรมชาติ เพื่อประหยัดไฟฟ้าได้อีก
-เพิ่ม ระบบกรองน้ำก่อน จะได้ประหยัดน้ำ

8.อ้างอิง

[1] suwitkiravittaya. Blynk App คืออะไร?. [ออนไลน์] 2562.
[สืบค้นวันที่ 15 ตุลาคม 2566]. จาก http://suwitkiravittaya.eng.chula.ac.th/B2i2019BookWeb/blynkapp1.html#:~:text=Blynk%20App
[2] appsofttech. เซนเซอร์วัดความขุ่นของน้ำ. [ออนไลน์]2564. [สืบค้นวันที่ 15 ตุลาคม 2566].จาก
https://www.appsofttech.com/p/181
[3] analogread. US-100 Ultrasonic Sensor Module [ออนไลน์] 2559. [สืบค้นวันที่ 15 ตุลาคม 2566]. จาก
https://www.analogread.com/article/-us-100-ultrasonic-sensor-module

 

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *