ผู้เขียนบทความ : 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
- โหลดแอป MQTT Explorer
- เชื่อมต่อ Server ของระบบ (ใส่ host และ password)
- ค้นหา topic ที่ต้องการ (ใช้ topic Vehicle) แล้วระบบจะแสดงข้อมูลที่ส่งไปยัง topic
วิธีการติดตั้งอุปกรณ์
- นำเซนเซอร์ VL53L0X ติดตั้งด้านบนของแต่ละที่นั่งของยานพาหนะ
- เชื่อมแบตเตอรี่รถยนต์หรืออุปกรณ์เพื่อให้พลังงาน ESP 32
- เปิดใช้งาน 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
วิดิโอนำเสนอการทำงานระบบเก็บข้อมูลจำนวนผู้ใช้งานยานพาหนะ