# ถอดรหัสข้อมูล GPS - ฮาร์ดแวร์ IoT เสมือนและ Raspberry Pi ในส่วนนี้ของบทเรียน คุณจะถอดรหัสข้อความ NMEA ที่อ่านจากเซ็นเซอร์ GPS โดยใช้ Raspberry Pi หรืออุปกรณ์ IoT เสมือน และดึงค่าละติจูดและลองจิจูดออกมา ## ถอดรหัสข้อมูล GPS เมื่อข้อมูล NMEA ดิบถูกอ่านจากพอร์ตอนุกรมแล้ว สามารถถอดรหัสได้โดยใช้ไลบรารี NMEA แบบโอเพ่นซอร์ส ### งาน - ถอดรหัสข้อมูล GPS เขียนโปรแกรมให้อุปกรณ์ถอดรหัสข้อมูล GPS 1. เปิดโปรเจกต์แอป `gps-sensor` หากยังไม่ได้เปิด 1. ติดตั้งแพ็กเกจ Pip ชื่อ `pynmea2` แพ็กเกจนี้มีโค้ดสำหรับถอดรหัสข้อความ NMEA ```sh pip3 install pynmea2 ``` 1. เพิ่มโค้ดต่อไปนี้ในส่วน imports ของไฟล์ `app.py` เพื่อ import โมดูล `pynmea2`: ```python import pynmea2 ``` 1. แทนที่เนื้อหาของฟังก์ชัน `print_gps_data` ด้วยโค้ดต่อไปนี้: ```python msg = pynmea2.parse(line) if msg.sentence_type == 'GGA': lat = pynmea2.dm_to_sd(msg.lat) lon = pynmea2.dm_to_sd(msg.lon) if msg.lat_dir == 'S': lat = lat * -1 if msg.lon_dir == 'W': lon = lon * -1 print(f'{lat},{lon} - from {msg.num_sats} satellites') ``` โค้ดนี้จะใช้ไลบรารี `pynmea2` เพื่อแปลงข้อความที่อ่านจากพอร์ตอนุกรม UART หากประเภทของข้อความเป็น `GGA` นั่นหมายถึงข้อความนี้เป็นข้อความระบุตำแหน่ง และจะถูกประมวลผล ค่าละติจูดและลองจิจูดจะถูกอ่านจากข้อความและแปลงเป็นค่าทศนิยมจากรูปแบบ NMEA `(d)ddmm.mmmm` ฟังก์ชัน `dm_to_sd` จะทำการแปลงนี้ จากนั้นจะตรวจสอบทิศทางของละติจูด หากละติจูดอยู่ทางใต้ ค่าจะถูกแปลงเป็นค่าลบ เช่นเดียวกับลองจิจูด หากอยู่ทางตะวันตกก็จะถูกแปลงเป็นค่าลบ สุดท้าย พิกัดจะถูกพิมพ์ออกมาบนคอนโซล พร้อมกับจำนวนดาวเทียมที่ใช้ในการระบุตำแหน่ง 1. รันโค้ด หากคุณใช้อุปกรณ์ IoT เสมือน ให้แน่ใจว่าแอป CounterFit กำลังทำงานอยู่และข้อมูล GPS กำลังถูกส่ง ```output pi@raspberrypi:~/gps-sensor $ python3 app.py 47.6423109,-122.1390293 - from 3 satellites ``` > 💁 คุณสามารถหาโค้ดนี้ได้ในโฟลเดอร์ [code-gps-decode/virtual-device](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/virtual-device) หรือ [code-gps-decode/pi](../../../../../3-transport/lessons/1-location-tracking/code-gps-decode/pi) 😀 โปรแกรมเซ็นเซอร์ GPS ของคุณพร้อมการถอดรหัสข้อมูลสำเร็จแล้ว! --- **ข้อจำกัดความรับผิดชอบ**: เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้องมากที่สุด แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้