ระบบเก็บข้อมูลจำนวนผู้ใช้งานยานพาหนะ  (System for collecting data on the number of vehicle users)

ผู้เขียนบทความ : 166404140065 นางสาวตัสนีม สาโส๊ะ

                          : 166404140085 นายก้องเกียรติ ลงทอง

                          : 166404140087 นางสาวซารีน่า หมานหลี

                          : 166404140090 นายบัฎรีย์ กาเกาะ

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

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

1. ความเป็นมาและความสำคัญของปัญหา

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

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

2.1 เพื่อพัฒนาระบบเก็บข้อมูลจำนวนผู้ใช้งานยานพาหนะ

3. ขอบเขต

3.1 โปรแกรมสามารถตรวจสอบสถานะการใช้งานยานพาหนะได้

3.2 เป็นการนับจำนวนคนที่มาใช้บริการบนรถเท่านั้น

3.3 สามารถรับข้อมูลได้ 24 ชม. (หากแบตเตอรี่อุปกรณ์เซนเซอร์ไม่หมด)

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

4.1 ลดการใช้เเรงงานคน

4.2 ช่วยอำนวยความสะดวก

4.3 สามารถใช้ได้จริงในชีวิตประจำวัน

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

5.1 ESP 32

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

5.2 VL53L0X V2

  • VL53L0X V2 เป็นเซนเซอร์วัดระยะทางแบบ Time-of-Flight (ToF) ที่ใช้เลเซอร์อินฟราเรดในการตรวจวัดระยะทางจากวัตถุ ซึ่งทำงานโดยการส่งพัลส์เลเซอร์ออกไป แล้วตรวจจับเวลา (time) ที่เลเซอร์สะท้อนกลับมา ทำให้สามารถคำนวณระยะทางได้อย่างแม่นยำ

5.3 MQTT Explorer

  • MQTT Explorer เป็นโปรโตคอลการสื่อสารแบบ lightweight ที่ออกแบบมาเพื่อให้การส่งข้อมูลระหว่างอุปกรณ์ที่มีข้อจำกัดด้านพลังงานและการเชื่อมต่อเครือข่ายที่ไม่เสถียรสามารถทำได้อย่างมีประสิทธิภาพ มันมักถูกใช้งานในระบบ IoT (Internet of Things)
  • MQTT server หรือ broker เป็นส่วนสำคัญที่ทำหน้าที่จัดการการสื่อสารระหว่างอุปกรณ์ต่างๆ โดยทำหน้าที่ดังนี้ : รับ ข้อความจาก client ที่ส่งข้อมูลไปยัง server แจกจ่าย ข้อความนั้นไปยัง client ที่ต้องการรับข้อมูลตามหัวข้อ (topic) ที่กำหนดไว้

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

วงจรของระบบเก็บข้อมูลจำนวนผู้ใช้งานยานพาหนะ

Flowchart : ลำดับการทำงานของระบบเก็บข้อมูลจำนวนผู้ใช้งานยานพาหนะ

Code

WiFi Class

  • คลาสนี้จำลองการเชื่อมต่อ Wi-Fi โดยใช้เมธอด connect เพื่อแสดงข้อความเชื่อมต่อไปยังเครือข่าย Wi-Fi ตามที่กำหนด โดยใส่ชื่อเครือข่ายและรหัสผ่าน
  • ฟังก์ชัน connect จะมีการหน่วงเวลาเพื่อจำลองการเชื่อมต่อ และพิมพ์ข้อความเมื่อการเชื่อมต่อเสร็จสิ้น
 class WiFi :
    def connect(self, ssid, password):
        print(f"Connecting to WiFi: {ssid}...")
        time.sleep(2)
        print("Connected to WiFi")

Sensor VL53L0X Class

  • คลาสนี้จำลองการทำงานของเซ็นเซอร์วัดระยะทาง VL53L0X
  • เมธอด read_distance ใช้เพื่อคืนค่าระยะทางจากเซ็นเซอร์ ซึ่งในที่นี้จะคืนค่าจำลอง (30 cm) เพื่อแสดงว่ามีคนอยู่ในระยะที่กำหนด
 class SensorVL53L0X :
    def __init__(self):
        pass

    def read_distance(self):
        return 30  # ระยะทางตัวอย่างในหน่วยเซนติเมตร

MQTTClient Class

  • คลาสนี้จัดการการเชื่อมต่อและการส่งข้อมูลผ่านโปรโตคอล MQTT
  • มีเมธอด connect เพื่อเชื่อมต่อกับ MQTT broker และ publish เพื่อส่งข้อมูลไปยังหัวข้อ (topic) ที่กำหนด
 class MQTTClient :
    def __init__(self, broker, port, username, password):
        self.client = mqtt.Client("esp32_vehicle")
        self.client.username_pw_set(username, password)
        self.broker = broker
        self.port = port

    def connect(self):
        print("Connecting to MQTT...")
        self.client.connect(self.broker, self.port)
        print("Connected to MQTT")

    def publish(self, topic, message):
        result = self.client.publish(topic, message)
        if result.rc == mqtt.MQTT_ERR_SUCCESS:
            print(f"Successfully sent: {message} to topic: {topic}")
        else:
            print(f"Failed to send: {message} to topic: {topic}")

UserCounter Class

  • คลาสนี้จัดการการนับจำนวนผู้ใช้โดยใช้ข้อมูลจากเซ็นเซอร์
  • เมธอด update_count ตรวจสอบระยะทางจากเซ็นเซอร์ หากมีคนอยู่ในระยะจะเพิ่มจำนวนผู้ใช้
  • เมธอด reset_daily_count รีเซ็ตจำนวนผู้ใช้รายวันเมื่อถึงเที่ยงคืน
 class UserCounter :
    def __init__(self):
        self.daily_user_count = 0
        self.last_occupied_time = 0
        self.last_unoccupied_time = 0
        self.occupied = False

    def update_count(self, distance, current_time):
        if distance < MAX_DISTANCE:
            if not self.occupied:
                if self.last_occupied_time == 0:
                    self.last_occupied_time = current_time
                elif current_time - self.last_occupied_time > MIN_OCCUPIED_TIME:
                    self.daily_user_count += 1
                    self.occupied = True
                    self.last_occupied_time = 0
                    print(f"User count incremented: {self.daily_user_count}")
        else:
            if self.occupied:
                if self.last_unoccupied_time == 0:
                    self.last_unoccupied_time = current_time
                elif current_time - self.last_unoccupied_time > MIN_UNOCCUPIED_TIME:
                    self.occupied = False
                    self.last_unoccupied_time = 0

    def reset_daily_count(self):
        self.daily_user_count = 0
        print("Daily user count reset.")

NTPClient Class

  • คลาสนี้ตรวจสอบเวลาปัจจุบันและตรวจสอบว่าเป็นเที่ยงคืนหรือไม่ เพื่อรีเซ็ตจำนวนผู้ใช้รายวัน
  • เมธอด get_current_time ใช้คืนค่าวันเวลาปัจจุบัน และ is_midnight ตรวจสอบว่าถึงเที่ยงคืนแล้วหรือไม่
 class NTPClient :
    def __init__(self):
        pass

    def get_current_time(self):
        return datetime.datetime.now()

    def is_midnight(self):
        current_time = self.get_current_time()
        return current_time.hour == 0 and current_time.minute == 0 and current_time.second == 0

Application Class

  • คลาสหลักที่รวมการทำงานของทุกคลาสข้างต้น โดยจัดการการเชื่อมต่อและเรียกใช้ฟังก์ชันหลัก
  • เมธอด generate_topic สร้างชื่อหัวข้อ MQTT ใหม่ทุกวัน
  • เมธอด reset_topic_and_count รีเซ็ตจำนวนผู้ใช้รายวันและอัปเดตชื่อหัวข้อ
  • เมธอด run เป็นลูปหลักที่รันโปรแกรม โดยจะอ่านข้อมูลจากเซ็นเซอร์ เช็คสถานะ Wi-Fi และส่งข้อมูลไปยัง MQTT เมื่อมีผู้ใช้ใหม่
 class Application :
    def __init__(self):
        self.wifi = WiFi()
        self.sensor = SensorVL53L0X()
        self.mqtt_client = MQTTClient(MQTT_BROKER, MQTT_PORT, MQTT_USERNAME, MQTT_PASSWORD)
        self.user_counter = UserCounter()
        self.ntp_client = NTPClient()
        self.mqtt_topic_daily = self.generate_topic()

    def generate_topic(self):
        today = datetime.datetime.now()
        return f"vehicle/daily_user_count_{today.strftime('%Y-%m-%d')}"

    def reset_topic_and_count(self):
        self.user_counter.reset_daily_count()
        self.mqtt_topic_daily = self.generate_topic()
        print(f"MQTT topic updated: {self.mqtt_topic_daily}")

    def run(self):
        # เริ่มต้นการเชื่อมต่อ
        self.wifi.connect(SSID, PASSWORD)
        self.mqtt_client.connect()

        # วนลูปหลัก
        while True:
            current_time = time.time()

            # อ่านค่าระยะจากเซ็นเซอร์
            distance = self.sensor.read_distance()
            self.user_counter.update_count(distance, current_time)

            # ตรวจสอบว่าถึงเวลาเที่ยงคืนหรือไม่เพื่อตั้งค่าค่าวันใหม่
            if self.ntp_client.is_midnight():
                self.reset_topic_and_count()

            # ส่งค่าผ่าน MQTT หากนับผู้ใช้ใหม่
            if self.user_counter.occupied:
                self.mqtt_client.publish(self.mqtt_topic_daily, str(self.user_counter.daily_user_count))

            # หน่วงเวลาสั้น ๆ
            time.sleep(1)

การเรียกใช้งานโปรแกรม

  • สร้างออบเจ็กต์ Application และเรียกเมธอด run เพื่อเริ่มการทำงานของระบบทั้งหมด
  • โปรแกรมนี้จะวนลูปหลักไม่หยุด ตรวจสอบค่าระยะจากเซ็นเซอร์และส่งข้อมูลไปยัง MQTT ทุกครั้งที่ตรวจพบผู้ใช้ใหม่
# เริ่มต้นโปรแกรม
app = Application()
app.run()

วิธีการเข้าระบบ MQTT Server

  1. โหลดแอป MQTT Explorer
  2. เชื่อมต่อ Server ของระบบ (ใส่ host และ password)
  3. ค้นหา topic ที่ต้องการ (ใช้ topic Vehicle) แล้วระบบจะแสดงข้อมูลที่ส่งไปยัง topic

วิธีการติดตั้งอุปกรณ์

  1. นำเซนเซอร์ VL53L0X ติดตั้งด้านบนของแต่ละที่นั่งของยานพาหนะ
  2. เชื่อมแบตเตอรี่รถยนต์หรืออุปกรณ์เพื่อให้พลังงาน ESP 32
  3. เปิดใช้งาน MQTT Server เพื่อรับค่าจำนวนผู้ใช้งานยานพาหนะ

7. ผลการทดลอง

8. สรุปการทำงาน

เมื่อเลเซอร์วัดระยะได้น้อยกว่า 50 เมตร หรือต่ำกว่าเป็นเวลาประมาณ 30 วินาที (เมื่อมีคนนั่งอยู่ >= 30 วิ) ESP32 จะเก็บค่าเข้าไปในตัวแปรผู้ใช้งานยานพาหนะ +1 และส่งค่าตัวแปรเข้าไปใน MQTT Server และรอจนกว่าระยะเลเซอร์จะมากกว่า 50 เมตร และคงสถานะอยู่ประมาณ 5 วินาที (ที่นั่งว่างเกิน 5 วิ) เซนเซอร์ถึงจะเริ่มเก็บค่าใหม่ โดยทุก ๆ เวลาเที่ยงคืนของทุกวัน ระบบจะรีเซ็ทจำนวนตัวแปรเท่ากับ 0 และเปลี่ยน topic เป็น vehicle / daily_count_ตามด้วยวันที่ของวันนั้นๆ

9. ข้อเสนอแนะ

  • เพิ่มการบันทึกข้อมูลการทำงานลงไฟล์ โดยใช้โมดูล logging เพื่อเก็บข้อมูลสถานะการเชื่อมต่อ ข้อมูลการส่งผ่าน MQTT และข้อผิดพลาดต่าง ๆ จะช่วยให้ตรวจสอบและวิเคราะห์ปัญหาได้ง่ายขึ้น ควรกำหนดระดับของการบันทึกเช่น INFO, WARNING, และ ERROR
  • เพิ่มฟังก์ชันส่งข้อความแจ้งเตือนผ่าน E-mail หรือ Line เมื่อเกิดข้อผิดพลาด กำหนดให้โปรแกรมส่งการแจ้งเตือนหากเกิดข้อผิดพลาด เช่น การเชื่อมต่อ MQTT หรือ Wi-Fi หลุด สามารถใช้โมดูล smtplib เพื่อส่ง E-mail หรือใช้ Line API เพื่อแจ้งเตือนผ่าน Line

10. ข้อมูลอ้างอิง

10.1 ESP 32 [สืบค้นวันที่ 15 ตุลาคม 2567]

จาก https://www.espressif.com/en/products/socs/esp32/resources

10.2 เซนเซอร์ VL53L0X V2 [สืบค้นวันที่ 15 ตุลาคม 2567]

จาก https://esphome.io/components/sensor/vl53l0x.html

10.3 MQTT Explorer [สืบค้นวันที่ 15 ตุลาคม 2567]

จาก https://chatgpt.com/c/6711c529-dc30-8006-9e3d-4feb40407473

วิดิโอนำเสนอการทำงานระบบเก็บข้อมูลจำนวนผู้ใช้งานยานพาหนะ

You may also like...

ใส่ความเห็น

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