ลงมือทำ: พาค่าจริงออกจากบอร์ด และสรุปโมดูล 1
โมดูล 1 — แอปพลิเคชันบนจอที่มีอยู่แล้ว · สไลด์: slides.md · ภาพรวมโมดูล · หน้าหลักสูตร
ปิดชุดบทเรียน 1.4–1.6 ด้วยแล็บของทีม ผ่าน MVP checkpoint จากไฟล์ตัวอย่างทั้งชุด เติมสมุดบันทึกผลการทดลอง s02_ai_observer.py ด้วยค่าที่ทีมวัดเอง แล้วสรุปว่าโมดูล 1 วางรากอะไรไว้ให้โมดูลถัดไป
เป้าหมาย
หัวข้อที่มีชื่อว่า “เป้าหมาย”เมื่อจบบทเรียนนี้ คุณจะ:
- ผ่าน MVP checkpoint ของชุดบทเรียน คือบอร์ดของทีมขึ้นเลข IP ที่ไม่ใช่ 0.0.0.0 ด้วย wifi.connect() และติ๊กครบทุกข้อในรายการตรวจ (01 04 02 05 06 03) พร้อมรูปหน้าจอบอร์ดในบันทึกการเรียน
- เติมช่องว่างหกจุดใน s02_ai_observer.py ด้วยผลการทดลองสามแถวที่ทีมวัดเองบนบอร์ด จนลิ้นชัก Console ขึ้นครบทุกแถว มาตรวัดเวลาต่อเฉลี่ยขยับจากศูนย์ และแผงขวาติดดวง “ต่ออยู่” พร้อมเลข IP
- ระบุสาเหตุที่แท้จริงและวิธีแก้จากอาการในตารางกับดักที่เจอบ่อยได้ และแยกได้ว่าอาการไหนไม่มี error ให้จับเลย
- อธิบายหลักออกแบบสี่ข้อที่ชุดบทเรียนนี้ใช้ (บอกได้ว่าล้มที่ขั้นไหน · ไม่เชื่อข้อมูลที่คนอื่นส่งมา · รอหลักฐานหลายรอบก่อนรายงาน · ใช้ข้อมูลที่บันทึกไว้เป็นชุดทดสอบ) พร้อมชี้ไฟล์ที่ใช้แต่ละข้อ
ก่อนเริ่ม
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม”เปิดบันทึกการเรียนที่มีผลจากบทเรียน 1.4 และ 1.5: เลข IP ของบอร์ด เวลาที่ connect() ใช้ทั้งรหัสถูกและรหัสผิด ตัวเลข dBm จาก 04 และผลของ 03
บอร์ดต่อ Hotspot มือถือของทีมได้แล้ว หน้าเว็บ my_first_reader.html ของทีมเปิดค้างไว้ และบนจอบอร์ดแตะการ์ด BENTO Playground เปิดค้างไว้ก่อนส่งโค้ด
ทีมละหนึ่งบอร์ด สลับกันเป็นคนพิมพ์ คนที่ไม่ได้พิมพ์รับหน้าที่จับเวลาและจดตัวเลข
- อุปกรณ์: บอร์ด Eva Kit หรือ TESAIoT Dev Kit ที่ลงเฟิร์มแวร์ MicroPython ของ BENTO แล้ว หรือ BENTO Emulator ใน BENTO IDE
- เรียนมาก่อน: บทเรียน 1.5 — ค่าออกไป คำสั่งกลับมา: MQTT บน broker สาธารณะ
บทเรียนนี้ไม่มีคำสั่งใหม่ งานของทีมคือไฟล์ตัวอย่างของบทเรียน 1.4–1.5 เอง ทำสี่ขั้นตามลำดับ: ขึ้นวงให้ได้ (01 04) · เฝ้าลิงก์แล้วออกแรงทำให้มันหลุดจริง (02)
· ส่งค่าออกไปแล้วรับคำสั่งกลับมา (05 06) · นิยามเองว่าลิงก์ใช้ได้คืออะไรจนสองเลขตรงกัน (03) แก้ไฟล์ละครั้ง รันครั้ง อย่าแก้หลายไฟล์แล้วรันทีเดียว
ไฟล์ฝึก s02_ai_observer.py เป็นสมุดบันทึกผลการทดลอง: เอาผลที่ทีมจดด้วยมือขึ้นจอเป็นตาราง แล้วพาบอร์ดออกเน็ตและรายงานเลข IP กลับมา
สองอย่างรวมกันคือรูปแบบของเครื่องมือหน้างานแทบทุกตัว วัด จด แล้วรายงานออกไป และเพราะตารางเป็นค่าที่จดมือ ไม่ใช่ค่าที่วัดสด หน้าจอจึงเขียนกำกับไว้
ค่าที่ไม่บอกว่าตัวเองมาจากไหน คือค่าที่เชื่อไม่ได้
ตารางกับดักที่เจอบ่อยมีครึ่งหนึ่งที่ ไม่มี error ให้จับสักตัว โปรแกรมเดินผ่านไปเงียบ ๆ แล้วรายงานสิ่งที่ไม่จริง: if wifi.ip(): ผ่านทั้งที่ได้ "0.0.0.0" ·
กราฟความแรงเป็นเส้นศูนย์เพราะหยิบ wifi.status()["rssi"] · ยิงคำสั่งสามใบแต่บอร์ดนับได้ใบเดียวเพราะกล่องรับมีช่องเดียว · สองบอร์ดผลัดกันหลุดเพราะ client_id ซ้ำ ·
หน้าเว็บว่างเพราะ TEAM สองที่ไม่ตรงกันหรือเปิดหน้าเว็บหลังบอร์ดส่งจบ (เฟิร์มแวร์ส่ง retain ไม่ได้) · ตั้งคีย์ port ของ tesaiot แล้วไม่มีผล
ส่วนที่มี error ให้เห็นคือ TypeError จาก user= (ชื่อจริงคือ username=) และ OSError จาก publish() ตอนสายหลุด ประเภทเงียบคือบั๊กที่แพงที่สุดในงานเครือข่าย
สิ่งที่เราแตะวันนี้มีสามฝั่ง ฝั่งเครือข่าย: การเข้าร่วมวงมีหลายจังหวะ การได้เลขที่อยู่เป็นคนละขั้นกับการเข้าร่วม broker ทำให้ผู้ส่งกับผู้รับไม่ต้องรู้จักกัน
และความล้มเหลวใช้เวลามากกว่าความสำเร็จเพราะมีการลองใหม่ซ่อนอยู่ ฝั่ง Python: dict กับ JSON · bytes กับ str และ .decode() · try/except
กับความล้มเหลวที่คาดไว้แล้ว · การเทียบสตริงตรง ๆ แทนการพึ่ง truthiness · การจับเวลาคร่อมคำสั่งที่ควบคุมไม่ได้ ฝั่งการออกแบบระบบ: โปรแกรมที่ล้มต้องบอกได้ว่าล้มที่ขั้นไหน (05)
· ข้อมูลจากคนอื่นต้องตรวจก่อนใช้เสมอ (06) · รอหลักฐานหลายรอบก่อนรายงาน (NEED ใน 03) · ใช้ข้อมูลที่บันทึกไว้เป็นชุดทดสอบแทนสภาพจริงที่ควบคุมไม่ได้ (เทปใน 03)
บทเรียน 1.1–1.6 คือการเห็นของครบทั้งชุดที่ไลบรารีมีให้ ตั้งแต่จอ เซนเซอร์ เสียง ไปจนถึงการส่งข้อมูลให้คนที่อยู่คนละที่ ไม่ใช่เพื่อให้จำได้หมด แต่เพื่อให้รู้ว่าปลายทางหน้าตาเป็นอย่างไร ตั้งแต่บทเรียน 2.1 เราจะย้อนกลับไปสร้างมันทีละชิ้นด้วยมือตัวเอง: สั่งฮาร์ดแวร์เองในโมดูล 2 อ่านเซนเซอร์และวาดแดชบอร์ดในโมดูล 3 แล้วส่งขึ้นแพลตฟอร์มและสร้างของจริงในโมดูล 4–5 โครงลูป “อ่าน → ตัดสิน → รายงาน” ยังเป็นโครงเดิม
ตัวอย่างสมบูรณ์
หัวข้อที่มีชื่อว่า “ตัวอย่างสมบูรณ์”บทเรียนนี้ไม่มีไฟล์ตัวอย่างของตัวเอง ใช้ไฟล์ของบทเรียน 1.4 และ 1.5 ตามสี่ขั้น: 01 → 04 → 02 → 05 → 06 → 03
แล้วทำบล็อก ตาคุณ ท้ายไฟล์ให้ครบทุกไฟล์ ถ้าติดขั้นไหน เปิดตารางกับดักในสไลด์ก่อนถามคนอื่น ส่วน 07_button_to_broker.py ในรายการข้างล่างเป็นของบทเรียน 2.3
สไลด์ของบทเรียนนี้อ้างถึงไฟล์ที่อยู่ในบทเรียนอื่นด้วย:
- m01-ui-application/l02-first-lines-on-screen/examples/06_safe_print.py — ฟังก์ชันช่วยพิมพ์ที่ไม่มีวันโดนตัดเงียบ
- m01-ui-application/l04-wifi-first-connect/examples/01_wifi_first_connect.py — พาบอร์ดออกเน็ตครั้งแรก แล้วอ่านเลขที่อยู่ของมัน
- m01-ui-application/l04-wifi-first-connect/examples/02_link_uptime.py — ต่อติดแล้ว กับยังต่ออยู่ ไม่ใช่คำถามเดียวกัน
- m01-ui-application/l04-wifi-first-connect/examples/04_scan_the_room.py — ให้บอร์ดฟังคลื่นทั้งห้อง แล้วบอกว่าใครอยู่ตรงไหนบ้าง
- m01-ui-application/l05-values-out-commands-back/examples/03_your_link_rule.py — ไฟล์นี้รันได้ แต่มันมองไม่เห็นปัญหาแบบที่สอง
- m01-ui-application/l05-values-out-commands-back/examples/05_value_leaves_the_board.py — ค่าที่วัดได้บนโต๊ะนี้ ไปโผล่บนเครื่องคนอื่น
- m01-ui-application/l05-values-out-commands-back/examples/06_command_comes_back.py — คนอื่นพิมพ์คำสั่งจากที่ไกล แล้วไฟบนโต๊ะเราติด
- m02-ui-to-hardware/l03-led-button-lab/examples/07_button_to_broker.py — ปุ่มกับไฟบนโต๊ะเรา ขึ้นไปอยู่บน broker ให้หน้าเว็บอ่านได้
- shared/web/my_first_reader.html — อ่านค่าจากบอร์ด
ฝึกเติม
หัวข้อที่มีชื่อว่า “ฝึกเติม”เปิด practice/s02_ai_observer.py แล้วทำสามขั้น: หนึ่ง ทดลองกับบอร์ดจริงด้วย 01_wifi_first_connect.py ให้ได้ผลสามแถว (เช่น ยืนข้าง Hotspot · เดินไปสุดห้อง · รหัสผิด)
แล้วเขียนทับทั้งสามแถวใน TRIALS แถวที่ใส่มาให้เป็นแค่ตัวอย่างรูปแบบจากรอบเก่า ไม่ใช่ผลที่ลอกได้ สอง แก้ TEAM_NAME WIFI_SSID WIFI_PASS บนสุด
สาม เติมช่องว่างหกจุดตามคำใบ้ # เติม: ทีละจุด แล้วส่งขึ้นบอร์ดทุกครั้ง: ล้างลิ้นชักกับหัวเรื่อง h2 · พิมพ์แต่ละแถวลงลิ้นชัก · คำนวณ avg_ms · wifi.connect() · บรรทัดรายงาน IP
หน้าจอเขียนมาให้ครบแล้ว ช่องว่างอยู่ที่ตรรกะ ไม่ได้อยู่ที่การวาด วิธีรู้ว่าผ่าน: ลิ้นชักมีหัวเรื่องและหนึ่งบรรทัดต่อหนึ่งแถว มาตรวัดเวลาไม่นิ่งอยู่ที่ศูนย์ (ถ้านิ่งแปลว่ายังไม่ได้เติม avg_ms)
และแผงขวาติดดวง “ต่ออยู่” พร้อมเลข IP ตรวจด้วยตาว่าเลขนั้นไม่ใช่ 0.0.0.0 ตามข้อ MVP และจดต่ำสุดกับสูงสุดคู่กับค่าเฉลี่ยในบันทึกการเรียนเสมอ
เพราะค่าเฉลี่ยจากสามครั้งยังไม่นับว่าเป็นการวัด
| ไฟล์ฝึก | เรื่อง |
|---|---|
| practice/s02_ai_observer.py | สมุดบันทึกผลการทดลอง แล้วพาบอร์ดขึ้นเน็ต (ฉบับฝึกเติมโค้ด) |
เปิดเฉลยหลังจากลองเองแล้วอย่างน้อยหนึ่งรอบ แล้วอ่าน วิธีใช้เฉลย ก่อน
| เฉลย | คู่กับ |
|---|---|
| solution/s02_ai_observer.py | practice/s02_ai_observer.py |
เช็กความเข้าใจ
หัวข้อที่มีชื่อว่า “เช็กความเข้าใจ”คำถามชุดเดียวกันอยู่ใน quiz.yaml สำหรับระบบที่ตรวจอัตโนมัติ
-
เน็ตขององค์กรกันพอร์ตไว้ทั้งห้อง ทีมรันไฟล์ 05 แล้วขั้นที่ 2 เป็นแดง ข้อ 05 ของ MVP ถือว่าผ่านได้อย่างไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 1)
- ก) ทีมชี้จากจอได้ว่าสายขาดที่ขั้นไหนและเพราะอะไร
- ข) ต้องรอจนกว่าเน็ตจะเปิด ไม่มีทางผ่านอื่น
- ค) แก้โค้ดให้ขั้นที่ 2 ข้ามไปขั้นที่ 3 เลย
- ง) เปลี่ยน TEAM เป็นของทีมข้าง ๆ ที่ส่งผ่านแล้ว
เฉลย
ก — ข้อ 05 ผ่านเมื่อเห็นค่าของทีมบนหน้าเว็บ หรือถ้าเน็ตกันพอร์ตไว้ทั้งห้อง ทีมอ่านจากจอได้ว่าสายขาดที่ขั้นไหน โปรแกรมที่ล้มเหลวแล้วบอกได้ว่าล้มที่ไหนก็คือผลที่ใช้ได้
-
รัน s02_ai_observer.py แล้วตารางขึ้นครบสามแถว แต่มาตรวัดเวลาต่อเฉลี่ยนิ่งอยู่ที่ศูนย์ แปลว่าอะไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)
- ก) บอร์ดต่อ WiFi ไม่ติด
- ข) ยังไม่ได้เติมบรรทัด avg_ms = total_ms // len(TRIALS) ค่าจึงยังเป็น 0 ที่ตั้งไว้ก่อน
- ค) ui.Bar รับค่าเกิน 1000 ไม่ได้
- ง) ตาราง TRIALS ต้องมีอย่างน้อยห้าแถว
เฉลย
ข — ไฟล์ตั้ง avg_ms = 0 ไว้ก่อนเพื่อให้รันได้แม้ยังไม่เติม มาตรวัดขยับครั้งเดียวหลังคำนวณ ถ้านิ่งที่ศูนย์ นั่นคือคำตอบว่ายังเติมไม่ครบ
-
อาการใดในตารางกับดักที่ ไม่มี error ให้จับ โปรแกรมเดินต่อเงียบ ๆ เลือกทุกข้อที่ถูก (เลือกได้หลายข้อ · เป้าหมายข้อ 3)
- ก) กราฟความแรงสัญญาณเป็นเส้นศูนย์ตลอด เพราะหยิบ wifi.status()[“rssi”] มาใช้
- ข) โค้ดบอกว่าได้ IP แล้วแต่ส่งอะไรก็ไม่ออก เพราะเขียน if wifi.ip()
- ค) mqtt.connect() ใส่ user= แทน username=
- ง) ยิงคำสั่งมาสามใบแต่บอร์ดนับได้ใบเดียว
เฉลย
ก, ข, ง — status() คืน rssi เป็นค่าตายตัว “0.0.0.0” เป็นสตริงที่ถือว่าจริง และกล่องรับมีช่องเดียวทับกันเอง ทั้งสามไม่มี error เลย ส่วน user= ได้ TypeError ทันที
-
บอร์ดรันไฟล์ 05 ส่งครบทุกใบ แต่หน้าเว็บของทีมว่างเปล่า ควรแก้อย่างไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 3)
- ก) เปลี่ยน broker เป็น broker.mqttdashboard.com
- ข) ตรวจ TEAM ในหน้าเว็บกับในไฟล์ให้ตรงกัน แล้วรันไฟล์ 05 ใหม่ขณะหน้าเว็บเปิดอยู่
- ค) ให้หน้าเว็บ subscribe ทุกหัวข้อด้วยเครื่องหมาย # จะได้ไม่พลาด
- ง) รอสักพัก broker จะส่งใบที่เก็บไว้มาให้เอง
เฉลย
ข — สาเหตุคือ TEAM สองที่ไม่ตรงกัน หรือเปิดหน้าเว็บหลังบอร์ดส่งจบ เฟิร์มแวร์ส่งแบบ retain ไม่ได้ broker จึงไม่เก็บใบล่าสุดไว้ให้ใคร
-
เทปผลตรวจ 24 รอบใน 03_your_link_rule.py เป็นตัวอย่างของหลักออกแบบข้อใด (เลือกหนึ่งข้อ · เป้าหมายข้อ 4)
- ก) ใช้ข้อมูลที่บันทึกไว้เป็นชุดทดสอบ แทนการหวังพึ่งสภาพจริงที่ควบคุมไม่ได้
- ข) ไม่เชื่อข้อมูลที่คนอื่นส่งมา
- ค) บอกให้ได้ว่าล้มที่ขั้นไหนของบันไดสามขั้น
- ง) ส่งแบบ retain เพื่อให้หน้าเว็บที่เปิดช้าเห็นค่า
เฉลย
ก — เทปที่บันทึกจากบอร์ดจริงเล่นซ้ำกี่รอบก็ได้ผลเดิม กฎที่ทดสอบซ้ำไม่ได้คือกฎที่ยังไม่รู้ว่าถูก และนี่คือท่าที่ทีมทดสอบซอฟต์แวร์ทั่วโลกใช้ทุกวัน
MVP checkpoint ผ่านชุดบทเรียน 1.4–1.6 เมื่อทีมต่อบอร์ดเข้าเครือข่ายด้วย wifi.connect() แล้วรายงานเลข IP ขึ้นจอสำเร็จ แปลเป็นสิ่งที่ตรวจได้จริง:
- แก้
WIFI_SSIDและWIFI_PASSให้ตรงกับ Hotspot มือถือของทีมได้เอง -
01_wifi_first_connect.pyขึ้นเลข IP ที่ ไม่ใช่0.0.0.0บนจอ - จดเวลาที่
connect()ใช้ทั้งรหัสถูกและรหัสผิด พร้อมอธิบายว่าทำไมต่างกัน -
04_scan_the_room.pyขึ้นรายชื่อวงในห้อง และชี้ได้ว่าเลขจากstatus()กับเลขจากscan()ต่างกันตรงไหน -
02_link_uptime.pyเดินครบ 30 วินาที ทำให้ลิงก์หลุดจริงหนึ่งครั้ง แล้วชี้ได้ว่าหลุดวินาทีที่เท่าไร (ข้อที่ทีมส่วนใหญ่ตก เพราะต้องออกแรงทำให้มันพังจริง) -
05_value_leaves_the_board.pyเห็นค่าของทีมตัวเองบนหน้าเว็บ หรือถ้าเน็ตของห้องกันไว้ อ่านจากจอได้ว่าสายขาดที่ขั้นไหนและเพราะอะไร -
06_command_comes_back.pyบอกได้ว่าบอร์ดกำลังฟังหัวข้ออะไร และคำสั่งที่มันรู้จักมีอะไรบ้าง -
03_your_link_rule.pyรายงานครบ 2 ครั้ง (เลขสองตัวบนจอตรงกัน) - ถ่ายรูปหน้าจอบอร์ดแนบในบันทึกการเรียน
ส่งต่อข้อความรอบห้อง (ถ้าเรียนเป็นห้อง) ทุกบอร์ดรัน 06 ด้วย TEAM ของตัวเอง ผู้สอนส่งคำลับเป็น say ไปที่ team01 ทีมที่เห็นคำบนจอให้ศูนย์ควบคุมส่งต่อทีมถัดไป
จากหน้ารวม mqtt_dashboard.html จนทีมสุดท้ายส่งกลับ team00 บนโต๊ะผู้สอน แบ่งบทบาทสี่คน: คนนั่งบอร์ด · ศูนย์ควบคุม · คนจดเวลา · คนแก้ (คำไม่ขึ้น ดูลิ้นชัก Console ว่ามาถึงไหม)
06 ฟังนาน 15 นาที ถ้ารันค้างไว้นานกว่านั้นก่อนเกม ให้กดรันใหม่ก่อนเริ่ม
ทีมที่เสร็จก่อน รัน 05 กับ 06 พร้อมกันสองบอร์ดกับทีมข้าง ๆ ให้บอร์ดหนึ่งส่งค่าลูกบิด อีกบอร์ดหนึ่งเป็นคนสั่งไฟกลับมา
การบ้านของทีม เลือกหนึ่งข้อจากสี่ข้อแล้วจดลงบันทึกการเรียน: จอหน้าประตูจาก 02 ที่อ่านได้จากระยะสามเมตร · เพิ่มค่าของทีมเองใน payload ของ 05 ·
เพิ่มคำสั่งที่สี่ให้ 06 · บันทึก TAPE ของทีมเองลงใน 03 แล้วตั้ง WANT_REPORTS ให้ตรง บทเรียน 2.1–2.3 เริ่มสั่งฮาร์ดแวร์เองครั้งแรก
คือหลอด LED ทุกดวง (gpio.num_leds() Eva Kit 3 · Dev Kit 5) กับปุ่มผู้ใช้จริงหนึ่งปุ่ม และ 07_button_to_broker.py ในบทเรียน 2.3 จะส่งการกดปุ่มขึ้น broker ชุดเดิม เก็บหน้าเว็บของทีมไว้
บทเรียนถัดไป: บทเรียน 2.1 — โมดูล gpio: LED ปุ่ม และบอร์ดที่บอกได้ว่ามีอะไร
สะท้อนคิด
หัวข้อที่มีชื่อว่า “สะท้อนคิด”- ถ้าบอร์ดของทีมต้องแขวนในโรงงานหกเดือนแล้วส่งค่าทุกนาที คุณจะรู้ได้อย่างไรว่ามันหยุดส่งตอนตีสาม
- คำสั่งที่ส่งกลับมาสั่งบอร์ดได้ ควรมีใครสั่งได้บ้าง และวันนี้อะไรกั้นคนแปลกหน้าไว้ได้จริง
- ในตาราง
TRIALSของทีม ค่าไหนที่คุณเชื่อน้อยที่สุด และหน้าจอบอกคนดูแล้วหรือยังว่ามันมาจากไหน
คำถามทบทวน
ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย
-
เน็ตขององค์กรกันพอร์ตไว้ทั้งห้อง ทีมรันไฟล์ 05 แล้วขั้นที่ 2 เป็นแดง ข้อ 05 ของ MVP ถือว่าผ่านได้อย่างไร (เป้าหมายข้อ 1)
- ทีมชี้จากจอได้ว่าสายขาดที่ขั้นไหนและเพราะอะไร
- ต้องรอจนกว่าเน็ตจะเปิด ไม่มีทางผ่านอื่น
- แก้โค้ดให้ขั้นที่ 2 ข้ามไปขั้นที่ 3 เลย
- เปลี่ยน TEAM เป็นของทีมข้าง ๆ ที่ส่งผ่านแล้ว
ดูเฉลย
คำตอบ: A. ทีมชี้จากจอได้ว่าสายขาดที่ขั้นไหนและเพราะอะไร
ข้อ 05 ผ่านเมื่อเห็นค่าของทีมบนหน้าเว็บ หรือถ้าเน็ตกันพอร์ตไว้ทั้งห้อง ทีมอ่านจากจอได้ว่าสายขาดที่ขั้นไหน โปรแกรมที่ล้มเหลวแล้วบอกได้ว่าล้มที่ไหนก็คือผลที่ใช้ได้
-
รัน s02_ai_observer.py แล้วตารางขึ้นครบสามแถว แต่มาตรวัดเวลาต่อเฉลี่ยนิ่งอยู่ที่ศูนย์ แปลว่าอะไร (เป้าหมายข้อ 2)
- บอร์ดต่อ WiFi ไม่ติด
- ยังไม่ได้เติมบรรทัด avg_ms = total_ms // len(TRIALS) ค่าจึงยังเป็น 0 ที่ตั้งไว้ก่อน
- ui.Bar รับค่าเกิน 1000 ไม่ได้
- ตาราง TRIALS ต้องมีอย่างน้อยห้าแถว
ดูเฉลย
คำตอบ: B. ยังไม่ได้เติมบรรทัด avg_ms = total_ms // len(TRIALS) ค่าจึงยังเป็น 0 ที่ตั้งไว้ก่อน
ไฟล์ตั้ง avg_ms = 0 ไว้ก่อนเพื่อให้รันได้แม้ยังไม่เติม มาตรวัดขยับครั้งเดียวหลังคำนวณ ถ้านิ่งที่ศูนย์ นั่นคือคำตอบว่ายังเติมไม่ครบ
-
อาการใดในตารางกับดักที่ **ไม่มี error ให้จับ** โปรแกรมเดินต่อเงียบ ๆ เลือกทุกข้อที่ถูก (เป้าหมายข้อ 3)
- กราฟความแรงสัญญาณเป็นเส้นศูนย์ตลอด เพราะหยิบ wifi.status()["rssi"] มาใช้
- โค้ดบอกว่าได้ IP แล้วแต่ส่งอะไรก็ไม่ออก เพราะเขียน if wifi.ip()
- mqtt.connect() ใส่ user= แทน username=
- ยิงคำสั่งมาสามใบแต่บอร์ดนับได้ใบเดียว
ดูเฉลย
คำตอบ: A. กราฟความแรงสัญญาณเป็นเส้นศูนย์ตลอด เพราะหยิบ wifi.status()["rssi"] มาใช้ · B. โค้ดบอกว่าได้ IP แล้วแต่ส่งอะไรก็ไม่ออก เพราะเขียน if wifi.ip() · D. ยิงคำสั่งมาสามใบแต่บอร์ดนับได้ใบเดียว
status() คืน rssi เป็นค่าตายตัว "0.0.0.0" เป็นสตริงที่ถือว่าจริง และกล่องรับมีช่องเดียวทับกันเอง ทั้งสามไม่มี error เลย ส่วน user= ได้ TypeError ทันที
-
บอร์ดรันไฟล์ 05 ส่งครบทุกใบ แต่หน้าเว็บของทีมว่างเปล่า ควรแก้อย่างไร (เป้าหมายข้อ 3)
- เปลี่ยน broker เป็น broker.mqttdashboard.com
- ตรวจ TEAM ในหน้าเว็บกับในไฟล์ให้ตรงกัน แล้วรันไฟล์ 05 ใหม่ขณะหน้าเว็บเปิดอยู่
- ให้หน้าเว็บ subscribe ทุกหัวข้อด้วยเครื่องหมาย # จะได้ไม่พลาด
- รอสักพัก broker จะส่งใบที่เก็บไว้มาให้เอง
ดูเฉลย
คำตอบ: B. ตรวจ TEAM ในหน้าเว็บกับในไฟล์ให้ตรงกัน แล้วรันไฟล์ 05 ใหม่ขณะหน้าเว็บเปิดอยู่
สาเหตุคือ TEAM สองที่ไม่ตรงกัน หรือเปิดหน้าเว็บหลังบอร์ดส่งจบ เฟิร์มแวร์ส่งแบบ retain ไม่ได้ broker จึงไม่เก็บใบล่าสุดไว้ให้ใคร
-
เทปผลตรวจ 24 รอบใน 03_your_link_rule.py เป็นตัวอย่างของหลักออกแบบข้อใด (เป้าหมายข้อ 4)
- ใช้ข้อมูลที่บันทึกไว้เป็นชุดทดสอบ แทนการหวังพึ่งสภาพจริงที่ควบคุมไม่ได้
- ไม่เชื่อข้อมูลที่คนอื่นส่งมา
- บอกให้ได้ว่าล้มที่ขั้นไหนของบันไดสามขั้น
- ส่งแบบ retain เพื่อให้หน้าเว็บที่เปิดช้าเห็นค่า
ดูเฉลย
คำตอบ: A. ใช้ข้อมูลที่บันทึกไว้เป็นชุดทดสอบ แทนการหวังพึ่งสภาพจริงที่ควบคุมไม่ได้
เทปที่บันทึกจากบอร์ดจริงเล่นซ้ำกี่รอบก็ได้ผลเดิม กฎที่ทดสอบซ้ำไม่ได้คือกฎที่ยังไม่รู้ว่าถูก และนี่คือท่าที่ทีมทดสอบซอฟต์แวร์ทั่วโลกใช้ทุกวัน
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"ลงมือทำ: พาค่าจริงออกจากบอร์ด และสรุปโมดูล 1" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "Hands-on: a real value leaves the board, module 1 wrap-up" from TESA Open Knowledge by the Thai Embedded Systems Association (TESA), https://github.com/tesaiot/tesa-qualification-program, licensed under CC BY-NC 4.0
ลิงก์บทเรียน: https://tesaiot.github.io/tesa-qualification-program/courses/aiot-micropython/m01-ui-application/l06-link-lab/
บทเรียนนี้ดัดแปลงจากต้นฉบับด้านล่าง เมื่ออ้างอิงให้คงเครดิตต้นฉบับไว้ด้วย
https://github.com/Advance-Innovation-Centre-AIC/embedded-systems-for-aiot-developer/blob/a80bbe88a34bcb9bb8d991f42f9252b77cdab079/session-02.html (slides 27–38)
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0
เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA