โปรแกรมแรก: เขียนบนจอและเปิดไฟ
เป้าหมาย
หัวข้อที่มีชื่อว่า “เป้าหมาย”- วางป้ายข้อความบนจอด้วย
ui.Labelและพิมพ์ลงลิ้นชัก Console ด้วยlcd.printแล้วรันผ่าน - สั่งหลอด LED กะพริบด้วย
gpio.led(n).on()/off()และtime.sleep_ms()ให้ครบจำนวนรอบ - ทำนายผลก่อนรัน และอธิบายได้ว่าทำไมโปรแกรมควรจบด้วย
led.off()
ก่อนเริ่ม
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม”- จากบทที่แล้ว คำสั่งไหนที่ทำให้ป้ายขึ้นจอทันทีหลังสร้าง
- ในอีมูเลเตอร์ ปุ่มไหนเปิดแผงฮาร์ดแวร์จำลองที่มีหลอดไฟ
ดูของจริงก่อน
หัวข้อที่มีชื่อว่า “ดูของจริงก่อน”ก่อนอ่านโค้ด ให้ ทำนาย ก่อน เปิด examples/02_blink.py อ่านแค่สามบรรทัดบนสุดที่ตั้งค่า ROUNDS ON_MS และ OFF_MS
แล้วเขียนลงกระดาษว่า “ไฟจะกะพริบกี่ครั้ง แต่ละครั้งนานเท่าไร”
จากนั้น รัน ใน BENTO Emulator (กด HW เพื่อเปิดแผงฮาร์ดแวร์จำลองก่อน แล้วกด ▶ Run) หรือบนบอร์ดจริงด้วย Program to Device แล้วเทียบกับที่ทำนายไว้
1. ข้อความหนึ่งบรรทัดไปได้สามที่
หัวข้อที่มีชื่อว่า “1. ข้อความหนึ่งบรรทัดไปได้สามที่”| คำสั่ง | ข้อความไปที่ไหน | ใครเห็น |
|---|---|---|
ui.Label("...") |
บนจอ ตรงตำแหน่ง x, y ที่กำหนด | คนที่มองจอ |
lcd.print("...") |
ลิ้นชัก Console บนจอ (เปิดด้วยปุ่มสีเขียวมุมขวาล่าง) | คนที่เปิดลิ้นชัก |
print("...") |
คอนโซลฝั่งคอมพิวเตอร์ | คนที่นั่งหน้าคอม |
สามที่นี้เป็นคนละที่กัน มือใหม่หลายคนรันแล้วบอกว่า “ไม่เห็นอะไรเลย” ทั้งที่ข้อความไปรออยู่อีกที่หนึ่ง ลองรัน examples/01_hello_screen.py แล้วตามหาข้อความให้ครบทั้งสามที่
2. กะพริบหนึ่งครั้งคือสี่จังหวะ
หัวข้อที่มีชื่อว่า “2. กะพริบหนึ่งครั้งคือสี่จังหวะ”สั่งติด รอ สั่งดับ รอ เวลาที่รอคือสิ่งที่กำหนดจังหวะ ไมโครคอนโทรลเลอร์ทำงานเร็วมาก ถ้าไม่มี time.sleep_ms()
ไฟจะติดและดับเร็วเกินกว่าตาจะมองทัน
led.on() กับ led.off() สั่งค่าตรง ๆ อ่านบรรทัดเดียวก็รู้ว่าไฟจะเป็นอะไร นี่คือเหตุผลที่เราเลือกใช้สองคำสั่งนี้ก่อน
3. โปรแกรมที่ดีบอกได้ว่าจบที่สถานะไหน
หัวข้อที่มีชื่อว่า “3. โปรแกรมที่ดีบอกได้ว่าจบที่สถานะไหน”ถ้าโปรแกรมจบตอนไฟกำลังติด ไฟจะค้างติดต่อไปโดยไม่มีใครตั้งใจ งานจริงอย่างไฟเตือนในโรงงานจะทำให้คนเข้าใจผิดได้
ตัวอย่างทุกไฟล์ในหลักสูตรนี้จึงเริ่มด้วย led.off() (เริ่มจากสถานะที่รู้แน่) และจบด้วย led.off() (จบที่สถานะที่รู้แน่)
ตัวอย่างสมบูรณ์
หัวข้อที่มีชื่อว่า “ตัวอย่างสมบูรณ์”examples/02_blink.py ย่อมาจาก
examples/s03/02_led_blink.py
ของหลักสูตร AIoT in Action
- ท่าที่ 1 เลือกหลอด ถามรายชื่อไฟจาก
gpio.board_info()แล้วเลือกดวงที่ชื่อขึ้นต้นด้วยRGB_ถ้าไม่มีใช้ดวงแรก - ท่าที่ 2 เริ่มจากสถานะที่รู้แน่
led.off() - ท่าที่ 3 วางป้ายและตัวเลข ป้ายบอกสถานะ กับ
ui.Seg7ที่แสดงตัวเลขแบบนาฬิกาดิจิทัล - ท่าที่ 4 วนกะพริบ ในลูป
forสั่งติด อัปเดตป้าย รอ สั่งดับ นับรอบ รอ - ท่าที่ 5 จบที่สถานะที่รู้แน่
led.off()อีกครั้ง
ไฟล์ examples/01_hello_screen.py ย่อมาจาก
examples/s01/01_first_line.py
ใช้ท่าที่ 3 แบบเดียวกัน
ภาพจอจาก BENTO Emulator ของตัวอย่างในบทนี้ (คลิกชื่อไฟล์เพื่อเปิดโค้ด)
ฝึกเติม
หัวข้อที่มีชื่อว่า “ฝึกเติม”เปิด practice/blink_count.py มีช่องให้เติม 2 จุด (บรรทัดที่ขึ้นต้นด้วย # เติม:)
- เติมที่ 1 สั่งหลอดให้ติด
- เติมที่ 2 เพิ่มตัวนับขึ้นหนึ่ง แล้วเขียนเลขใหม่ลงจอ
ถ้าอยากฝึกแบบไม่ต้องพิมพ์ ลองเรียงบรรทัดโค้ดใน quiz ข้อที่ 3 ให้ถูกลำดับก่อน (แบบฝึก Parsons) แล้วค่อยกลับมาเติมไฟล์จริง
ลองเองก่อนอย่างน้อย 15 นาที แล้วเปิด solution/blink_count.py เทียบ
คอมเมนต์ในเฉลยอธิบายว่า “ทำไม” ต้องนับตอนดับ และทำไมต้องใช้ str() ก่อนส่งให้ Seg7
เช็กความเข้าใจ
หัวข้อที่มีชื่อว่า “เช็กความเข้าใจ”ตอบคำถามใน quiz.yaml ถูกตั้งแต่ 80% ขึ้นไปถือว่าผ่าน
แก้แล้วรันใหม่ (Modify) ตั้ง ON_MS = 50 และ OFF_MS = 950 ใน examples/02_blink.py ทำนายก่อนว่าไฟจะดูเป็นอย่างไร แล้วรันจริง
สร้างเอง (Make) เขียนโปรแกรมใหม่ที่กะพริบเป็นรหัสสั้น–ยาว เช่น สั้นสามครั้ง ยาวสามครั้ง สั้นสามครั้ง แล้วถ่ายภาพหน้าจอ (หรือคลิปสั้นถ้าใช้บอร์ดจริง) เก็บไว้เป็นหลักฐานใน portfolio ของคุณ
ไฟกะพริบคือ “Hello, World” ของโลกระบบฝังตัว ถ้าอยากเห็นว่าหลอดดวงเดียวหรี่ความสว่างได้อย่างไร
ดูตัวอย่าง examples/s03/03_led_brightness.py
ในหลักสูตร AIoT in Action
สะท้อนคิด
หัวข้อที่มีชื่อว่า “สะท้อนคิด”ตอนทำนายกับตอนรันจริงต่างกันไหม ถ้าต่าง ต่างเพราะอะไร การทำนายก่อนรันเปลี่ยนวิธีที่คุณอ่านโค้ดไหม
คำถามทบทวน
ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย
-
คำสั่ง lcd.print("สวัสดี") ทำให้ข้อความไปปรากฏที่ใด (เป้าหมายข้อ 1)
- คอนโซลฝั่งคอมพิวเตอร์
- ลิ้นชัก Console บนจอบอร์ด
- ป้ายตรงตำแหน่ง x, y บนจอ
- ไม่ปรากฏที่ใดเลย
ดูเฉลย
คำตอบ: B. ลิ้นชัก Console บนจอบอร์ด
lcd.print เขียนลงลิ้นชัก Console ต้องเปิดลิ้นชักด้วยปุ่มสีเขียวมุมขวาล่างถึงจะเห็น ส่วน print() ไปที่คอมพิวเตอร์ และ ui.Label ไปที่จอตรง ๆ
-
โค้ด ui.Label("สวัสดี", x=24, y=8, color=0xE8EAED, value=28) ตัวเลข value=28 หมายถึงอะไร (เป้าหมายข้อ 1)
- ตำแหน่งแนวตั้ง
- สีของตัวอักษร
- ขนาดตัวอักษร
- จำนวนครั้งที่แสดง
ดูเฉลย
คำตอบ: C. ขนาดตัวอักษร
สำหรับป้าย value คือขนาดตัวอักษร ตำแหน่งคือ x กับ y และสีคือ color
-
เรียงบรรทัดในลูปกะพริบให้ถูกลำดับ (กะพริบหนึ่งครั้ง) (เป้าหมายข้อ 2)
- led.off()
- time.sleep_ms(ON_MS)
- led.on()
- time.sleep_ms(OFF_MS)
ดูเฉลย
ลำดับที่ถูก: C. led.on() → B. time.sleep_ms(ON_MS) → A. led.off() → D. time.sleep_ms(OFF_MS)
สั่งติด รอ สั่งดับ รอ ถ้าไม่มีช่วงรอ ไฟจะติดดับเร็วเกินกว่าตาจะเห็น
-
ถ้า ROUNDS = 6, ON_MS = 250, OFF_MS = 250 โปรแกรมกะพริบใช้เวลาประมาณเท่าไร (ไม่นับเวลาวาดจอ) (เป้าหมายข้อ 3)
- 0.5 วินาที
- 1.5 วินาที
- 3 วินาที
- 6 วินาที
ดูเฉลย
คำตอบ: C. 3 วินาที
หนึ่งรอบคือ 250 + 250 = 500 ms หกรอบจึงราว 3000 ms เวลาจริงจะนานกว่านี้เล็กน้อยเพราะการวาดจอก็ใช้เวลา
-
ทำไมตัวอย่างจึงเรียก led.off() อีกครั้งหลังจบลูป (เป้าหมายข้อ 3)
- เพราะ MicroPython บังคับให้ทุกโปรแกรมจบด้วย off()
- เพื่อให้แน่ใจว่าโปรแกรมจบที่สถานะที่รู้แน่ ไม่ปล่อยไฟค้างติดโดยไม่ตั้งใจ
- เพื่อให้ไฟกะพริบเพิ่มอีกหนึ่งครั้ง
- เพื่อประหยัดหน่วยความจำ
ดูเฉลย
คำตอบ: B. เพื่อให้แน่ใจว่าโปรแกรมจบที่สถานะที่รู้แน่ ไม่ปล่อยไฟค้างติดโดยไม่ตั้งใจ
โปรแกรมที่จบแล้วควรบอกได้แน่ว่าไฟอยู่สถานะไหน ในงานจริงไฟที่ค้างติดผิดจังหวะทำให้คนเข้าใจผิดได้
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"โปรแกรมแรก: เขียนบนจอและเปิดไฟ" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "First program: draw on the screen and light an LED" 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/explorer/m01-meet-embedded/l03-first-program/
บทเรียนนี้ดัดแปลงจากต้นฉบับด้านล่าง เมื่ออ้างอิงให้คงเครดิตต้นฉบับไว้ด้วย
https://github.com/Advance-Innovation-Centre-AIC/embedded-systems-for-aiot-developer/blob/a80bbe88a34bcb9bb8d991f42f9252b77cdab079/examples/s03/02_led_blink.py · ตัวอย่างโค้ดทุกไฟล์ในหลักสูตรนี้ย่อและดัดแปลงจากตัวอย่างของ AIoT in Action (MIT) ใช้ API ของ BENTO MicroPython ตามที่ตัวอย่างต้นฉบับใช้ ไม่มีการเพิ่มคำสั่งใหม่
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0
เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA

