ข้ามไปยังเนื้อหา

ลงมือทำ: พาค่าจริงออกจากบอร์ด และสรุปโมดูล 1

โมดูล 1 — แอปพลิเคชันบนจอที่มีอยู่แล้ว · สไลด์: slides.md · ภาพรวมโมดูล · หน้าหลักสูตร

ปิดชุดบทเรียน 1.4–1.6 ด้วยแล็บของทีม ผ่าน MVP checkpoint จากไฟล์ตัวอย่างทั้งชุด เติมสมุดบันทึกผลการทดลอง s02_ai_observer.py ด้วยค่าที่ทีมวัดเอง แล้วสรุปว่าโมดูล 1 วางรากอะไรไว้ให้โมดูลถัดไป

เมื่อจบบทเรียนนี้ คุณจะ:

  1. ผ่าน MVP checkpoint ของชุดบทเรียน คือบอร์ดของทีมขึ้นเลข IP ที่ไม่ใช่ 0.0.0.0 ด้วย wifi.connect() และติ๊กครบทุกข้อในรายการตรวจ (01 04 02 05 06 03) พร้อมรูปหน้าจอบอร์ดในบันทึกการเรียน
  2. เติมช่องว่างหกจุดใน s02_ai_observer.py ด้วยผลการทดลองสามแถวที่ทีมวัดเองบนบอร์ด จนลิ้นชัก Console ขึ้นครบทุกแถว มาตรวัดเวลาต่อเฉลี่ยขยับจากศูนย์ และแผงขวาติดดวง “ต่ออยู่” พร้อมเลข IP
  3. ระบุสาเหตุที่แท้จริงและวิธีแก้จากอาการในตารางกับดักที่เจอบ่อยได้ และแยกได้ว่าอาการไหนไม่มี error ให้จับเลย
  4. อธิบายหลักออกแบบสี่ข้อที่ชุดบทเรียนนี้ใช้ (บอกได้ว่าล้มที่ขั้นไหน · ไม่เชื่อข้อมูลที่คนอื่นส่งมา · รอหลักฐานหลายรอบก่อนรายงาน · ใช้ข้อมูลที่บันทึกไว้เป็นชุดทดสอบ) พร้อมชี้ไฟล์ที่ใช้แต่ละข้อ

เปิดบันทึกการเรียนที่มีผลจากบทเรียน 1.4 และ 1.5: เลข IP ของบอร์ด เวลาที่ connect() ใช้ทั้งรหัสถูกและรหัสผิด ตัวเลข dBm จาก 04 และผลของ 03 บอร์ดต่อ Hotspot มือถือของทีมได้แล้ว หน้าเว็บ my_first_reader.html ของทีมเปิดค้างไว้ และบนจอบอร์ดแตะการ์ด BENTO Playground เปิดค้างไว้ก่อนส่งโค้ด ทีมละหนึ่งบอร์ด สลับกันเป็นคนพิมพ์ คนที่ไม่ได้พิมพ์รับหน้าที่จับเวลาและจดตัวเลข

บทเรียนนี้ไม่มีคำสั่งใหม่ งานของทีมคือไฟล์ตัวอย่างของบทเรียน 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

สไลด์ของบทเรียนนี้อ้างถึงไฟล์ที่อยู่ในบทเรียนอื่นด้วย:

เปิด 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 สำหรับระบบที่ตรวจอัตโนมัติ

  1. เน็ตขององค์กรกันพอร์ตไว้ทั้งห้อง ทีมรันไฟล์ 05 แล้วขั้นที่ 2 เป็นแดง ข้อ 05 ของ MVP ถือว่าผ่านได้อย่างไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 1)

    • ก) ทีมชี้จากจอได้ว่าสายขาดที่ขั้นไหนและเพราะอะไร
    • ข) ต้องรอจนกว่าเน็ตจะเปิด ไม่มีทางผ่านอื่น
    • ค) แก้โค้ดให้ขั้นที่ 2 ข้ามไปขั้นที่ 3 เลย
    • ง) เปลี่ยน TEAM เป็นของทีมข้าง ๆ ที่ส่งผ่านแล้ว
    เฉลย

    ก — ข้อ 05 ผ่านเมื่อเห็นค่าของทีมบนหน้าเว็บ หรือถ้าเน็ตกันพอร์ตไว้ทั้งห้อง ทีมอ่านจากจอได้ว่าสายขาดที่ขั้นไหน โปรแกรมที่ล้มเหลวแล้วบอกได้ว่าล้มที่ไหนก็คือผลที่ใช้ได้

  2. รัน s02_ai_observer.py แล้วตารางขึ้นครบสามแถว แต่มาตรวัดเวลาต่อเฉลี่ยนิ่งอยู่ที่ศูนย์ แปลว่าอะไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)

    • ก) บอร์ดต่อ WiFi ไม่ติด
    • ข) ยังไม่ได้เติมบรรทัด avg_ms = total_ms // len(TRIALS) ค่าจึงยังเป็น 0 ที่ตั้งไว้ก่อน
    • ค) ui.Bar รับค่าเกิน 1000 ไม่ได้
    • ง) ตาราง TRIALS ต้องมีอย่างน้อยห้าแถว
    เฉลย

    ข — ไฟล์ตั้ง avg_ms = 0 ไว้ก่อนเพื่อให้รันได้แม้ยังไม่เติม มาตรวัดขยับครั้งเดียวหลังคำนวณ ถ้านิ่งที่ศูนย์ นั่นคือคำตอบว่ายังเติมไม่ครบ

  3. อาการใดในตารางกับดักที่ ไม่มี error ให้จับ โปรแกรมเดินต่อเงียบ ๆ เลือกทุกข้อที่ถูก (เลือกได้หลายข้อ · เป้าหมายข้อ 3)

    • ก) กราฟความแรงสัญญาณเป็นเส้นศูนย์ตลอด เพราะหยิบ wifi.status()[“rssi”] มาใช้
    • ข) โค้ดบอกว่าได้ IP แล้วแต่ส่งอะไรก็ไม่ออก เพราะเขียน if wifi.ip()
    • ค) mqtt.connect() ใส่ user= แทน username=
    • ง) ยิงคำสั่งมาสามใบแต่บอร์ดนับได้ใบเดียว
    เฉลย

    ก, ข, ง — status() คืน rssi เป็นค่าตายตัว “0.0.0.0” เป็นสตริงที่ถือว่าจริง และกล่องรับมีช่องเดียวทับกันเอง ทั้งสามไม่มี error เลย ส่วน user= ได้ TypeError ทันที

  4. บอร์ดรันไฟล์ 05 ส่งครบทุกใบ แต่หน้าเว็บของทีมว่างเปล่า ควรแก้อย่างไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 3)

    • ก) เปลี่ยน broker เป็น broker.mqttdashboard.com
    • ข) ตรวจ TEAM ในหน้าเว็บกับในไฟล์ให้ตรงกัน แล้วรันไฟล์ 05 ใหม่ขณะหน้าเว็บเปิดอยู่
    • ค) ให้หน้าเว็บ subscribe ทุกหัวข้อด้วยเครื่องหมาย # จะได้ไม่พลาด
    • ง) รอสักพัก broker จะส่งใบที่เก็บไว้มาให้เอง
    เฉลย

    ข — สาเหตุคือ TEAM สองที่ไม่ตรงกัน หรือเปิดหน้าเว็บหลังบอร์ดส่งจบ เฟิร์มแวร์ส่งแบบ retain ไม่ได้ broker จึงไม่เก็บใบล่าสุดไว้ให้ใคร

  5. เทปผลตรวจ 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 ของทีม ค่าไหนที่คุณเชื่อน้อยที่สุด และหน้าจอบอกคนดูแล้วหรือยังว่ามันมาจากไหน

คำถามทบทวน

ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย

  1. เน็ตขององค์กรกันพอร์ตไว้ทั้งห้อง ทีมรันไฟล์ 05 แล้วขั้นที่ 2 เป็นแดง ข้อ 05 ของ MVP ถือว่าผ่านได้อย่างไร (เป้าหมายข้อ 1)

    1. ทีมชี้จากจอได้ว่าสายขาดที่ขั้นไหนและเพราะอะไร
    2. ต้องรอจนกว่าเน็ตจะเปิด ไม่มีทางผ่านอื่น
    3. แก้โค้ดให้ขั้นที่ 2 ข้ามไปขั้นที่ 3 เลย
    4. เปลี่ยน TEAM เป็นของทีมข้าง ๆ ที่ส่งผ่านแล้ว
    ดูเฉลย

    คำตอบ: A. ทีมชี้จากจอได้ว่าสายขาดที่ขั้นไหนและเพราะอะไร

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

  2. รัน s02_ai_observer.py แล้วตารางขึ้นครบสามแถว แต่มาตรวัดเวลาต่อเฉลี่ยนิ่งอยู่ที่ศูนย์ แปลว่าอะไร (เป้าหมายข้อ 2)

    1. บอร์ดต่อ WiFi ไม่ติด
    2. ยังไม่ได้เติมบรรทัด avg_ms = total_ms // len(TRIALS) ค่าจึงยังเป็น 0 ที่ตั้งไว้ก่อน
    3. ui.Bar รับค่าเกิน 1000 ไม่ได้
    4. ตาราง TRIALS ต้องมีอย่างน้อยห้าแถว
    ดูเฉลย

    คำตอบ: B. ยังไม่ได้เติมบรรทัด avg_ms = total_ms // len(TRIALS) ค่าจึงยังเป็น 0 ที่ตั้งไว้ก่อน

    ไฟล์ตั้ง avg_ms = 0 ไว้ก่อนเพื่อให้รันได้แม้ยังไม่เติม มาตรวัดขยับครั้งเดียวหลังคำนวณ ถ้านิ่งที่ศูนย์ นั่นคือคำตอบว่ายังเติมไม่ครบ

  3. อาการใดในตารางกับดักที่ **ไม่มี error ให้จับ** โปรแกรมเดินต่อเงียบ ๆ เลือกทุกข้อที่ถูก (เป้าหมายข้อ 3)

    1. กราฟความแรงสัญญาณเป็นเส้นศูนย์ตลอด เพราะหยิบ wifi.status()["rssi"] มาใช้
    2. โค้ดบอกว่าได้ IP แล้วแต่ส่งอะไรก็ไม่ออก เพราะเขียน if wifi.ip()
    3. mqtt.connect() ใส่ user= แทน username=
    4. ยิงคำสั่งมาสามใบแต่บอร์ดนับได้ใบเดียว
    ดูเฉลย

    คำตอบ: A. กราฟความแรงสัญญาณเป็นเส้นศูนย์ตลอด เพราะหยิบ wifi.status()["rssi"] มาใช้ · B. โค้ดบอกว่าได้ IP แล้วแต่ส่งอะไรก็ไม่ออก เพราะเขียน if wifi.ip() · D. ยิงคำสั่งมาสามใบแต่บอร์ดนับได้ใบเดียว

    status() คืน rssi เป็นค่าตายตัว "0.0.0.0" เป็นสตริงที่ถือว่าจริง และกล่องรับมีช่องเดียวทับกันเอง ทั้งสามไม่มี error เลย ส่วน user= ได้ TypeError ทันที

  4. บอร์ดรันไฟล์ 05 ส่งครบทุกใบ แต่หน้าเว็บของทีมว่างเปล่า ควรแก้อย่างไร (เป้าหมายข้อ 3)

    1. เปลี่ยน broker เป็น broker.mqttdashboard.com
    2. ตรวจ TEAM ในหน้าเว็บกับในไฟล์ให้ตรงกัน แล้วรันไฟล์ 05 ใหม่ขณะหน้าเว็บเปิดอยู่
    3. ให้หน้าเว็บ subscribe ทุกหัวข้อด้วยเครื่องหมาย # จะได้ไม่พลาด
    4. รอสักพัก broker จะส่งใบที่เก็บไว้มาให้เอง
    ดูเฉลย

    คำตอบ: B. ตรวจ TEAM ในหน้าเว็บกับในไฟล์ให้ตรงกัน แล้วรันไฟล์ 05 ใหม่ขณะหน้าเว็บเปิดอยู่

    สาเหตุคือ TEAM สองที่ไม่ตรงกัน หรือเปิดหน้าเว็บหลังบอร์ดส่งจบ เฟิร์มแวร์ส่งแบบ retain ไม่ได้ broker จึงไม่เก็บใบล่าสุดไว้ให้ใคร

  5. เทปผลตรวจ 24 รอบใน 03_your_link_rule.py เป็นตัวอย่างของหลักออกแบบข้อใด (เป้าหมายข้อ 4)

    1. ใช้ข้อมูลที่บันทึกไว้เป็นชุดทดสอบ แทนการหวังพึ่งสภาพจริงที่ควบคุมไม่ได้
    2. ไม่เชื่อข้อมูลที่คนอื่นส่งมา
    3. บอกให้ได้ว่าล้มที่ขั้นไหนของบันไดสามขั้น
    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 ฉบับเต็ม

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA