น้ำพุเเมวผ่านระบบ IoT (cat water fountain IoT systems)

ผู้เขียนบทความ : นางสาวณัฏฐณิชา ปั้นโฉม COE#15

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

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

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

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

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

2.1.เพื่อศึกษาและพัฒนาการให้น้ำแมวที่มีประสิทธิภาพมากขึ้น

2.2.เพื่อพัฒนารูปแบบของน้ำพุแมวให้มีคุณภาพ

2.3.เพื่อสร้างความปลอดภัยของการให้น้ำแมวและปัญหาดื่มน้ำไม่เพียงพอ

3.ขอบเขต

3.1.โปรแกรมตรวจจับระยะของแมวได้

3.2.โปรแกรมสามารถส่งข้อมูลไปยังไลน์เป็นข้อความได้

3.3.โปรแกรมสั่งปั๊มน้ำให้ทำงานตามการเคลื่อนไหวของแมวและอัตโนมัติได้

3.4.โปรแกรมเเจ้งเตือนเมื่อน้ำหมดและ LED จะทำงาน

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

4.1 เข้าใจในการเขียนโปรแกรมภาษา Python สามารถนำไปประยุกต์ใช้งานได้จริง

4.2 สามารถเขียนโปรแกรมสั่งงานให้ ปั๊มน้ำทำงานผ่าน Relay

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

5.1 Ultrasonic sensor

ใช้ Ultrasonic เป็นตัวควบคุมในการเริ่มต้นการทำงาน คือการกำหนดระยะของแมว เมื่อระยะตรวจแมว ว่าเจอหรือไม่เจอ ถ้าไม่เจอปั๊มน้ำก็จะไม่มีการทำงาน ถ้าเจอแมวภายในระยะน้อยกว่าหรือเท่ากับ 30 เซนติเมตร จะส่งค่ากลับไปที่ตัวบอร์ด ESP32 บอร์ดก็จะสั่งงานต่อไปให้ ปั๊มน้ำ ทำงาน

if distance <= 30:
   machine.Pin(Relay1, machine.OUT).off()
if distance >= 31:
   machine.Pin(Relay1, machine.OUT).on()

5.2 Water Level sensor

ใช้ Water Level sensor เป็นตัวควบคุมในการวัดระดับน้ำ คือการกำหนดระดับของน้ำ ถ้าน้ำสูงกว่าระดับที่ตั้งค่าไว้  LED ก็จะไม่มีการทำงาน ถ้าน้ำต่ำระดับที่ตั้งไว้ LED จะส่งค่ากลับไปที่ตัวบอร์ด ESP32 บอร์ดก็จะสั่งงานต่อไปให้ Relay ทำงาน

if waterval < 2500:
   machine.Pin(Relay2, machine.OUT).off()
   payload = {"message": "Water Low"}
   requests.post(url, headers=headers, json=payload)
if waterval > 3500:
   machine.Pin(Relay2, machine.OUT).on()

5.3 Code ภาษา Python ที่ใช้ในการเขียน

โค้ดเริ่มต้นด้วยการ import โมดูลที่จำเป็นเพื่อใช้งานและตั้งค่าอุปกรณ์ต่าง ๆ เช่น machine และ time เพื่อใช้ในการควบคุม MCU และการทำงานที่เกี่ยวข้องกับเวลา และ urequests เพื่อทำ HTTP requests สำหรับการส่งข้อมูลไปยังบริการ LINE Notify ของ Line Messenger

import machine
import time
import urequests as requests

การกำหนดค่าคงที่ โค้ดกำหนดค่าคงที่อาทิ TRIG_PIN, ECHO_PIN, WATER_SENSOR_PIN, sw, sw1_status, Relay1, Relay2, Rref, RL10, และ GAMMA เป็นตัวแปรที่จะถูกใช้ในโปรแกรม.

TRIG_PIN = 19
ECHO_PIN = 18
WATER_SENSOR_PIN = 25

sw = 17
sw1_status = 0
Relay1 = 0
Relay2 = 4

Rref = 10000
RL10 = 50
GAMMA = 0.7

5.4 Code ที่ใช้ในการทำงาน

ฟังก์ชัน setup(): นี่คือฟังก์ชันหลักของโปรแกรมที่จะถูกเรียกเมื่อโปรแกรมเริ่มทำงาน ในฟังก์ชันนี้มีขั้นตอนการตั้งค่าและการทำงาน

ฟังก์ชันที่ใช้ในการเชื่อมต่อกับเครือข่ายไร้สาย WiFi โดยใช้ชื่อและรหัสผ่านที่ถูกกำหนด จากนั้นฟังก์ชันรอจนกว่าการเชื่อมต่อ WiFi จะเสร็จสมบูรณ์ และพิมพ์ข้อความ “WiFi connected” และที่อยู่ IP ลงบนหน้าจอ

line_token = "rm3W3HlSYKcAxnj3SvUmBUCFDKj2Qw8tvhjZc6kiCIF"
    url = "https://notify-api.line.me/api/notify"
    headers = {
        "Authorization": f"Bearer {line_token}"
    }
    WiFi_SSID = "Aftershock_2.4G"
    WiFi_PASSWORD = "0992459870s"

ฟังก์ชันนี้ทำงานอย่างต่อเนื่องโดยตรวจสอบระยะห่างจาก Ultrasonic Sensor, ควบคุม Servo motor, และแสดงข้อมูลบนหน้าจอ LCD ตามเงื่อนไขที่กำหนด

while True:
        sw1_status = machine.Pin(sw, machine.IN).value()
        if sw1_status == 0:
            machine.Pin(TRIG_PIN, machine.OUT).on()
            time.sleep(0.00001)
            machine.Pin(TRIG_PIN, machine.OUT).off()
            while machine.Pin(ECHO_PIN, machine.IN).value() == 0:
                pulse_start = time.ticks_us()
            while machine.Pin(ECHO_PIN, machine.IN).value() == 1:
                pulse_end = time.ticks_us()
            pulse_duration = time.ticks_diff(pulse_end, pulse_start)
            distance = pulse_duration * 17150 / 1000000
            waterval = bus.readfrom(0x48, 1)[0]

            if distance <= 30:
                machine.Pin(Relay1, machine.OUT).off()
            if distance >= 31:
                machine.Pin(Relay1, machine.OUT).on()
            if waterval < 2500:
                machine.Pin(Relay2, machine.OUT).off()
                payload = {"message": "Water Low"}
                requests.post(url, headers=headers, json=payload)
            if waterval > 3500:
                machine.Pin(Relay2, machine.OUT).on()

            print("Water:", waterval)

            if sw1_status == 0:
                machine.Pin(Relay1, machine.OUT).off()
                machine.Pin(Relay2, machine.OUT).off()
        else:
            machine.Pin(Relay1, machine.OUT).off()
            machine.Pin(Relay2, machine.OUT).off()

ฟังก์ชันสุดท้ายคอยรันฟังก์ชัน setup() และสร้างลูปไว้เพื่อทำงานตลอดเวลา

if __name__ == '__main__':
    setup()
    try:
        while True:
            time.sleep(0.1)
    except KeyboardInterrupt:
        pass

5.5 รายละเอียดการทำงานของโค้ด

ส่วนหลักของโค้ดทำงานอย่างต่อเนื่อง โดยเริ่มต้นด้วยการเชื่อมต่อ WiFi และจากนั้นทำงานในลูปไม่สิ้นสุด การทำงานของลูปเริ่มต้นด้วยการส่งสัญญาณส่งสัญญาณเปิด (ON) และสัญญาณปิด (OFF) ให้กับขา TRIG_PIN เพื่อเริ่มกระบวนการวัดระยะห่างด้วย Ultrasonic Sensor หลังจากนั้นระบบจะวัดระยะห่างและคำนวณระยะห่างในหน่วยเซนติเมตร และจะมีตัวควบคุมการทำงานอีกอย่างนึงคือ Switch Manual เมื่อสวิตช์เป็น 0 Ultrasonic Sensor ก็จะเริ่มทำงาน

while True:
        sw1_status = machine.Pin(sw, machine.IN).value()
        if sw1_status == 0:
            machine.Pin(TRIG_PIN, machine.OUT).on()
            time.sleep(0.00001)
            machine.Pin(TRIG_PIN, machine.OUT).off()
            while machine.Pin(ECHO_PIN, machine.IN).value() == 0:
                pulse_start = time.ticks_us()
            while machine.Pin(ECHO_PIN, machine.IN).value() == 1:
                pulse_end = time.ticks_us()
            pulse_duration = time.ticks_diff(pulse_end, pulse_start)
            distance = pulse_duration * 17150 / 1000000
            waterval = bus.readfrom(0x48, 1)[0]

โค้ดตรวจสอบระยะห่าง และหากระยะห่างน้อยกว่าหรือเท่ากับ 30 เซนติเมตร ระบบก็จะทำงานและควบคุมปั๊มน้ำ เมื่อน้ำต่ำกว่าระดับ ระบบจะส่งข้อความการแจ้งเตือนผ่าน LINE Notify

if distance <= 30:
                machine.Pin(Relay1, machine.OUT).off()
            if distance >= 31:
                machine.Pin(Relay1, machine.OUT).on()
            if waterval < 2500:
                machine.Pin(Relay2, machine.OUT).off()
                payload = {"message": "Water Low"}
                requests.post(url, headers=headers, json=payload)
            if waterval > 3500:
                machine.Pin(Relay2, machine.OUT).on()
print("Water:", waterval)

และเมื่อสวิตช์เป็น 1 Ultrasonic Sensor ก็จะหยุดทำงาน และปั๊มน้ำจะทำงานตลอดเวลา

if sw1_status == 0:
                machine.Pin(Relay1, machine.OUT).off()
                machine.Pin(Relay2, machine.OUT).off()
        else:
            machine.Pin(Relay1, machine.OUT).off()
            machine.Pin(Relay2, machine.OUT).off()

ทุกครั้งที่โค้ดถูกเรียกใช้โดยตรง โดยใช้ if __name__ == "__main__": คำสั่ง main() จะเริ่มการทำงาน

if __name__ == '__main__':
    setup()
    try:
        while True:
            time.sleep(0.1)
    except KeyboardInterrupt:
        pass

5.6 โค้ดทั้งหมดของ Arduino ก่อนแปลงเป็น Python

import machine
import time
import urequests as requests

TRIG_PIN = 19
ECHO_PIN = 18
WATER_SENSOR_PIN = 25

sw = 17
sw1_status = 0
Relay1 = 0
Relay2 = 4

Rref = 10000
RL10 = 50
GAMMA = 0.7

def setup():
    global bus
    bus = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21))

    line_token = "rm3W3HlSYKcAxnj3SvUmBUCFDKj2Qw8tvhjZc6kiCIF"
    url = "https://notify-api.line.me/api/notify"
    headers = {
        "Authorization": f"Bearer {line_token}"
    }
    WiFi_SSID = "Aftershock_2.4G"
    WiFi_PASSWORD = "0992459870s"

    while True:
        sw1_status = machine.Pin(sw, machine.IN).value()
        if sw1_status == 0:
            machine.Pin(TRIG_PIN, machine.OUT).on()
            time.sleep(0.00001)
            machine.Pin(TRIG_PIN, machine.OUT).off()
            while machine.Pin(ECHO_PIN, machine.IN).value() == 0:
                pulse_start = time.ticks_us()
            while machine.Pin(ECHO_PIN, machine.IN).value() == 1:
                pulse_end = time.ticks_us()
            pulse_duration = time.ticks_diff(pulse_end, pulse_start)
            distance = pulse_duration * 17150 / 1000000
            waterval = bus.readfrom(0x48, 1)[0]

            if distance <= 30:
                machine.Pin(Relay1, machine.OUT).off()
            if distance >= 31:
                machine.Pin(Relay1, machine.OUT).on()
            if waterval < 2500:
                machine.Pin(Relay2, machine.OUT).off()
                payload = {"message": "Water Low"}
                requests.post(url, headers=headers, json=payload)
            if waterval > 3500:
                machine.Pin(Relay2, machine.OUT).on()

            print("Water:", waterval)

            if sw1_status == 0:
                machine.Pin(Relay1, machine.OUT).off()
                machine.Pin(Relay2, machine.OUT).off()
        else:
            machine.Pin(Relay1, machine.OUT).off()
            machine.Pin(Relay2, machine.OUT).off()

if __name__ == '__main__':
    setup()
    try:
        while True:
            time.sleep(0.1)
    except KeyboardInterrupt:
        pass

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

6.1 Diagram ของระบบการทำงาน

6.2 วิธีการใช้งานอุปกรณ์

6.2.1 นำกล่องวางไว้กับพื้นหรือบริเวณที่ให้น้ำแมวเพื่อให้ Ultrasonic sensor จับระยะของแมว และจะมีน้ำพุไหลจากด้านบน เมื่อน้ำหมดก็จะเเจ้งเตือนผ่าน LED และ LINE การทำงานนี้จะอยู๋ในระบบที่ 1

6.2.2 ระบบที่ 2 จะทำงานตลอดเวลาและจะเเจ้งเตือนผ่าน LED อย่างเดียว

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

7.1 สรุปผล จากผลการทดลองทั้งหมด เมื่อน้ำหมด Led ก็ขึ้นสีแดงและแจ้งเตือนผ่าน Line 100% มีประสิทธิภาพตรงตามเงื่อนไขที่ทดลองไว้

7.1.1 Relay , Led , Water pump ทำงานได้อย่างถูกต้อง

7.1.2 Ultrasonic Sensor ตรวจจับวัตถุได้ถูกต้องตามระยะที่กำหนดไว้

7.1.3 Water Level sensor วัดระดับน้ำได้ตามที่ต้องการ

7.1.4 Line สามารถส่งแจ้งเตือนได้ตามปกติ

7.2 ข้อเสนอแนะ

7.2.1 ประยุกต์ชิ้นงานอุปกรณ์ให้มีอัตราส่วนที่พอดี หรือน่าสนใจกว่านี้

7.2.2 เพิ่มฟังก์ชั่นการเปิด-ปิดเครื่องหรือการทำงานของระบบผ่านโทรศัพท์

7.2.3 เพิ่มการแจ้งเตือนผ่าน LINE ให้มีทั้ง 2 ระบบ

8.อ้างอิง

8.1 https://ieeexplore.ieee.org/document/10031807/metrics#metrics

8.2 https://esp32io.com/esp32-tutorials

วิดีโอการทำงานของน้ำพุแมว

You may also like...

ใส่ความเห็น

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