WiFi และเครือข่าย: dBm DHCP IP และ DNS
โมดูล 4 — เชื่อมต่อแพลตฟอร์ม IoT · สไลด์: slides.md · ภาพรวมโมดูล · หน้าหลักสูตร
เปิดดูสิ่งที่เกิดขึ้นระหว่างที่บอร์ด “กำลังต่อ” ตั้งแต่ความแรงสัญญาณเป็น dBm การเข้าร่วมวง DHCP และเลข IP จนถึงเหตุผลที่ต้อง ping สองปลายทาง เพื่อให้บอกได้ว่าเน็ตขาดตรงไหน ไม่ใช่แค่บอกว่าพัง
เป้าหมาย
หัวข้อที่มีชื่อว่า “เป้าหมาย”เมื่อจบบทเรียนนี้ คุณจะ:
- เทียบความแรงสัญญาณสองค่าที่เป็น dBm ได้ด้วยกฎ “ทุก 10 dB คือ 10 เท่า ทุก 3 dB ราว 2 เท่า” โดยไม่ใช้เครื่องคิดเลข เช่นบอกได้ว่า −50 dBm แรงกว่า −80 dBm อยู่ 1000 เท่า และจัดวงที่บอร์ดต่อเข้าเกณฑ์หน้างาน (ดีกว่า −60 · −67 · ต่ำกว่า −80)
- เรียงห้าขั้นตั้งแต่บอร์ดถามหา AP จนได้เลข IP พร้อมเกตเวย์และ DNS ได้ถูกลำดับ และบอกได้ว่าขั้น 1–3 เป็นเรื่องของ WiFi ส่วนขั้น 4–5 เป็นเรื่องของ IP ผ่าน DHCP แบบ DORA ซึ่งพังคนละแบบ
- แปลผล ping เกตเวย์คู่กับ ping 8.8.8.8 ได้ถูกครบสามกรณี (ผ่านทั้งคู่ · เกตเวย์ผ่านแต่เน็ตไม่ผ่าน · เกตเวย์ไม่ผ่าน) และบอกได้ว่าต้องไปแก้ที่ไหน
- อธิบายข้อจำกัดสองข้อของโมดูล wifi บนบอร์ดนี้ได้: wifi.ping() รับเฉพาะเลข IP เพราะยังไม่มีตัวแปลชื่อ (resolver) เปิดให้ Python เรียก และไม่มี netmask กับ gateway ให้อ่าน โค้ดจึงต้องเดาเกตเวย์เป็น .1 แล้วพิสูจน์ด้วย ping
ก่อนเริ่ม
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม”ทบทวนบทเรียน 1.4–1.6 ที่เราเรียก wifi.connect() จนต่อเน็ตติดไปแล้ว และนึกภาพแดชบอร์ดของบทเรียน 3.7–3.9 ไว้
เพราะชุดบทเรียน 4.1–4.3 จะต่อหน้าสถานะเครือข่ายเข้ากับจอนั้น บทเรียนนี้ยังไม่ต้องเขียนโค้ด
เตรียมบันทึกการเรียนไว้จดตัวเลขที่อ่านจากจอ และเตรียมชื่อกับรหัสผ่านของ WiFi บ้านหรือ Hotspot มือถือที่จะให้บอร์ดต่อ
(ตั้งตามตารางในบทเรียน 1.4: ชื่อภาษาอังกฤษไม่มีช่องว่าง รหัสอย่างน้อย 8 ตัว ย่าน 2.4 GHz)
- อุปกรณ์: บอร์ด Eva Kit หรือ TESAIoT Dev Kit ที่ลงเฟิร์มแวร์ MicroPython ของ BENTO แล้ว หรือ BENTO Emulator ใน BENTO IDE (บทเรียนนี้ยังไม่มีโค้ด ตัวเลข dBm และเลข IP ที่จดในแล็บควรอ่านจากบอร์ดจริงที่ต่อ WiFi บ้านหรือ Hotspot ของคุณ)
- เรียนมาก่อน: บทเรียน 3.9 — ลงมือทำ: Mini-HMI Dashboard และการทดสอบ 10 นาที
ดูของจริงก่อน
หัวข้อที่มีชื่อว่า “ดูของจริงก่อน”เปิดเมนู Wi-Fi Setting ที่มากับบอร์ด (เราเจอมันมาตั้งแต่บทเรียน 1.1–1.3) แล้วสังเกตสามขั้นบนจอ
ขั้นแรกสแกนเห็นชื่อวงพร้อมความแรงเป็น dBm · ขั้นที่สองเลือกวงแล้วใส่รหัส จอจะนิ่งไปพักหนึ่ง ซึ่งเป็นการรอ ไม่ใช่ค้าง ·
ขั้นที่สามได้เลข IP แล้วไอคอนบนแถบบนติด แปลว่าบอร์ดมีที่อยู่แล้ว สามขั้นนี้คือสามบรรทัดในโค้ดของเราเอง:
wifi.scan() · wifi.connect() · wifi.ip()
ต่อเน็ตติด กับ ต่อเน็ตใช้ได้ เป็นคนละเรื่อง บทเรียน 1.4–1.6 เป็นการพาทัวร์ทั้งเส้น ชุดบทเรียนนี้เปิดกล่องเดิมออกดูว่า บรรทัดที่เคยรันผ่านวิ่งผ่านอะไรบ้าง ทำไมบางครั้งช้าจนน่าตกใจ และตัวเลขที่คืนมาแปลว่าอะไร ปลายทางในบทเรียน 4.3 คือหน้าสถานะเครือข่ายของทีม: ตาราง SSID · dBm · ช่อง · รหัส เรียงจากแรงไปอ่อน ไฟสถานะลิงก์สองดวง ping สองปลายทาง มาตรวัด dBm พร้อมพิสัย −90 ถึง −40 และปุ่มสแกนใหม่
dBm คือกำลังจริงเทียบกับ 1 mW บนสเกลลอการิทึม $P_{\text{dBm}} = 10\log_{10}(P / 1\ \text{mW})$ ที่ −67 dBm
เสาอากาศรับได้ราว 0.2 นาโนวัตต์ ส่วน 0 dBm คือ 1 mW พอดี ค่าบนบอร์ดจึงติดลบเสมอ จำสองข้อพอ: ทุก 10 dB คือ 10 เท่า
และทุก 3 dB ราว 2 เท่า หน้าจอ Wi-Fi Setting ใช้เกณฑ์ห้าขีดที่ −50 / −60 / −70 / −80 / −90 ส่วนช่างเครือข่ายใช้
ดีกว่า −60 สบายทุกงาน · −67 ขีดจำกัดของวิดีโอหรือเสียง · ต่ำกว่า −80 อย่าไว้ใจ ย่าน 5 GHz ไม่ได้ “ดีกว่า” 2.4 GHz
มันแลกระยะกับความเร็ว ที่ 10 เมตร FSPL ของช่อง 36 (5180 MHz) มากกว่าช่อง 6 (2437 MHz) อยู่ 6.5 dB หรือเหลือกำลังราวหนึ่งในสี่
และผนังคอนกรีตกินเพิ่มอีก 10–15 dB การสแกนคือการไล่ฟังทีละช่อง wifi.scan() จึงบล็อกได้ถึง 10 วินาที
ต้องขึ้นข้อความ “กำลังสแกน” ก่อนเรียก ไม่ใช่หลัง
จากคลื่นถึงเลข IP มีห้าขั้น ขั้น 1–3 คือ WiFi: ขอดูว่ามีใครอยู่แถวนี้ · AP ตอบชื่อวง ความแรง ช่อง · ขอเข้าร่วมพร้อมพิสูจน์รหัสผ่าน
ขั้น 4–5 คือ IP: ขอเลขผ่าน DHCP (Discover · Offer · Request · Acknowledge) แล้วได้เลข IP พร้อมเกตเวย์และ DNS
เลขนี้เป็นการยืมชั่วคราว (lease) ปิดเปิดบอร์ดใหม่อาจได้คนละเลข โค้ดจึงต้องอ่าน wifi.ip() ทุกครั้งหลังต่อ
wifi.connect() คืน True เมื่อผ่านครบห้าขั้น ติดขั้นไหนก็ได้ False เหมือนกันหมด ถ้า DHCP ของวงเต็มหรือพัง
เราจะต่อ WiFi ติดแต่ไม่มีเลข IP ซึ่งดูเหมือนต่อไม่ติดทั้งที่ไม่ใช่
ping สองปลายทาง แล้วอ่านผลเป็นคู่ wifi.ping(ip, timeout_ms) คืนเวลาไป-กลับเป็นมิลลิวินาที หรือ −1 เมื่อไม่มีคำตอบ
เกตเวย์ผ่านและเน็ตผ่าน คือปกติ · เกตเวย์ผ่านแต่ 8.8.8.8 เงียบ คือปัญหาอยู่เหนือเราเตอร์ ไม่ใช่ที่เรา ·
เกตเวย์ไม่ผ่าน คือลิงก์ WiFi หรือเลขเกตเวย์ที่เดาผิด MicroPython บนบอร์ดนี้ให้แค่ wifi.ip() ยังไม่มี netmask
และ gateway ให้อ่าน โค้ดจึงเดาเกตเวย์จากสามช่องแรกของ IP ต่อด้วย .1 ซึ่งถูกในวงแลนส่วนใหญ่แต่ไม่ใช่ทุกวง
และ wifi.ping() รับเฉพาะเลข IP ใส่ "google.com" จะได้ ValueError เพราะยังไม่มีตัวแปลชื่อเปิดให้ Python เรียก
ข้อนี้เป็นช่องว่างของโมดูล ไม่ใช่ของฮาร์ดแวร์ เราเลือก 8.8.8.8 เพราะจำง่ายและแทบไม่เคยล่ม
ข้อมูลของเราถูกห่อทีละชั้นก่อนออกอากาศ แต่ละชั้นเพิ่มขนาดและพังได้เอกเทศ คลื่นแรงดีแต่ไม่มี IP ก็เกิดขึ้นได้จริง
wifi.connect() จัดการชั้นล่างให้ wifi.ping() วัดชั้นกลาง และบทเรียน 4.4–4.6 เราจะเขียนชั้นบนสุดด้วย MQTT เอง
เช็กความเข้าใจ
หัวข้อที่มีชื่อว่า “เช็กความเข้าใจ”คำถามชุดเดียวกันอยู่ใน quiz.yaml สำหรับระบบที่ตรวจอัตโนมัติ
-
วง A วัดได้ −50 dBm วง B วัดได้ −80 dBm กำลังที่เสาอากาศรับจากวง A มากกว่าวง B ประมาณกี่เท่า (เลือกหนึ่งข้อ · เป้าหมายข้อ 1)
- ก) 30 เท่า เพราะตัวเลขต่างกัน 30
- ข) 1000 เท่า
- ค) ราว 1.6 เท่า
- ง) 3 เท่า
เฉลย
ข — ต่างกัน 30 dB และทุก 10 dB คือ 10 เท่า จึงเป็น 10 × 10 × 10 = 1000 เท่า dBm เป็นสเกลลอการิทึม ตัวเลขที่ต่างกันเล็กน้อยจึงอาจหมายถึงกำลังที่ต่างกันมหาศาล
-
เรียงสิ่งที่เกิดขึ้นระหว่างที่ wifi.connect() ทำงาน จากแรกสุดไปสุดท้าย (เรียงลำดับ · เป้าหมายข้อ 2)
- ก) บอร์ดขอเข้าร่วมวงและพิสูจน์รหัสผ่าน
- ข) เราเตอร์ให้เลข IP มา พร้อมเกตเวย์และ DNS
- ค) บอร์ดขอดูว่ามี AP ไหนอยู่แถวนี้บ้าง
- ง) บอร์ดขอเลขที่อยู่ผ่าน DHCP (DISCOVER / REQUEST)
- จ) AP ตอบกลับด้วยชื่อวง ความแรง และช่องสัญญาณ
เฉลย
ค → จ → ก → ง → ข — สามขั้นแรกเป็นเรื่องของ WiFi และตอนจบขั้นที่สามบอร์ดยังไม่มีเลข IP สองขั้นหลังเป็นเรื่องของ IP ผ่าน DHCP ติดขั้นไหนก็ตาม connect() คืน False เหมือนกันหมด จึงต้องมี ping ไว้แยกว่าติดตรงไหน
-
หน้าสถานะแสดงว่า ping เกตเวย์ได้ 3 ms แต่ ping 8.8.8.8 ขึ้น timeout ข้อสรุปใดถูก (เลือกหนึ่งข้อ · เป้าหมายข้อ 3)
- ก) ลิงก์ WiFi ของบอร์ดหลุด ต้องต่อใหม่
- ข) ปัญหาอยู่เหนือเราเตอร์ ไม่ใช่ที่บอร์ดของเรา
- ค) เลขเกตเวย์ที่เดาเป็น .1 ผิด
- ง) ต้องเปลี่ยนไป ping “google.com” แทน 8.8.8.8
เฉลย
ข — เกตเวย์ตอบแปลว่าลิงก์ WiFi และเลขเกตเวย์ใช้ได้ ปลายทางนอกบ้านเงียบจึงแปลว่าขาดหลังเราเตอร์ ถ้าเกตเวย์ไม่ตอบต่างหากที่ชี้ไปที่ลิงก์ WiFi หรือเกตเวย์ที่เดาผิด
-
ข้อใดถูกเกี่ยวกับโมดูล wifi บนบอร์ดนี้ เลือกทุกข้อที่ถูก (เลือกได้หลายข้อ · เป้าหมายข้อ 4)
- ก) wifi.ping(“google.com”) ได้ ValueError เพราะยังไม่มีตัวแปลชื่อเปิดให้ Python เรียก
- ข) โค้ดอ่าน netmask และ gateway จริงจากเฟิร์มแวร์ได้
- ค) เกตเวย์ในโค้ดเป็นการเดาจากเลข IP (สามช่องแรกต่อด้วย .1) จึงต้องพิสูจน์ด้วย ping
- ง) ข้อจำกัดเรื่องชื่อโดเมนเกิดจากชิปวิทยุคุย DNS ไม่ได้
เฉลย
ก, ค — บอร์ดให้แค่ wifi.ip() ยังไม่มี netmask และ gateway ให้อ่าน โค้ดจึงเดาเกตเวย์แล้วยิง ping พิสูจน์ ส่วนเรื่อง DNS เป็นช่องว่างของโมดูล ตัวชิปคุย DNS ได้ แค่ยังไม่มีใครเปิดประตูฝั่ง Python ให้
-
บอร์ดผ่านขั้นเข้าร่วมวง WiFi แล้ว แต่ DHCP ของวงเต็ม อาการที่เห็นคืออะไร (เลือกหนึ่งข้อ · เป้าหมายข้อ 2)
- ก) ต่อ WiFi ติด แต่ไม่มีเลข IP ซึ่งดูเหมือนต่อไม่ติด
- ข) wifi.scan() ไม่เจอวงใดเลย
- ค) ได้เลข IP ปกติ แต่ ping 8.8.8.8 ไม่ผ่าน
- ง) ค่า RSSI กลายเป็นเลขบวก
เฉลย
ก — DHCP อยู่ในขั้นที่ 4–5 ซึ่งเป็นเรื่องของ IP ไม่ใช่ WiFi คลื่นแรงดีและเข้าร่วมวงได้ แต่ไม่มีใครแจกเลขให้ จึงคุยกับใครนอกห้องไม่ได้ ทั้งที่ดูเหมือนต่อไม่ติด
อ่านเครือข่ายรอบตัวเป็นตัวเลข (ราว 15 นาที) ทำบนบอร์ดจริง แล้วจดลงบันทึกการเรียน
- เปิด Wi-Fi Setting แล้วจดชื่อวงกับค่า dBm ของสามวงที่แรงที่สุด และของวงที่อ่อนที่สุดที่เห็น
- คำนวณว่าวงแรงสุดกับวงอ่อนสุดต่างกันกี่ dB และกี่เท่าของกำลัง ด้วยกฎ 10 dB = 10 เท่า · 3 dB ≈ 2 เท่า
- จัดวงที่บอร์ดต่อเข้าเกณฑ์หน้างาน: ดีกว่า −60 · ราว −67 · ต่ำกว่า −80
- ต่อ WiFi บ้านหรือ Hotspot ของคุณแล้วจดเลข IP ที่ได้ จากนั้นเขียนเลขเกตเวย์ที่ “เดา” ไว้ (สามช่องแรกต่อด้วย
.1) เพื่อพิสูจน์ด้วย ping ในบทเรียน 4.3 - ทำตารางสามแถวในบันทึกการเรียน: ผล ping เกตเวย์ · ผล ping 8.8.8.8 · ปัญหาอยู่ที่ไหน ให้ครบทั้งสามกรณี
บทเรียน 4.2 แกะโค้ดของหน้าสถานะเครือข่ายทีละท่า พร้อมโมดูล wifi ทั้งแปดชื่อ และค่าบนหน้า Wi-Fi Setting
ที่ไม่ได้มาจากการวัดจริง
บทเรียนถัดไป: บทเรียน 4.2 — จอสถานะเครือข่าย: แกะโค้ดโมดูล wifi
สะท้อนคิด
หัวข้อที่มีชื่อว่า “สะท้อนคิด”- เวลาเพื่อนในทีมบอกว่า “สัญญาณอ่อนไปนิดเดียว” คุณจะถามกลับด้วยตัวเลขอะไร และต่างกัน 20 dB แปลว่ากี่เท่า
- โรงเรือนที่อยู่ห่างจากบ้าน 300 เมตร ควรเลือกย่าน 2.4 หรือ 5 GHz และสูตรไหนช่วยตัดสินใจได้ก่อนซื้อของ
- ระบบที่บอกได้ว่า “พังตรงไหน” มีค่ากว่าระบบที่บอกแค่ว่า “พัง” อย่างไรในงานที่คุณอยากทำ
คำถามทบทวน
ลองตอบเองก่อน แล้วค่อยเปิดดูเฉลย
-
วง A วัดได้ −50 dBm วง B วัดได้ −80 dBm กำลังที่เสาอากาศรับจากวง A มากกว่าวง B ประมาณกี่เท่า (เป้าหมายข้อ 1)
- 30 เท่า เพราะตัวเลขต่างกัน 30
- 1000 เท่า
- ราว 1.6 เท่า
- 3 เท่า
ดูเฉลย
คำตอบ: B. 1000 เท่า
ต่างกัน 30 dB และทุก 10 dB คือ 10 เท่า จึงเป็น 10 × 10 × 10 = 1000 เท่า dBm เป็นสเกลลอการิทึม ตัวเลขที่ต่างกันเล็กน้อยจึงอาจหมายถึงกำลังที่ต่างกันมหาศาล
-
เรียงสิ่งที่เกิดขึ้นระหว่างที่ wifi.connect() ทำงาน จากแรกสุดไปสุดท้าย (เป้าหมายข้อ 2)
- บอร์ดขอเข้าร่วมวงและพิสูจน์รหัสผ่าน
- เราเตอร์ให้เลข IP มา พร้อมเกตเวย์และ DNS
- บอร์ดขอดูว่ามี AP ไหนอยู่แถวนี้บ้าง
- บอร์ดขอเลขที่อยู่ผ่าน DHCP (DISCOVER / REQUEST)
- AP ตอบกลับด้วยชื่อวง ความแรง และช่องสัญญาณ
ดูเฉลย
ลำดับที่ถูก: C. บอร์ดขอดูว่ามี AP ไหนอยู่แถวนี้บ้าง → E. AP ตอบกลับด้วยชื่อวง ความแรง และช่องสัญญาณ → A. บอร์ดขอเข้าร่วมวงและพิสูจน์รหัสผ่าน → D. บอร์ดขอเลขที่อยู่ผ่าน DHCP (DISCOVER / REQUEST) → B. เราเตอร์ให้เลข IP มา พร้อมเกตเวย์และ DNS
สามขั้นแรกเป็นเรื่องของ WiFi และตอนจบขั้นที่สามบอร์ดยังไม่มีเลข IP สองขั้นหลังเป็นเรื่องของ IP ผ่าน DHCP ติดขั้นไหนก็ตาม connect() คืน False เหมือนกันหมด จึงต้องมี ping ไว้แยกว่าติดตรงไหน
-
หน้าสถานะแสดงว่า ping เกตเวย์ได้ 3 ms แต่ ping 8.8.8.8 ขึ้น timeout ข้อสรุปใดถูก (เป้าหมายข้อ 3)
- ลิงก์ WiFi ของบอร์ดหลุด ต้องต่อใหม่
- ปัญหาอยู่เหนือเราเตอร์ ไม่ใช่ที่บอร์ดของเรา
- เลขเกตเวย์ที่เดาเป็น .1 ผิด
- ต้องเปลี่ยนไป ping "google.com" แทน 8.8.8.8
ดูเฉลย
คำตอบ: B. ปัญหาอยู่เหนือเราเตอร์ ไม่ใช่ที่บอร์ดของเรา
เกตเวย์ตอบแปลว่าลิงก์ WiFi และเลขเกตเวย์ใช้ได้ ปลายทางนอกบ้านเงียบจึงแปลว่าขาดหลังเราเตอร์ ถ้าเกตเวย์ไม่ตอบต่างหากที่ชี้ไปที่ลิงก์ WiFi หรือเกตเวย์ที่เดาผิด
-
ข้อใดถูกเกี่ยวกับโมดูล wifi บนบอร์ดนี้ เลือกทุกข้อที่ถูก (เป้าหมายข้อ 4)
- wifi.ping("google.com") ได้ ValueError เพราะยังไม่มีตัวแปลชื่อเปิดให้ Python เรียก
- โค้ดอ่าน netmask และ gateway จริงจากเฟิร์มแวร์ได้
- เกตเวย์ในโค้ดเป็นการเดาจากเลข IP (สามช่องแรกต่อด้วย .1) จึงต้องพิสูจน์ด้วย ping
- ข้อจำกัดเรื่องชื่อโดเมนเกิดจากชิปวิทยุคุย DNS ไม่ได้
ดูเฉลย
คำตอบ: A. wifi.ping("google.com") ได้ ValueError เพราะยังไม่มีตัวแปลชื่อเปิดให้ Python เรียก · C. เกตเวย์ในโค้ดเป็นการเดาจากเลข IP (สามช่องแรกต่อด้วย .1) จึงต้องพิสูจน์ด้วย ping
บอร์ดให้แค่ wifi.ip() ยังไม่มี netmask และ gateway ให้อ่าน โค้ดจึงเดาเกตเวย์แล้วยิง ping พิสูจน์ ส่วนเรื่อง DNS เป็นช่องว่างของโมดูล ตัวชิปคุย DNS ได้ แค่ยังไม่มีใครเปิดประตูฝั่ง Python ให้
-
บอร์ดผ่านขั้นเข้าร่วมวง WiFi แล้ว แต่ DHCP ของวงเต็ม อาการที่เห็นคืออะไร (เป้าหมายข้อ 2)
- ต่อ WiFi ติด แต่ไม่มีเลข IP ซึ่งดูเหมือนต่อไม่ติด
- wifi.scan() ไม่เจอวงใดเลย
- ได้เลข IP ปกติ แต่ ping 8.8.8.8 ไม่ผ่าน
- ค่า RSSI กลายเป็นเลขบวก
ดูเฉลย
คำตอบ: A. ต่อ WiFi ติด แต่ไม่มีเลข IP ซึ่งดูเหมือนต่อไม่ติด
DHCP อยู่ในขั้นที่ 4–5 ซึ่งเป็นเรื่องของ IP ไม่ใช่ WiFi คลื่นแรงดีและเข้าร่วมวงได้ แต่ไม่มีใครแจกเลขให้ จึงคุยกับใครนอกห้องไม่ได้ ทั้งที่ดูเหมือนต่อไม่ติด
อ้างอิงบทเรียนนี้
ถ้านำบทเรียนนี้ไปสอน ทำสไลด์ หรือทำเอกสารต่อ ให้อ้างอิงด้วยข้อความนี้ ถ้าดัดแปลงเนื้อหา ให้เติม (ดัดแปลง)ต่อท้ายชื่อบทเรียน
"WiFi และเครือข่าย: dBm DHCP IP และ DNS" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0
ข้อความอ้างอิงภาษาอังกฤษ: "WiFi and networking: dBm, DHCP, IP and DNS" 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/m04-iot-connectivity/l01-wifi-networking/
บทเรียนนี้ดัดแปลงจากต้นฉบับด้านล่าง เมื่ออ้างอิงให้คงเครดิตต้นฉบับไว้ด้วย
https://github.com/Advance-Innovation-Centre-AIC/embedded-systems-for-aiot-developer/blob/a80bbe88a34bcb9bb8d991f42f9252b77cdab079/session-09.html (slides 1–16)
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0
เนื้อหาเผยแพร่ภายใต้ CC BY-NC 4.0 นำไปใช้ต่อในงานที่ไม่ใช่เพื่อการค้าได้ โปรดอ้างอิงสมาคมสมองกลฝังตัวไทย (TESA) ทุกครั้ง · วิธีอ้างอิง TESA