ภาพพื้นหลังปกบทเรียน

บทเรียน 1.4 — บอร์ดออกจากโต๊ะ: ต่อ WiFi ครั้งแรก

ค่าที่วัดบนโต๊ะนี้ไปโผล่บนเครื่องคนอื่น แล้วคำสั่งจากที่ไกลกลับมาสั่งของบนโต๊ะเรา

โมดูล 1 — แอปพลิเคชันบนจอที่มีอยู่แล้ว

คาถาประจำบทเรียน: ชุดบทเรียนก่อนหน้าบอร์ดพูดกับเรา ชุดบทเรียนนี้มันพูดกับคนที่ไม่ได้อยู่ในห้องนี้

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

ดูของจริงก่อน — วันนี้ค่าหนึ่งค่าจะเดินทางออกจากโต๊ะนี้

เรื่องทั้งบทเรียนมีสองลูกศร และมันวิ่งสวนทางกัน บอร์ดบนโต๊ะเรา หมุนลูกบิดจริง หลอด LED จริง sensors · gpio ที่พักข้อความ broker.hivemq.com ใครฟังหัวข้อไหน ก็ได้ของ สาธารณะ ไม่ต้องตั้งเอง คนที่อยู่คนละที่ เห็นเลขของเราขยับ แล้วพิมพ์คำสั่งกลับมา หน้าเว็บ ไม่ต้องลงโปรแกรม เขียวคือไฟล์ 05 ค่าออกไป ม่วงคือไฟล์ 06 คำสั่งกลับมา

ชุดบทเรียนก่อนหน้าทุกอย่างจบอยู่บนจอบอร์ด เราสั่ง บอร์ดตอบ แล้วก็จบกันตรงนั้น วันนี้เราจะพาของออกจากโต๊ะนี้ไปให้คนอื่นเห็น แล้วเปิดทางให้เขาสั่งของบนโต๊ะเรากลับมาได้ด้วย

ตรงกลางภาพคือ สิ่งที่ทำให้สองฝั่งไม่ต้องรู้จักกัน เราไม่ต้องรู้ว่าใครจะมาอ่านค่าของเรา และคนที่สั่งกลับมาก็ไม่ต้องรู้ว่าบอร์ดเราอยู่ที่ไหนบนโลก ทั้งคู่รู้แค่ชื่อหัวข้อเดียวกัน

ระบบ IoT จริงทั้งโลกวางบนภาพนี้ ไม่ว่าจะเป็นมิเตอร์ไฟหน้าบ้าน หรือรถบรรทุกที่วิ่งอยู่อีกจังหวัด

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

ปลายทางของชุดบทเรียนนี้ — และภาพจริงภาพเดียวที่เรามีตอนนี้

หน้าจอจาก BENTO Emulator ของ 05_value_leaves_the_board.py บันไดสามขั้น WiFi broker และการส่ง

หน้าจอจริงจากการรัน 05_value_leaves_the_board.py บน BENTO Emulator ที่ 800x480 เท่าจอของทั้งสองบอร์ด ถ่ายจากไฟล์ปัจจุบันโดยตั้ง `TEAM = "nok4821"` — ภาพนี้แสดงหน้าตาจอ ไม่ใช่หลักฐานว่าบอร์ดจริงส่งผ่านเน็ตของห้องได้
  • ภาพนี้คือไฟล์ที่ 4 ของชุดบทเรียน และคือปลายทางจริง: บันไดสามขั้น — WiFi ได้ IP · broker ต่อแล้วที่ broker.hivemq.com · publish กำลังส่ง — เลขใบที่ส่งเดินขึ้นพร้อมค่าลูกบิดและค่าเอียง az ที่เพิ่งออกจากบอร์ดไป
  • แถวล่างคือหัวข้อที่ส่งขึ้น broker (bento-aiot/<TEAM>/telemetry) และมุมขวาบนคือคำเตือนที่ไฟล์เขียนไว้บนจอตลอดเวลาที่รัน — พอร์ต 1883 ไม่เข้ารหัส ห้ามส่งของลับ
  • ภาพนี้เกิดได้ต่อเมื่อเน็ตของห้องปล่อยพอร์ต 1883 ออกไปถึง broker.hivemq.com — ถ้าถูกกัน ขั้นที่ 2 จะเป็นแดงพร้อมบอกเหตุผล แล้วโปรแกรมจบตรงนั้นอย่างสุภาพ ส่วนฝั่งผู้รับ วันนี้คือหน้าเว็บ my_first_reader.html ไม่ต้องลงโปรแกรมใดในเครื่อง

ยังไม่มีใครรันไฟล์ 05 กับ 06 บนบอร์ดกับ broker.hivemq.com สิ่งที่วัดแล้วคือเวลาไปกลับของ broker จาก Mac บนโต๊ะผู้สอน ไม่ใช่จากเน็ตขององค์กร ถ้าไปไม่ถึง ไฟล์จะขึ้นบนจอตรง ๆ ว่าหยุดที่ขั้นไหนและเพราะอะไร — ผลแบบนั้นก็ยังเป็นผลที่ใช้ได้

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

เจ็ดไฟล์ · เรื่องเดียวเล่าเป็นเจ็ดตอน

ชุดบทเรียนนี้ไม่ได้สอนโมดูล wifi มันพาบอร์ดไปให้ถึงคนอื่น ตอนที่หนึ่ง · ขึ้นวงให้ได้ 01 ต่อ · 04 ฟังทั้งห้อง wifi · lcd · ui · time ตอนที่สอง · เชื่อได้แค่ไหน 02 เฝ้าลิงก์ · 03 เขียนกฎเอง ของเดิมทั้งชุด ไม่มีคำสั่งใหม่ ตอนที่สาม · ออกไปถึงคนอื่น 05 ส่งออก · 06 รับกลับ · 07 จำเอง mqtt · json · sensors · gpio โมดูลที่ชุดบทเรียนนี้แตะจริงทั้งหมด wifi · mqtt · tesaiot · json · sensors · gpio · lcd · ui · time สี่ตัวแรกเป็นของใหม่วันนี้ ห้าตัวหลังคือของเดิมจากชุดบทเรียนก่อนหน้าที่กลับมาใช้อีก

สี่โมดูลใหม่วันนี้ทำหน้าที่คนละอย่างกันชัดเจน wifi พาบอร์ดขึ้นวง · mqtt ส่งข้อความออกและรับกลับ · json แปลงข้อมูลของเราให้เป็นข้อความที่ทุกภาษาอ่านได้ · tesaiot เก็บค่าตั้งไว้บนแฟลชของบอร์ดเอง

ที่เหลือเป็นของเดิม sensors อ่านลูกบิด gpio สั่งหลอดไฟ ส่วน lcd ui time คือชุดเดิมจากชุดบทเรียนก่อนหน้าทุกประการ

ไม่ต้องจำรายชื่อนี้ตอนนี้ แต่ละไฟล์จะแนะนำของของมันเองตอนที่ถึงคิว

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

เป้าหมายของชุดบทเรียนนี้

  1. พาบอร์ดขึ้นเครือข่ายด้วย wifi.connect() แล้วอ่านหมายเลข IP ของบอร์ดตัวเองได้
  2. ให้บอร์ดสำรวจคลื่นทั้งห้องด้วย wifi.scan() แล้ววินิจฉัยเองได้ว่าต่อไม่ติดเพราะอะไร
  3. แยก "ต่อติดตอนนั้น" ออกจาก "ยังต่ออยู่ตอนนี้" แล้วเขียนกฎเองว่าลิงก์แบบไหนเรียกว่าใช้ได้
  4. ส่งค่าจริงจากบอร์ดออกไปให้เครื่องอื่นเห็น แล้วรับคำสั่งจากที่ไกลกลับมาสั่งของบนบอร์ด

ปลายทางของวันนี้: จอบอร์ดขึ้นหมายเลข IP ของทีม เลขใบที่ส่งออกไปเดินขึ้น และหลอดไฟบนบอร์ดติดเพราะมีคนพิมพ์คำสั่งมาจากอีกเครื่อง

เปิดบอร์ดรอไว้ได้เลย เล่นเกมเปิดบทเรียนเสร็จ เรารันไฟล์แรกทันที — ชุดบทเรียนนี้ทฤษฎีมาทีหลังของจริงทุกเรื่อง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

ก่อนเริ่ม — ทุกทีมเปิด Hotspot มือถือให้บอร์ด

WiFi ขององค์กรต้อง login ผ่านหน้าเว็บก่อนใช้งาน บอร์ดไม่มีเบราว์เซอร์ให้กดยอมรับ บอร์ดจะได้เลข IP แต่ออกอินเทอร์เน็ตไม่ได้ ไปไม่ถึง broker · วันนี้บอร์ดของทุกทีมต่อ Hotspot จากมือถือของคนในทีมหนึ่งเครื่อง

ขั้น iPhone Android
1 · ตั้งชื่อ ชื่อ Hotspot คือชื่อเครื่อง: การตั้งค่า > ทั่วไป > เกี่ยวกับ > ชื่อ ตั้งเป็น bento-team05 การตั้งค่า Hotspot > ชื่อเครือข่าย ตั้งเป็น bento-team05
2 · ตั้งรหัส ฮอตสปอตส่วนบุคคล > รหัสผ่าน Wi-Fi (อย่างน้อย 8 ตัว) รหัสผ่าน อย่างน้อย 8 ตัว ความปลอดภัย WPA2
3 · ย่านความถี่ เปิด เพิ่มความเข้ากันได้สูงสุด (Maximize Compatibility) เลือกย่าน 2.4 GHz ถ้ามีให้เลือก
4 · เปิดค้าง เปิดหน้าฮอตสปอตค้างไว้ตอนบอร์ดต่อครั้งแรก เปิด Hotspot ค้างไว้

แล้วแก้สองบรรทัดบนหัวทุกไฟล์ที่ต่อเน็ตให้ตรงกับมือถือ:

WIFI_SSID = "bento-team05"          # ชื่อ Hotspot ตัวอักษรอังกฤษ ไม่มีช่องว่าง
WIFI_PASS = "<รหัส Hotspot ของทีม>"
  • ตั้งชื่อเป็นตัวอักษรอังกฤษสั้น ๆ เพราะชื่อวงขึ้นบนจอบอร์ด ชื่อเครื่องแบบ สมชาย’s iPhone มีอักขระที่จอวาดไม่ได้ และยาวจนข้อความบนจอถูกตัด
  • บอร์ดใช้เน็ตน้อยมาก ส่งข้อความสั้น ๆ ราวใบละร้อยไบต์ทุก 2 วินาที
  • โน้ตบุ๊กที่เปิดหน้าเว็บ ต่อ WiFi ขององค์กร (login ตามปกติ) ได้ ถ้าหน้าเว็บต่อ broker ไม่ได้ ให้ย้ายมาต่อ Hotspot เดียวกับบอร์ด

ยังไม่ได้ทดสอบกับ Hotspot ครบทุกรุ่น ถ้าบอร์ดหา Hotspot ไม่เจอ ให้เช็กข้อ 3 และข้อ 4 ก่อน แล้วลองรันไฟล์ 04_scan_the_room.py ดูว่าบอร์ดได้ยินชื่อนั้นไหม

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

ก่อนเริ่ม — ส่งข้อความถึงบอร์ดหน้าห้อง

เครื่องของคุณ เครื่องของเพื่อน อีกราว 40 เครื่อง broker.hivemq.com bento-aiot/team00/cmd บอร์ดหน้าห้อง ไฟล์ 06 · team00 กล่องรับกี่ช่อง

เปิดหน้ารวม https://advance-innovation-centre-aic.github.io/embedded-systems-for-aiot-developer/examples/web/mqtt_dashboard.html บนเครื่องตัวเอง ไม่ต้องติดตั้งอะไร หน้าจะต่อ broker เอง ช่อง ทีม ในหัวข้อ "ส่งคำสั่ง" พิมพ์ team00 แล้วกด บี๊บ หรือพิมพ์ข้อความสั้น ๆ แล้วกด ส่งข้อความ (say) บอร์ดบนโต๊ะผู้สอนรัน 06_command_comes_back.py เป็น team00 อยู่ มันจะร้อง หรือขึ้นข้อความของคุณ (ตัดที่ 24 ตัวอักษร)

ทายก่อน แล้วค่อยดู ผู้สอนนับหนึ่งถึงสาม ทุกคนกดส่งพร้อมกัน ทีมเขียนคำทายลงบันทึกการเรียน ก่อน เขียนแล้วห้ามแก้

ทีมเราทายว่าตัวเลข "ได้รับแล้ว" บนจอบอร์ดหน้าห้องจะขึ้น ☐ น้อยกว่า 10 ☐ 10 ถึง 30 ☐ ครบทุกคน

พิมพ์ภาษาไทยหรืออังกฤษเท่านั้น จอบอร์ดไม่มีตัวอักษรอื่น · ส่งจากหน้าเว็บ · ยังไม่มีใครนับว่าจริง ๆ จะขึ้นกี่ใบ ผลที่เห็นในห้องคือคำตอบ แล้วเราจะกลับมาดูว่าทำไมที่สไลด์ไฟล์ 06

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

ลงมือ 15 นาทีแรก — รันไฟล์แรกก่อนฟังอะไรทั้งนั้น

1 · เปิด Playground ค้างไว้บนจอบอร์ด 2 · แก้สองบรรทัดบนสุด WIFI_SSID · WIFI_PASS 3 · Program to Device แล้วมองจอบอร์ด 4 · จับเวลาที่จอนิ่ง นับในใจก็ได้ จอจะนิ่งไปนาน นั่นไม่ใช่บอร์ดแฮงก์ อย่าเพิ่งกดรีเซ็ต อย่าเพิ่งถอดสาย รอให้มันตอบกลับมาเอง

เปิด 01_wifi_first_connect.py แก้สองบรรทัดบนสุดให้ตรงกับ Hotspot มือถือของทีม แล้วส่งขึ้นบอร์ดเลย

# แก้สองบรรทัดนี้ให้ตรงกับ Hotspot มือถือของทีม
WIFI_SSID = "bento-teamXX"            # ชื่อ Hotspot มือถือของทีม (WiFi ขององค์กรต้อง login บอร์ดใช้ไม่ได้)
WIFI_PASS = "<รหัส Hotspot ของทีม>"     # อย่างน้อย 8 ตัว

สิ่งที่ต้องจดระหว่างรอ: จอค้างนานแค่ไหน (นับในใจก็ได้) แล้วเทียบกับตัวเลข ms ที่บอร์ดรายงานตอนกลับมา ตรงกันไหม

ยังไม่เข้าใจว่าทำไมต้องรอ ไม่เป็นไร สองสไลด์ถัดไปเราจะแกะทีละบรรทัด แต่ต้องเห็นมันเกิดขึ้นกับตาก่อน

ทีมที่ต่อติดตั้งแต่ยี่สิบนาทีแรก จะมีเวลาเหลือไปถึงไฟล์ 05 กับ 06 อย่างสบาย ๆ ซึ่งเป็นสองไฟล์ที่สนุกที่สุดของชุดบทเรียน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

โมดูล wifi มีแปดตัว — ห้าตัวนี้ใช้วันนี้

wifi.connect(ssid, pw) คืน True หรือ False บล็อก โปรแกรมหยุดรอ ตอบว่า ตอนนั้นสำเร็จไหม wifi.ip() คืนสตริงเสมอ ไม่เคยคืน None ยังไม่มีที่อยู่ = "0.0.0.0" ตอบว่า เลขที่อยู่ของเราคือ wifi.is_connected() คืน True หรือ False ไม่บล็อก ถามได้ทุกรอบ ตอบว่า ตอนนี้ยังต่ออยู่ไหม wifi.scan() ทุกวงที่ได้ยิน พร้อมความแรงจริง wifi.status() มี ssid กับ rssi แต่สองคีย์นั้นปลอม

สามตัวบนใช้ตอนต่อ สองตัวล่างใช้ตอนสำรวจและตอนหาสาเหตุว่าทำไมต่อไม่ติด

อีกสามตัวที่เหลือ — wifi.disconnect() ตัดการเชื่อมต่อเอง · wifi.ping(host) วัดว่าปลายทางตอบไหมและช้าแค่ไหน · wifi.softap() เปลี่ยนบอร์ดเป็นตัวปล่อยสัญญาณเองเมื่อไม่มีเราเตอร์ให้เกาะ ทั้งสามอยู่ในบทเรียน 4.1–4.3 (04_ping_two_targets.py, 07, 08)

ตรวจเองได้เสมอว่าโมดูลไหนมีอะไร — พิมพ์ print(dir(wifi)) บนบอร์ด แล้วนับเอง อย่าเชื่อสไลด์รวมทั้งแผ่นนี้

lcd ui และ time ยังเป็นชุดเดิมจากชุดบทเรียนก่อนหน้าทุกประการ — ui.poll() หลังแก้ widget · ui.Seg7 รับข้อความ · ui.Chart เกิดมาพร้อมเส้นที่ 0 อยู่แล้ว · lcd.print() ส่งได้ 127 ไบต์ต่อครั้ง ส่วนป้าย ui พาได้ 126 ไบต์ทั้งตอนสร้างและตอนเรียก .text()

ความต่างของสามตัวบนอยู่ที่ เวลาของคำถาม ไม่ใช่ที่ข้อมูลที่มันคืนมา จำประโยคนี้ไว้แล้วทั้งบทเรียนจะง่ายขึ้น

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

แกะไฟล์ 01 — ป้ายต้องขึ้น "ก่อน" บรรทัดที่บล็อก แล้วจับเวลาคร่อมมัน

step_lbl = ui.Label("ป้ายนี้ขึ้นก่อน แล้วจอจะนิ่ง", x=24, y=208, color=COL_TEXT,
                    value=20)
...
ui.poll()                        # เคาะให้ป้ายขึ้นจอจริง ๆ ก่อนเข้าบรรทัดที่บล็อก
...
t0 = time.ticks_ms()
ok = wifi.connect(WIFI_SSID, WIFI_PASS)
elapsed = time.ticks_diff(time.ticks_ms(), t0)
...
seg.text(str(elapsed))           # Seg7 รับข้อความ จึงคุมรูปแบบได้ seg.value(4218) ได้แค่จำนวนเต็ม
ท่านี้บล็อกได้นานถึงราว 85 วินาที จึงต้องบอกคนดูก่อน ไม่ใช่หลัง ป้าย + ui.poll() wifi.connect(ssid, pw) โปรแกรมหยุดรอตรงนี้ True → IP False → แจ้ง ระหว่างแถบนี้เดิน จอไม่ขยับเลยแม้แต่พิกเซล 4218 ms รหัสถูก 85310 ms รหัสผิด ตัวเลขบนจอเป็นของบอร์ดเอง ไม่ใช่ความรู้สึกว่า "นานจัง"

ป้ายที่สร้างไว้แต่ยังไม่ได้เคาะ จะไปโผล่ หลัง connect() จบ ซึ่งคือตอนที่ไม่มีใครต้องการมันแล้ว กฎ ui.poll() จากชุดบทเรียนก่อนหน้ากลายเป็นเรื่องเป็นเรื่องตายขึ้นมาตรงนี้

time.ticks_ms() กับ ticks_diff() เป็นคู่เดิมจากไฟล์ 07 ของชุดบทเรียนที่แล้ว ที่ต่างคือคราวนี้เราเอามันมาคร่อมบรรทัดที่ควบคุมไม่ได้ เพราะ "นานจัง" ไม่ใช่ข้อมูล ส่วน "4218 ms" เอาไปเทียบกันได้ทั้งระหว่างทีมและระหว่างรหัสถูกกับรหัสผิด

ถ้า ok เป็น False ไฟล์นี้รายงานแล้ว raise SystemExit ทันที โปรแกรมที่พูดเฉพาะตอนสำเร็จ จะเงียบในจังหวะที่คนอยากรู้ที่สุด

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

กับดักที่ชื่อ "0.0.0.0" — และทำไมรหัสผิดถึงช้ากว่ารหัสถูก

แผนภาพลำดับการเข้าร่วมเครือข่าย WiFi: ค้นหา ยืนยันตัว แล้วขอเข้าร่วม

ภาพ: Wikimedia Commons — ลำดับการเข้าร่วมเครือข่ายไร้สาย จากการค้นหา ไปแนะนำตัว แล้วจึงขอเข้าร่วม · บทเรียน 4.1–4.3 เราจะเจาะสามจังหวะนี้ทีละขั้น วันนี้แค่รู้ว่ามันมีหลายขั้นก็พอ
ip = wifi.ip()
# ip() คืนสตริงเสมอ ตอนยังไม่มีที่อยู่มันคืน "0.0.0.0"
# ซึ่งเป็นสตริงที่ if ถือว่าจริง — ต้องเทียบตรง ๆ เท่านั้น
if ip == "0.0.0.0":
    note.text("ลิงก์ขึ้นแล้วแต่ยังไม่ได้เลข IP กำลังรอ DHCP")

การเข้าร่วมเครือข่ายกับการได้เลขที่อยู่เป็นคนละขั้น ลิงก์อาจขึ้นแล้วแต่ยังไม่มีใครแจกเลขให้ ช่วงนั้น wifi.ip() คืน "0.0.0.0" ซึ่ง Python ถือว่าจริง เพราะมันไม่ใช่สตริงว่าง เขียน if wifi.ip(): จึงผ่านทั้งที่ยังส่งอะไรออกไม่ได้

นี่คือความล้มเหลวแบบที่ ไม่มี error ให้จับ โปรแกรมเดินผ่านไปตามปกติ แล้วรายงานเลขที่อยู่ปลอมขึ้นจออย่างมั่นใจ

ตาคุณ อยู่ท้ายไฟล์ 01 พิมพ์รหัสผ่านผิดไปหนึ่งตัวแล้วรันใหม่ จับเวลาเทียบกับรอบที่ถูก แล้วตอบว่าทำไมกรณีผิดถึงใช้เวลา มากกว่า ไม่ใช่น้อยกว่า

ความล้มเหลวแพงกว่าความสำเร็จเสมอในงานเครือข่าย เพราะมีการลองใหม่ซ่อนอยู่หลายรอบ — และนั่นคือเหตุผลที่ระบบจริงต้องมีเพดานว่าจะลองกี่ครั้ง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0

ไฟล์ 04 · 04_scan_the_room.py — บอร์ดได้ยินทั้งห้อง

nets = wifi.scan()                       # คืน list ของ (ssid, rssi, security, channel)
...
nets.sort(key=lambda net: net[1], reverse=True)   # เรียงเอง scan() ไม่เรียงให้
...
st = wifi.status()
...
trap.text("status() rssi = " + str(st["rssi"]) + " แต่ของจริง " +
          str(top_rssi) + " dBm")
scan() ไม่ต้องรู้รหัสผ่านใครเลย ได้ชื่อวง ความแรงจริง ช่อง และมีรหัสไหม บล็อกราว 3 ถึง 10 วินาที ย่าน 5 GHz นานกว่า ป้ายกับ ui.poll() จึงต้องมาก่อนบรรทัดนี้อีกครั้ง status() มีสองคีย์ที่เชื่อไม่ได้ ssid = "" rssi = 0 เฟิร์มแวร์ยัดค่าตายตัวไว้ ไม่ใช่ค่าที่วัดมา เอาไปวาดกราฟ จะได้เส้นศูนย์ตลอดกาลโดยไม่มี error

ก่อนจะถามว่า "ต่อไม่ติดเพราะอะไร" ต้องตอบให้ได้ก่อนว่า บอร์ดได้ยินวงนั้นไหม — สองปัญหานี้แก้คนละทางกันสิ้นเชิง "ไม่ได้ยินเลย" ต้องกลับไปดูที่ Hotspot (ย่าน 2.4 GHz และเปิดค้างไว้ ตามข้อ 3–4 ของสไลด์ก่อนเริ่ม) ส่วน "ได้ยินแต่ต่อไม่ผ่าน" คือเรื่องรหัสผ่านของทีมเอง

ไฟล์นี้สร้างป้ายห้าแถวไว้ครบตั้งแต่ต้น ก่อน จะรู้ว่าเจอกี่วง เพราะถ้าไปสร้างข้างในลูป จำนวน widget จะขึ้นกับจำนวนวงที่บังเอิญเจอในห้องนั้น ห้องที่มีวงเกินงบของคอร์ส 32 ตัว (เพดานเฟิร์มแวร์ 64) จะทำให้โปรแกรมตายกลางคัน ทั้งที่โค้ดไม่ได้ผิด

ตาคุณ อยู่ท้ายไฟล์ เดินถือบอร์ดไปสุดห้องแล้วรันซ้ำ จดชื่อวงเดิมกับตัวเลข dBm ทั้งสองจุด แล้วดูว่าอันดับของมันเลื่อนไหม

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0
งานของจอ · ทำทุกรอบ ตอบว่า "ตอนนี้เป็นยังไง" ป้าย IP · วินาทีที่ออนไลน์ · เส้นกราฟ ถาม is_connected() ใหม่ทุกรอบ ไม่เชื่อคำตอบเดิมจากรอบก่อน งานของลิ้นชัก · เฉพาะตอนเปลี่ยน ตอบว่า "ที่ผ่านมาเกิดอะไร" หลุดวินาทีที่เท่าไร กลับมาเมื่อไร ยิงทุกรอบเมื่อไร ได้บรรทัดเดิมสามสิบบรรทัด แล้วคำถาม "หลุดตอนไหน" หาคำตอบไม่เจอ
    up = wifi.is_connected()          # ถามใหม่ทุกรอบ นี่คือทั้งบทเรียนของไฟล์นี้
    now = 1 if up else 0
    ...
    if up:                            # --- งานของจอ ---
        ...
        link_lbl.text("ต่ออยู่")
        ...
        chart.set_next(s_link, 100)
    else:
        link_lbl.text("หลุด")
        ...
        chart.set_next(s_link, 0)
    ...
    if now != last:                   # --- งานของลิ้นชัก ---
        last = now
        ...
            lcd.print("<span class=error>" + str(elapsed // 1000) +
                      " s  ลิงก์หลุด</span>")

ไฟล์นี้ไม่มีคำสั่งใหม่เลยสักตัว โครงเป็นของ 08_status_screen.py เป๊ะ ๆ เปลี่ยนแค่ต้นทางของค่า ของใหม่คือการเอาสี่โมดูลมาต่อกันบนจอใบเดียว ซึ่งเป็นสิ่งที่นักพัฒนามืออาชีพ 80 คนบอกว่าตัวอย่างโค้ดทั่วโลกขาดไปมากที่สุด

last = -1 แปลว่า "ยังไม่เคยรู้สถานะมาก่อน" รอบแรกจึงนับเป็นการเปลี่ยนเสมอ ตั้งต้นเป็น 1 เมื่อไร ประวัติจะไม่มีบรรทัดแรก

ตาคุณ อยู่ท้ายไฟล์ ระหว่างที่โปรแกรมกำลังเฝ้าดู เดินถือบอร์ดออกไปจนสุดห้องแล้วเดินกลับมา แล้วเปิดลิ้นชักดูว่าได้กี่บรรทัด และหลุดตอนวินาทีที่เท่าไร

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (AIC มหาวิทยาลัยบูรพา) · CC BY-NC 4.0