บทเรียน 2.1 — อ่านเซนเซอร์แล้วดูค่าเปลี่ยน

ขอค่าลูกบิดและค่าความเร่งจาก sensors.snapshot() แล้วเขียนไฟเตือนเมื่อบอร์ดเอียง

โมดูล 2 — รับรู้ เชื่อมต่อ แล้วไปต่อ

หลักสูตร Explorer: เปิดโลกระบบสมองกลฝังตัว

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

เป้าหมาย

  1. อ่านค่า pot กับ az จาก sensors.snapshot() แล้วแสดงบนจอให้เปลี่ยนตามมือ
  2. อธิบายได้ว่าทำไมต้องถามคีย์ด้วย in และดัก OSError
  3. เติมโปรแกรมไฟเตือนเมื่อบอร์ดเอียงให้ทำงานถูก
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ก่อนเริ่ม

  • ในบทที่แล้ว ทำไมเราต้องแปลงตัวเลขด้วย str() ก่อนส่งให้ Seg7
  • จากบทแรก เซนเซอร์อยู่ในจังหวะไหนของ "รับรู้ ตัดสินใจ สั่งงาน"
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ดูของจริงก่อน

  1. เปิด examples/01_knob_and_tilt.py ใน BENTO IDE แล้วรันใน BENTO Emulator
  2. กด HW เปิดแผงฮาร์ดแวร์จำลอง แล้ว หมุนลูกบิด POTEN ดูวงแหวนบนจอกวาดตาม
  3. ลาก แผ่นเอียง บนแผงเดียวกัน ดูตัวเลข az เปลี่ยน และสีเปลี่ยนเป็นส้มเมื่อเอียงมาก

ถ้าใช้บอร์ดจริง หมุนลูกบิดบนบอร์ด และเอียงบอร์ดด้วยมือ ผลจะเหมือนกัน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ภาพจอจาก BENTO Emulator

จอของ examples/01_knob_and_tilt.py ขณะรันใน BENTO Emulator

01_knob_and_tilt.py

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

แนวคิด — ถามครั้งเดียว ได้ทุกเซนเซอร์

sensors.snapshot() คืนข้อมูลก้อนเดียว (dict) ที่มีค่าเซนเซอร์หลายตัวซึ่งอ่านมาจากเวลาเดียวกัน

{
    "pot":    {"percent": 42.5, ...},              # ลูกบิดหมุน 0-100
    "bmi270": {"ax": 0.1, "ay": -0.2, "az": 9.8},   # ความเร่ง หน่วย m/s^2
}

ลูกบิดหมุนคือตัวต้านทานปรับค่าได้ บอร์ดอ่านแรงดันจากมันด้วย ADC แล้วแปลงเป็นเปอร์เซ็นต์

bmi270 คือชิปวัดความเคลื่อนไหว ตอนวางราบ แรงโน้มถ่วงทำให้ az อยู่ราว 9.8 พอเอียง ค่านี้ลดลง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

แนวคิด — ถามก่อนหยิบ

คีย์ในก้อนมีเท่าที่บอร์ดมีให้ ไม่ได้มีครบเสมอ

ถ้าเขียน s["pot"] ตรง ๆ บนบอร์ดที่ไม่มีลูกบิด โปรแกรมจะหยุดด้วย KeyError

วิธีที่ปลอดภัยคือถามก่อนด้วย if "pot" in s: แล้วค่อยอ่าน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

แนวคิด — บอร์ดจริงอาจยังไม่พร้อม

หลังเปิดเครื่องใหม่ ๆ บอร์ดจริงอาจยังไม่พร้อมตอบเรื่องเซนเซอร์อยู่ครู่หนึ่ง ช่วงนั้น snapshot() จะโยน OSError ออกมา — ไม่ได้แปลว่าโค้ดผิด เราจึงครอบด้วย try / except OSError แล้วลองใหม่รอบหน้า

ในอีมูเลเตอร์ บรรทัดนี้แทบไม่เคยโยน OSError เลย

โปรแกรมที่ผ่านในอีมูเลเตอร์ยังต้องเขียนเผื่อบอร์ดจริงเสมอ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ตัวอย่างสมบูรณ์

examples/01_knob_and_tilt.py ย่อมาจากตัวอย่างของหลักสูตร AIoT in Action

try:                                # ท่าที่ 3: ขอค่าอย่างปลอดภัย
    s = sensors.snapshot()
except OSError:
    time.sleep_ms(200)
    continue

if "pot" in s:                      # ท่าที่ 4: ถามก่อนหยิบ
    ring.value(int(s["pot"]["percent"]))

if "bmi270" in s and s["bmi270"]["az"] < TILT_THRESHOLD:
    status.color(COL_WARN)          # ท่าที่ 5: เปลี่ยนสีตามความหมาย

ท่าที่ 1 วางของบนจอครั้งเดียวนอกลูป · ท่าที่ 2 วนถามทุก 200 ms จนครบ 20 วินาที

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ฝึกเติม

เปิด practice/tilt_alarm.py — มีช่องให้เติม 4 จุด

  • เติม 1 ขอค่าเซนเซอร์ทั้งก้อน
  • เติม 2 เงื่อนไขว่ามีคีย์ bmi270 อยู่ในก้อน
  • เติม 3 ไฟติดพร้อมป้าย "เอียง"
  • เติม 4 ไฟดับพร้อมป้าย "วางราบ"

ลองเองก่อนอย่างน้อย 15 นาที แล้วเปิด solution/tilt_alarm.py เทียบ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

เช็กความเข้าใจ

ตอบคำถามใน quiz.yaml ถูกตั้งแต่ 80% ขึ้นไปถือว่าผ่าน

  1. ถ้า s = sensors.snapshot() เราอ่านเปอร์เซ็นต์ของลูกบิดได้ด้วยนิพจน์ใด
  2. วางบอร์ดราบบนโต๊ะ ค่า az ควรอยู่ราวเท่าไร
  3. ทำไมจึงเขียน if "pot" in s ก่อนอ่าน s["pot"]
  4. บนบอร์ดจริง ถ้า sensors.snapshot() โยน OSError ตอนเพิ่งเปิดเครื่อง ควรทำอย่างไร
  5. เรียงบรรทัดของไฟเตือนเมื่อเอียงให้ถูกลำดับ
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

แล็บ

สร้างเอง: แก้ไฟเตือนให้ใช้ลูกบิดตั้งเกณฑ์แทนตัวเลขตายตัว เช่น หมุนลูกบิดไปที่ 50% แปลว่าเกณฑ์เป็นกลาง ๆ

ถ่ายภาพหน้าจอตอนไฟเตือนติด เก็บไว้ใน portfolio พร้อมเขียนหนึ่งบรรทัดว่าเกณฑ์ที่คุณเลือกมาจากไหน

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

ไปต่อ

ค่าจากเซนเซอร์จริงไม่เคยนิ่งสนิท มีสัญญาณรบกวนปนมาเสมอ หลักสูตร AIoT in Action มีตัวอย่างที่ทำให้ค่านิ่งขึ้นด้วยฟิลเตอร์ เช่น 06_ema_time_constant.py และการแปลงค่า ADC เป็นโวลต์ใน 05_adc_counts_to_volts.py

บทถัดไป: บทเรียน 2.2 — ของที่คุยกันได้: MQTT และแดชบอร์ด

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0

แหล่งที่มาและเครดิต

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

ดัดแปลงจาก AIoT in Action — Embedded Systems for AIoT Developer, © 2026 รศ.วิรุฬห์ ศรีบริรักษ์
วิศวกรรมระบบสมองกลฝังตัว มหาวิทยาลัยบูรพา (BUU) · Advance Innovation Centre (AIC) · BENTO & TESAIoT (CC BY 4.0 / MIT)

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · ดัดแปลงจาก AIoT in Action (รศ.วิรุฬห์ ศรีบริรักษ์, BUU) · CC BY-NC 4.0