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

เปิดกล่อง: สองคอร์ งาน AIoT และป้ายของทีม

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

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

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

  1. รันไฟล์ 10 ถึง 15 แล้วบอกได้ว่าแต่ละไฟล์เปิดโมดูลใด (gpio machine sensors dsp mic ui) และตอบคำถาม “ของนี้เอาไปทำอะไรได้ในงานของคุณ” ลงบันทึกการเรียนได้อย่างน้อยสามไฟล์
  2. อธิบายได้ว่าโค้ด Python ของเราอยู่บนคอร์ CM33 และต้องฝากข้อความข้าม IPC ให้ CM55 วาดจอ และบอกได้ว่าทำไม sensors.init() ถูกปฏิเสธบน Eva Kit แต่ sensors.snapshot() ใช้ได้ทั้งสองบอร์ด
  3. อธิบายความต่างของ IoT กับ AIoT ด้วยตัวอย่างเครื่องจักรที่สั่นผิดปกติ ว่าการตัดสินใจเกิดที่ไหนและอะไรถูกส่งขึ้นคลาวด์
  4. เติมช่องว่างเจ็ดจุดใน s01_hello_lcd.py ทีละจุดจนลิ้นชัก Console ขึ้นหัวเรื่อง h2 ชื่อทีม รายชื่อสมาชิกทีละคน และบรรทัดสีเขียวปิดท้าย โดยไม่มีการเรียก lcd.print() ครั้งไหนเกิน 127 ไบต์

เตรียมบันทึกการเรียนที่มีตารางเมนูจากบทเรียน 1.1 และ 09_your_level_rule.py จากบทเรียน 1.2 (ต้องผ่านครบหกแถวเพื่อผ่านชุดบทเรียนนี้) ทบทวนสามเรื่องจากบทเรียน 1.2 ก่อน: ui.poll() หลังสร้าง widget · เพดาน 127 ไบต์ของ lcd.print() · ห้าคลาสของ span แล้วแตะการ์ด BENTO Playground บนจอบอร์ดเปิดค้างไว้

รัน 12_every_sense_at_once.py แล้วเล่นกับบอร์ด: เอียงบอร์ดดูตัวเลข az แตะแผ่นสัมผัสดูการ์ดกลาง หมุนลูกบิดดูวงแหวนขวา บรรทัดล่างสุดคือตัวนับรอบ ถ้ามันเดินขึ้น แปลว่าค่าที่เห็นสดจริง ทั้งหมดนี้มาจากคำสั่งเดียวคือ sensors.snapshot() ซึ่งคืน dict ก้อนเดียวที่มี bmi270 capsense และ pot อ่านจากเวลาเดียวกัน

เก้าไฟล์ในบทเรียน 1.2 ใช้แค่ lcd time ui ซึ่งเป็นสามในสิบเอ็ดโมดูลของบอร์ด หกไฟล์ในบทเรียนนี้ไม่ได้ให้พิมพ์ตาม แต่ให้ รันแล้วดู ไฟล์ละไม่เกินห้านาที เป้าหมายคือรู้ว่ากล่องนี้มีอะไร ไม่ใช่จำทุกฟังก์ชัน ตัวเลขที่ต่างกันระหว่างสองบอร์ด ให้ถามบอร์ดด้วยโค้ดเสมอ เช่น gpio.num_leds() (Eva Kit 3 ดวง · Dev Kit 5 ดวง) และชื่อปุ่มจาก gpio.button(0).name() ส่วนโค้ดจากอินเทอร์เน็ตที่ขึ้นต้นด้วย machine.PWM หรือ machine.ADC จะได้ AttributeError ทันที เพราะพอร์ตนี้ไม่มีทั้งคู่

ในชิปตัวเดียวมีสองคอร์ที่ทำงานคนละแบบ โค้ด Python ของเราอยู่ฝั่ง CM33 เสมอ ส่วน CM55 วาดจอ อยากให้อะไรขึ้นจอ ต้องฝากข้อความข้ามกล่องจดหมาย IPC ไปให้ CM55 และ ui.poll() คือจังหวะที่เราเปิดกล่องให้อีกฝั่งหยิบของไป เรื่องเซนเซอร์สองบอร์ดต่างกัน: บน Eva Kit CM55 เป็นเจ้าของบัสเซนเซอร์ทั้งหมด sensors.init() จึงถูกปฏิเสธ เพื่อไม่ให้ Python ไปแย่งบัสจนบอร์ดค้าง บน Dev Kit CM33 อ่าน IMU กับเข็มทิศเองได้ sensors.init() จึงทำงาน ส่วน sensors.snapshot() ซ่อนความต่างนี้ให้ และคืน dict รูปเดียวกันทั้งสองบอร์ด

IoT คืออุปกรณ์ที่มีเซนเซอร์และต่อเน็ต ส่งข้อมูลขึ้นระบบกลาง AIoT คือการย้าย การตัดสินใจ ลงมาไว้ที่ตัวอุปกรณ์ เครื่องจักรที่สั่นผิดปกติเป็นตัวอย่างที่ชัด: แบบ IoT ส่งค่าความสั่นทุกวินาทีให้คลาวด์ตัดสิน ซึ่งเปลืองเน็ต ช้า และตาบอดเมื่อเน็ตหลุด แบบ AIoT บอร์ดตัดสินเองที่หน้างานภายในเสี้ยววินาที แล้วส่งขึ้นคลาวด์เฉพาะตอนผิดปกติ ไฟล์ 08 กับ 09 ในบทเรียน 1.2 ก็มีรูปร่างนี้อยู่แล้ว คือวัดค่า ตัดระดับ แล้วรายงาน

ไฟล์ฝึกเรียงงานเป็นห้าท่าจากง่ายไปยาก และให้แต่ละท่ายืนยันท่าก่อนหน้า: ล้างจอกับหัวเรื่องพิสูจน์ว่าช่องทางถึงจอใช้ได้ · ข้อความคงที่แยกได้ว่าปัญหาอยู่ที่ lcd หรือที่ตรรกะ · ลูปรายชื่อ · สถานะปิดท้ายบอกว่าจบแบบสำเร็จ · ป้ายทีมด้วย ui เป็นของที่เหลือไว้ให้คนเดินผ่านอ่านหลังโปรแกรมจบ ข้อมูลชุดเดียวกันไปได้สองที่ คือลิ้นชักกับหน้าจอ

เปิดทีละไฟล์ รันแล้วดูไม่เกินห้านาที แล้วถามคำถามเดียว: “ของนี้เอาไปทำอะไรได้ในงานของคุณ” คำตอบคือวัตถุดิบของโปรเจกต์จบในบทเรียน 5.1–5.3 ถ้าเวลาไม่พอ สองไฟล์ที่ต้องได้เล่นคือ 12 (บอร์ดรับรู้โลกได้กี่ทาง) กับ 15 (เลขตัวเดียวเล่าเรื่องได้กี่แบบ) จุดที่ควรสังเกต: 10 ตารางซ้ายขวาของสิ่งที่ machine มีและไม่มี · 11 brightness() ค้างระดับได้เฉพาะดวง RGB ส่วนดวงอื่นใช้ hold(pct, ms) · 12 ท้ายไฟล์ลองเรียก sensors.init() แล้วพิมพ์คำตอบของบอร์ดตรงหน้า · 13 เส้นเทาดิบ เขียว EMA ส้ม Median บนกราฟใบเดียว (Chart รับเฉพาะจำนวนเต็ม) · 14 ตัวเลข “คิวค้าง” ของไมค์ · 15 บรรทัด ui.list() บอกว่าจอมี widget กี่ตัว และ seg.value(50) ได้ 50 ไม่ใช่ 50.0

ไฟล์ ไฟล์นี้สอน
examples/10_board_knows_itself.py ถามบอร์ดว่าตัวเองมีอะไร แทนที่จะเปิดคู่มือหา
examples/11_lights_and_a_button.py หลอดไฟกับปุ่มจริง สั่งได้จาก Python บรรทัดเดียว
examples/12_every_sense_at_once.py คำสั่งเดียว ได้ทุกเซนเซอร์พร้อมกัน
examples/13_raw_and_filtered.py เส้นดิบที่สั่น กับเส้นเดียวกันที่นิ่ง อยู่บนกราฟใบเดียว
examples/14_the_board_hears_you.py พูดใส่บอร์ด แล้วดูมันขยับตาม
examples/15_one_number_many_faces.py ตัวเลขตัวเดียว กับสิบวิธีที่จอเล่ามันออกมา

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

ภาพจอจาก BENTO Emulator ของตัวอย่างในบทนี้ (คลิกชื่อไฟล์เพื่อเปิดโค้ด)

จอของ examples/10_board_knows_itself.py ขณะรันใน BENTO Emulator: ถามบอร์ดว่าตัวเองมีอะไร แทนที่จะเปิดคู่มือหา
10_board_knows_itself.py ถามบอร์ดว่าตัวเองมีอะไร แทนที่จะเปิดคู่มือหา
จอของ examples/11_lights_and_a_button.py ขณะรันใน BENTO Emulator: หลอดไฟกับปุ่มจริง สั่งได้จาก Python บรรทัดเดียว
11_lights_and_a_button.py หลอดไฟกับปุ่มจริง สั่งได้จาก Python บรรทัดเดียว
จอของ examples/12_every_sense_at_once.py ขณะรันใน BENTO Emulator: คำสั่งเดียว ได้ทุกเซนเซอร์พร้อมกัน
12_every_sense_at_once.py คำสั่งเดียว ได้ทุกเซนเซอร์พร้อมกัน
จอของ examples/13_raw_and_filtered.py ขณะรันใน BENTO Emulator: เส้นดิบที่สั่น กับเส้นเดียวกันที่นิ่ง อยู่บนกราฟใบเดียว
13_raw_and_filtered.py เส้นดิบที่สั่น กับเส้นเดียวกันที่นิ่ง อยู่บนกราฟใบเดียว
จอของ examples/14_the_board_hears_you.py ขณะรันใน BENTO Emulator: พูดใส่บอร์ด แล้วดูมันขยับตาม
14_the_board_hears_you.py พูดใส่บอร์ด แล้วดูมันขยับตาม
จอของ examples/15_one_number_many_faces.py ขณะรันใน BENTO Emulator: ตัวเลขตัวเดียว กับสิบวิธีที่จอเล่ามันออกมา
15_one_number_many_faces.py ตัวเลขตัวเดียว กับสิบวิธีที่จอเล่ามันออกมา

เปิด practice/s01_hello_lcd.py แล้วทำสามขั้น: หนึ่ง แก้ข้อมูลทีมสามบรรทัดบนสุด (TEAM_NAME MEMBERS MOTTO) สอง เติมช่องว่างเจ็ดจุดตามคำใบ้ # เติม: ทีละจุด แล้วส่งขึ้นบอร์ดทุกครั้ง อย่าเติมครบแล้วรันทีเดียว สาม ครบแล้วลองเพิ่มบรรทัดของตัวเอง ท่าที่ 1–4 ลงลิ้นชัก Console ส่วนท่าที่ 5 เขียนมาให้ครบแล้ว มันวางป้ายทีม ตาราง ไฟสองดวง และมาตรวัดไบต์ลงหน้า Playground ให้อ่านให้จบก่อนรัน ทำเสร็จเมื่อเปิดลิ้นชักแล้วเห็นหัวเรื่อง คำทักทาย ชื่อสมาชิกขึ้นทีละคนห่างกันราว 800 ms และบรรทัดสีเขียวสองบรรทัด ส่วนหน้าจอมีตารางรายชื่อ ไฟ “กำลังเขียน” หรี่ลงและไฟ “เขียนครบแล้ว” ติด

ไฟล์ฝึก เรื่อง
practice/s01_hello_lcd.py ข้อความแรกของทีม ขึ้นจอบอร์ด (ฉบับฝึกเติมโค้ด)

เปิดเฉลยหลังจากลองเองแล้วอย่างน้อยหนึ่งรอบ แล้วอ่าน วิธีใช้เฉลย ก่อน

เฉลย คู่กับ
solution/s01_hello_lcd.py practice/s01_hello_lcd.py

คำถามชุดเดียวกันอยู่ใน quiz.yaml สำหรับระบบที่ตรวจอัตโนมัติ

  1. คุณอยากให้หลอด LED ทุกดวงวิ่งไล่กัน โดยใช้โค้ดชุดเดียวบนทั้ง Eva Kit และ Dev Kit ควรเขียนลูปแบบไหน (เลือกหนึ่งข้อ · เป้าหมายข้อ 1)

    • ก) วนด้วย range(gpio.num_leds()) ให้บอร์ดบอกเองว่ามีกี่ดวง
    • ข) วนด้วย range(3) เพราะ Eva Kit มีสามดวง
    • ค) วนด้วย range(5) เพราะ Dev Kit มีมากที่สุด
    • ง) เปิดคู่มือบอร์ดแล้วเขียนตัวเลขแยกไฟล์ละบอร์ด
    เฉลย

    ก — จำนวน LED ต่างกันระหว่างสองบอร์ด (Eva 3 · Dev Kit 5) สไลด์ย้ำให้ถามบอร์ดด้วยโค้ดเสมอ ไม่ต้องจำเลข โค้ดชุดเดียวจึงวิ่งครบทุกดวงบนบอร์ดใบไหนก็ได้

  2. บน Eva Kit การเรียก sensors.init() ได้ OSError ข้อใดอธิบายถูกต้อง (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)

    • ก) บน Eva Kit คอร์ CM55 เป็นเจ้าของบัสเซนเซอร์ การปฏิเสธนี้กันไม่ให้ Python ไปแย่งบัส ให้ใช้ sensors.snapshot() แทน
    • ข) เซนเซอร์บนบอร์ดเสีย ต้องส่งซ่อม
    • ค) ลืม import sensors ก่อนเรียก
    • ง) Eva Kit ไม่มีเซนเซอร์ IMU
    เฉลย

    ก — โค้ด Python อยู่ฝั่ง CM33 บน Eva Kit เซนเซอร์ทั้งหมดอยู่ใต้ CM55 จึงต้องขอค่าผ่าน IPC ส่วน Dev Kit ยอมให้เรียก init() ได้ แต่ snapshot() คืน dict รูปเดียวกันทั้งสองบอร์ด

  3. เครื่องจักรตัวหนึ่งสั่นผิดปกติ ระบบแบบ AIoT ต่างจากแบบ IoT อย่างไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 3)

    • ก) บอร์ดตัดสินเองที่หน้างานภายในเสี้ยววินาที ส่งขึ้นคลาวด์เฉพาะตอนผิดปกติ และยังทำงานได้เมื่อเน็ตหลุด
    • ข) บอร์ดส่งค่าความสั่นทุกวินาทีขึ้นคลาวด์ให้คลาวด์ตัดสิน
    • ค) AIoT ไม่ต้องใช้เซนเซอร์ เพราะคลาวด์เดาได้เอง
    • ง) AIoT คือ IoT ที่ใช้ WiFi เร็วกว่า
    เฉลย

    ก — หัวใจของ AIoT คือย้ายการตัดสินใจลงมาใกล้จุดเกิดเหตุ แล้วส่งขึ้นคลาวด์เฉพาะสิ่งที่มีความหมาย แบบ IoT ที่ส่งทุกวินาทีเปลืองเน็ต ช้า และตาบอดเมื่อเน็ตหลุด

  4. ในท่าที่ 3 ของ s01_hello_lcd.py ถ้าย้าย time.sleep_ms(800) ออกไปไว้นอกลูป (ลดการเยื้องบรรทัด) จะเห็นอะไรบนจอ (เลือกหนึ่งข้อ · เป้าหมายข้อ 4)

    • ก) ชื่อทุกคนขึ้นพร้อมกัน แล้วค่อยหน่วงครั้งเดียว
    • ข) ชื่อขึ้นทีละคนเหมือนเดิม
    • ค) ได้ SyntaxError
    • ง) ขึ้นเฉพาะชื่อคนสุดท้าย
    เฉลย

    ก — ใน Python การเยื้องบรรทัดคือความหมาย การหน่วงที่อยู่ในลูปทำให้ชื่อขึ้นทีละคน ย้ายออกไปนอกลูปมันจะทำงานครั้งเดียวหลังพิมพ์ครบทุกชื่อ

  5. ทำไมบรรทัดปิดท้ายสีเขียวในไฟล์ฝึกจึงแยกเป็นการเรียก lcd.print() สองครั้ง (เลือกหนึ่งข้อ · เป้าหมายข้อ 4)

    • ก) ถ้ารวมกันแล้วชื่อทีมยาว อาจเกิน 127 ไบต์ ซึ่งจะถูกตัดเงียบ ๆ และ \n หายไปด้วย
    • ข) lcd.print() ใส่แท็ก span ได้แค่หนึ่งครั้งต่อโปรแกรม
    • ค) เพื่อให้สองบรรทัดเป็นคนละสี
    • ง) เพราะ lcd.print() ต่อสตริงด้วย + ไม่ได้
    เฉลย

    ก — ไทยตัวละ 3 ไบต์ บรรทัดที่ดูสั้นจึงกินโควตาเร็ว การแยกตั้งแต่ต้นกันไม่ให้ท้ายข้อความหายโดยไม่มี error และท่าที่ 5 ของไฟล์ก็วัดความยาวของ TAIL ให้เห็นบนมาตรวัดไบต์

MVP checkpoint ของชุดบทเรียน 1.1–1.3 ทีมสาธิตการใช้ห้าเมนูพร้อมอธิบายว่าเมนูใดใช้เซนเซอร์ใด และรัน lcd.print() ข้อความของทีมขึ้นจอสำเร็จ

  • เล่นครบห้าเมนู: Home, Sensor Dashboard, Smart Watch, Wi-Fi Setting, BENTO Playground (Controls มีเฉพาะ Eva Kit จึงไม่อยู่ในเกณฑ์)
  • ตารางสำรวจเมนูในบันทึกการเรียนกรอกครบห้าแถวแรก (แถว Controls กรอกเฉพาะทีมที่ถือ Eva Kit)
  • ชี้ได้ว่าเมนูไหนใช้เซนเซอร์ตัวไหน ตอบปากเปล่าได้
  • จอบอร์ดขึ้นหัวเรื่อง <h2> ของชุดบทเรียนนี้
  • จอบอร์ดขึ้นชื่อทีมและชื่อสมาชิกครบทุกคน ไล่ทีละคน
  • จอบอร์ดขึ้นบรรทัดสีเขียวปิดท้าย
  • 09_your_level_rule.py จากบทเรียน 1.2 ผ่านครบหกแถว
  • ถ่ายรูปหน้าจอบอร์ดแนบในบันทึกการเรียน

ชุดบทเรียน 1.4–1.6 พาบอร์ดออกอินเทอร์เน็ตด้วยโค้ดของเราเอง แล้วส่งตัวเลขจาก sensors.snapshot() ออกไปที่ broker สาธารณะ broker.hivemq.com ให้หน้าเว็บ my_first_reader.html บนโน้ตบุ๊กอ่านกลับมา จดชื่อทีม (team01 ถึง team19) ที่ผู้สอนแจกลงบันทึกการเรียนไว้ ถ้าอยากทำต่อ สไลด์มีสี่ข้อให้เลือกหนึ่ง: จอต้อนรับของทีม · นับถอยหลังจาก 05_clear_and_refresh.py · สำรวจกับดัก 127 ไบต์ · แผนที่เมนู

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

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

คำถามทบทวน

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

  1. คุณอยากให้หลอด LED ทุกดวงวิ่งไล่กัน โดยใช้โค้ดชุดเดียวบนทั้ง Eva Kit และ Dev Kit ควรเขียนลูปแบบไหน (เป้าหมายข้อ 1)

    1. วนด้วย range(gpio.num_leds()) ให้บอร์ดบอกเองว่ามีกี่ดวง
    2. วนด้วย range(3) เพราะ Eva Kit มีสามดวง
    3. วนด้วย range(5) เพราะ Dev Kit มีมากที่สุด
    4. เปิดคู่มือบอร์ดแล้วเขียนตัวเลขแยกไฟล์ละบอร์ด
    ดูเฉลย

    คำตอบ: A. วนด้วย range(gpio.num_leds()) ให้บอร์ดบอกเองว่ามีกี่ดวง

    จำนวน LED ต่างกันระหว่างสองบอร์ด (Eva 3 · Dev Kit 5) สไลด์ย้ำให้ถามบอร์ดด้วยโค้ดเสมอ ไม่ต้องจำเลข โค้ดชุดเดียวจึงวิ่งครบทุกดวงบนบอร์ดใบไหนก็ได้

  2. บน Eva Kit การเรียก sensors.init() ได้ OSError ข้อใดอธิบายถูกต้อง (เป้าหมายข้อ 2)

    1. บน Eva Kit คอร์ CM55 เป็นเจ้าของบัสเซนเซอร์ การปฏิเสธนี้กันไม่ให้ Python ไปแย่งบัส ให้ใช้ sensors.snapshot() แทน
    2. เซนเซอร์บนบอร์ดเสีย ต้องส่งซ่อม
    3. ลืม import sensors ก่อนเรียก
    4. Eva Kit ไม่มีเซนเซอร์ IMU
    ดูเฉลย

    คำตอบ: A. บน Eva Kit คอร์ CM55 เป็นเจ้าของบัสเซนเซอร์ การปฏิเสธนี้กันไม่ให้ Python ไปแย่งบัส ให้ใช้ sensors.snapshot() แทน

    โค้ด Python อยู่ฝั่ง CM33 บน Eva Kit เซนเซอร์ทั้งหมดอยู่ใต้ CM55 จึงต้องขอค่าผ่าน IPC ส่วน Dev Kit ยอมให้เรียก init() ได้ แต่ snapshot() คืน dict รูปเดียวกันทั้งสองบอร์ด

  3. เครื่องจักรตัวหนึ่งสั่นผิดปกติ ระบบแบบ AIoT ต่างจากแบบ IoT อย่างไร (เป้าหมายข้อ 3)

    1. บอร์ดตัดสินเองที่หน้างานภายในเสี้ยววินาที ส่งขึ้นคลาวด์เฉพาะตอนผิดปกติ และยังทำงานได้เมื่อเน็ตหลุด
    2. บอร์ดส่งค่าความสั่นทุกวินาทีขึ้นคลาวด์ให้คลาวด์ตัดสิน
    3. AIoT ไม่ต้องใช้เซนเซอร์ เพราะคลาวด์เดาได้เอง
    4. AIoT คือ IoT ที่ใช้ WiFi เร็วกว่า
    ดูเฉลย

    คำตอบ: A. บอร์ดตัดสินเองที่หน้างานภายในเสี้ยววินาที ส่งขึ้นคลาวด์เฉพาะตอนผิดปกติ และยังทำงานได้เมื่อเน็ตหลุด

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

  4. ในท่าที่ 3 ของ s01_hello_lcd.py ถ้าย้าย time.sleep_ms(800) ออกไปไว้นอกลูป (ลดการเยื้องบรรทัด) จะเห็นอะไรบนจอ (เป้าหมายข้อ 4)

    1. ชื่อทุกคนขึ้นพร้อมกัน แล้วค่อยหน่วงครั้งเดียว
    2. ชื่อขึ้นทีละคนเหมือนเดิม
    3. ได้ SyntaxError
    4. ขึ้นเฉพาะชื่อคนสุดท้าย
    ดูเฉลย

    คำตอบ: A. ชื่อทุกคนขึ้นพร้อมกัน แล้วค่อยหน่วงครั้งเดียว

    ใน Python การเยื้องบรรทัดคือความหมาย การหน่วงที่อยู่ในลูปทำให้ชื่อขึ้นทีละคน ย้ายออกไปนอกลูปมันจะทำงานครั้งเดียวหลังพิมพ์ครบทุกชื่อ

  5. ทำไมบรรทัดปิดท้ายสีเขียวในไฟล์ฝึกจึงแยกเป็นการเรียก lcd.print() สองครั้ง (เป้าหมายข้อ 4)

    1. ถ้ารวมกันแล้วชื่อทีมยาว อาจเกิน 127 ไบต์ ซึ่งจะถูกตัดเงียบ ๆ และ \n หายไปด้วย
    2. lcd.print() ใส่แท็ก span ได้แค่หนึ่งครั้งต่อโปรแกรม
    3. เพื่อให้สองบรรทัดเป็นคนละสี
    4. เพราะ lcd.print() ต่อสตริงด้วย + ไม่ได้
    ดูเฉลย

    คำตอบ: A. ถ้ารวมกันแล้วชื่อทีมยาว อาจเกิน 127 ไบต์ ซึ่งจะถูกตัดเงียบ ๆ และ \n หายไปด้วย

    ไทยตัวละ 3 ไบต์ บรรทัดที่ดูสั้นจึงกินโควตาเร็ว การแยกตั้งแต่ต้นกันไม่ให้ท้ายข้อความหายโดยไม่มี error และท่าที่ 5 ของไฟล์ก็วัดความยาวของ TAIL ให้เห็นบนมาตรวัดไบต์

อ้างอิงบทเรียนนี้

ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน

"เปิดกล่อง: สองคอร์ งาน AIoT และป้ายของทีม" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0

ข้อความอ้างอิงภาษาอังกฤษ: "Inside the box: two cores, AIoT and your team's screen" 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/l03-inside-the-box/

บทเรียนนี้ดัดแปลงจากต้นฉบับด้านล่าง เมื่ออ้างอิงให้คงเครดิตต้นฉบับไว้ด้วย
https://github.com/Advance-Innovation-Centre-AIC/embedded-systems-for-aiot-developer/blob/a80bbe88a34bcb9bb8d991f42f9252b77cdab079/session-01.html (slides 23–51)

วิธีอ้างอิง TESA ฉบับเต็ม

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

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