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

โปรแกรมแรก: เขียนบนจอและเปิดไฟ

  1. วางป้ายข้อความบนจอด้วย ui.Label และพิมพ์ลงลิ้นชัก Console ด้วย lcd.print แล้วรันผ่าน
  2. สั่งหลอด LED กะพริบด้วย gpio.led(n).on() / off() และ time.sleep_ms() ให้ครบจำนวนรอบ
  3. ทำนายผลก่อนรัน และอธิบายได้ว่าทำไมโปรแกรมควรจบด้วย led.off()
  • จากบทที่แล้ว คำสั่งไหนที่ทำให้ป้ายขึ้นจอทันทีหลังสร้าง
  • ในอีมูเลเตอร์ ปุ่มไหนเปิดแผงฮาร์ดแวร์จำลองที่มีหลอดไฟ

ก่อนอ่านโค้ด ให้ ทำนาย ก่อน เปิด examples/02_blink.py อ่านแค่สามบรรทัดบนสุดที่ตั้งค่า ROUNDS ON_MS และ OFF_MS แล้วเขียนลงกระดาษว่า “ไฟจะกะพริบกี่ครั้ง แต่ละครั้งนานเท่าไร”

จากนั้น รัน ใน BENTO Emulator (กด HW เพื่อเปิดแผงฮาร์ดแวร์จำลองก่อน แล้วกด ▶ Run) หรือบนบอร์ดจริงด้วย Program to Device แล้วเทียบกับที่ทำนายไว้

คำสั่ง ข้อความไปที่ไหน ใครเห็น
ui.Label("...") บนจอ ตรงตำแหน่ง x, y ที่กำหนด คนที่มองจอ
lcd.print("...") ลิ้นชัก Console บนจอ (เปิดด้วยปุ่มสีเขียวมุมขวาล่าง) คนที่เปิดลิ้นชัก
print("...") คอนโซลฝั่งคอมพิวเตอร์ คนที่นั่งหน้าคอม

สามที่นี้เป็นคนละที่กัน มือใหม่หลายคนรันแล้วบอกว่า “ไม่เห็นอะไรเลย” ทั้งที่ข้อความไปรออยู่อีกที่หนึ่ง ลองรัน examples/01_hello_screen.py แล้วตามหาข้อความให้ครบทั้งสามที่

สั่งติด รอ สั่งดับ รอ เวลาที่รอคือสิ่งที่กำหนดจังหวะ ไมโครคอนโทรลเลอร์ทำงานเร็วมาก ถ้าไม่มี time.sleep_ms() ไฟจะติดและดับเร็วเกินกว่าตาจะมองทัน

led.on() กับ led.off() สั่งค่าตรง ๆ อ่านบรรทัดเดียวก็รู้ว่าไฟจะเป็นอะไร นี่คือเหตุผลที่เราเลือกใช้สองคำสั่งนี้ก่อน

ถ้าโปรแกรมจบตอนไฟกำลังติด ไฟจะค้างติดต่อไปโดยไม่มีใครตั้งใจ งานจริงอย่างไฟเตือนในโรงงานจะทำให้คนเข้าใจผิดได้ ตัวอย่างทุกไฟล์ในหลักสูตรนี้จึงเริ่มด้วย 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

ตอนทำนายกับตอนรันจริงต่างกันไหม ถ้าต่าง ต่างเพราะอะไร การทำนายก่อนรันเปลี่ยนวิธีที่คุณอ่านโค้ดไหม

คำถามทบทวน

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

  1. คำสั่ง lcd.print("สวัสดี") ทำให้ข้อความไปปรากฏที่ใด (เป้าหมายข้อ 1)

    1. คอนโซลฝั่งคอมพิวเตอร์
    2. ลิ้นชัก Console บนจอบอร์ด
    3. ป้ายตรงตำแหน่ง x, y บนจอ
    4. ไม่ปรากฏที่ใดเลย
    ดูเฉลย

    คำตอบ: B. ลิ้นชัก Console บนจอบอร์ด

    lcd.print เขียนลงลิ้นชัก Console ต้องเปิดลิ้นชักด้วยปุ่มสีเขียวมุมขวาล่างถึงจะเห็น ส่วน print() ไปที่คอมพิวเตอร์ และ ui.Label ไปที่จอตรง ๆ

  2. โค้ด ui.Label("สวัสดี", x=24, y=8, color=0xE8EAED, value=28) ตัวเลข value=28 หมายถึงอะไร (เป้าหมายข้อ 1)

    1. ตำแหน่งแนวตั้ง
    2. สีของตัวอักษร
    3. ขนาดตัวอักษร
    4. จำนวนครั้งที่แสดง
    ดูเฉลย

    คำตอบ: C. ขนาดตัวอักษร

    สำหรับป้าย value คือขนาดตัวอักษร ตำแหน่งคือ x กับ y และสีคือ color

  3. เรียงบรรทัดในลูปกะพริบให้ถูกลำดับ (กะพริบหนึ่งครั้ง) (เป้าหมายข้อ 2)

    1. led.off()
    2. time.sleep_ms(ON_MS)
    3. led.on()
    4. time.sleep_ms(OFF_MS)
    ดูเฉลย

    ลำดับที่ถูก: C. led.on() → B. time.sleep_ms(ON_MS) → A. led.off() → D. time.sleep_ms(OFF_MS)

    สั่งติด รอ สั่งดับ รอ ถ้าไม่มีช่วงรอ ไฟจะติดดับเร็วเกินกว่าตาจะเห็น

  4. ถ้า ROUNDS = 6, ON_MS = 250, OFF_MS = 250 โปรแกรมกะพริบใช้เวลาประมาณเท่าไร (ไม่นับเวลาวาดจอ) (เป้าหมายข้อ 3)

    1. 0.5 วินาที
    2. 1.5 วินาที
    3. 3 วินาที
    4. 6 วินาที
    ดูเฉลย

    คำตอบ: C. 3 วินาที

    หนึ่งรอบคือ 250 + 250 = 500 ms หกรอบจึงราว 3000 ms เวลาจริงจะนานกว่านี้เล็กน้อยเพราะการวาดจอก็ใช้เวลา

  5. ทำไมตัวอย่างจึงเรียก led.off() อีกครั้งหลังจบลูป (เป้าหมายข้อ 3)

    1. เพราะ MicroPython บังคับให้ทุกโปรแกรมจบด้วย off()
    2. เพื่อให้แน่ใจว่าโปรแกรมจบที่สถานะที่รู้แน่ ไม่ปล่อยไฟค้างติดโดยไม่ตั้งใจ
    3. เพื่อให้ไฟกะพริบเพิ่มอีกหนึ่งครั้ง
    4. เพื่อประหยัดหน่วยความจำ
    ดูเฉลย

    คำตอบ: 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 ฉบับเต็ม

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

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