สร้างเซ็นเซอร์ตรวจจับการใช้งานพื้นที่ด้วย ESP32 ราคา 5 ดอลลาร์และฐานข้อมูลแบบ Serverless
(matthew.science)- หลังสัญญาของ Bluefox ซึ่งเคยให้ข้อมูลความหนาแน่นของโรงอาหารหายไป จึงสร้างอุปกรณ์เพื่อวัด แนวโน้มการใช้งานพื้นที่ ในแคมปัสเอง โดยนับจำนวนอุปกรณ์ที่มองเห็นจากแพ็กเก็ตโฆษณา BLE
- จากการทดลองด้วยแล็ปท็อป จำนวนอุปกรณ์ BLE ในพื้นที่เล็ก ๆ เคลื่อนไหวสอดคล้องกับความหนาแน่นจริงอย่างรวดเร็ว และแม้ในโรงอาหารขนาดใหญ่ก็สอดคล้องกับ การเปลี่ยนแปลงของแนวโน้ม ในช่วงเวลาที่ผู้คนย้ายที่ก่อนและหลังคาบเรียนได้ดี
- Raspberry Pi Zero W ใช้เป็นอุปกรณ์สำหรับติดตั้งจริงได้ยากขึ้น เพราะต้องจัดการ Linux Bluetooth, DBus, การ cross-compile และการตั้งค่า Wi-Fi แบบ headless จึงเปลี่ยนแนวทางไปใช้ ESP32 ที่เรียบง่ายกว่า
- บอร์ด ESP32-WROOM ราคาถูกไม่เสถียรเพราะปัญหาหน่วยความจำเมื่ออยู่ใกล้อุปกรณ์ราว 250–400 เครื่อง แต่ Seeed Studio XIAO ESP32C3/S3 ทำงานได้เสถียรระยะยาว และรองรับการตรวจจับได้สูงสุดราว 1000 อุปกรณ์
- สถาปัตยกรรมสุดท้ายคือ ESP32 สแกนจำนวนอุปกรณ์ BLE แล้วส่งไปยัง Cloudflare Functions และ D1 จากนั้นแสดงภาพและพยากรณ์ด้วย Grafana·NeuralProphet โดยยังเหลืองานปรับเทียบความแม่นยำและตรวจสอบความเป็นส่วนตัว
ข้อมูลความหนาแน่นของโรงอาหารที่หายไป
- ตอนเรียนปีหนึ่ง ผู้ให้บริการโรงอาหารของมหาวิทยาลัยคือ Sodexo และ Sodexo ทำสัญญากับ Bluefox เพื่อใช้ เซ็นเซอร์ตรวจจับการใช้งานพื้นที่ ที่แสดงจำนวนคนในโรงอาหาร
- ตามเอกสารที่ได้รับจากคำขอ FOIA อุปกรณ์ของ Bluefox ทำงานโดยนับ MAC address ของสมาร์ตโฟนจากแพ็กเก็ตโฆษณา Bluetooth
- เมื่อนำ API call ไปเชื่อมกับ Grafana ก็สามารถดูความหนาแน่นของโรงอาหารเป็นกราฟแบบเรียลไทม์ได้ จึงใช้หลีกเลี่ยงช่วงเวลาที่คนแน่นได้
- ต่อมาผู้ให้บริการโรงอาหารเปลี่ยนเป็น Aramark และ Aramark ไม่ได้ทำสัญญารวบรวมจำนวนการใช้งานพื้นที่แบบ Bluefox ข้อมูลเดิมจึงหายไป
ใช้ BLE beacon เป็นตัวชี้วัดแทนจำนวนคน
- หัวใจของโปรเจกต์คือการตรวจสอบว่าจำนวน Bluetooth beacon สามารถแทนจำนวนคนจริงและระยะเวลาที่อยู่ในพื้นที่ได้ดีเพียงใด
- บางคนพกอุปกรณ์หลายชิ้น เช่น หูฟังหรือสมาร์ตวอตช์
- บางคนอาจไม่พกอุปกรณ์ หรืออาจปิด Bluetooth ในโทรศัพท์
- สำหรับการประมาณระยะเวลาที่อยู่ในพื้นที่ ตัวแปรสำคัญคือจะใช้ การเปลี่ยนแปลงเข้าออก (churn) ของ MAC address ที่ไม่ซ้ำกันได้หรือไม่ และการสุ่ม MAC address ของผู้ผลิตหลายราย เช่น Android และ Apple จะส่งผลอย่างไร
- วิธีส่งข้อมูลไปยังเซิร์ฟเวอร์กลางที่เป็นธรรมชาติที่สุดคือ Wi-Fi แต่ไม่ใช่ทุกตำแหน่งจะมี Wi-Fi ที่ใช้งานได้ง่าย
- LoRa ก็อาจเป็นตัวเลือกได้ ขึ้นกับการกระจายตัวของ beacon แต่ระยะใช้งานจริงขึ้นอยู่กับ gain ของเสาอากาศและตำแหน่งติดตั้งอย่างมาก
- สำหรับการจัดเก็บข้อมูล มีสิ่งที่ต้องพิจารณา เช่น ควรใช้ฐานข้อมูลอนุกรมเวลาหรือไม่ และในการพยากรณ์แนวโน้มระยะยาวจะสามารถตัดเหตุการณ์พิเศษ เช่น สุดสัปดาห์ Homecoming หรือสัปดาห์สอบปลายภาคออกได้หรือไม่
การตรวจสอบเบื้องต้นด้วยแล็ปท็อป
- การทดลองแรกเป็นโค้ดง่าย ๆ ที่ใช้ Bluetooth adapter ของแล็ปท็อปสแกนเป็นเวลา
xวินาที ทำซ้ำทุกyวินาที แล้วบันทึกลงฐานข้อมูล SQLite - เก็บข้อมูลด้วยการถือแล็ปท็อปไปรอในหลายสถานที่ เช่น โรงอาหาร, Chick-Fil-A และ Starbucks
- ใน Starbucks ซึ่งเป็นพื้นที่เดี่ยวขนาดเล็ก จำนวนอุปกรณ์ค่อนข้างแม่นยำ และอย่างน้อยก็สะท้อน แนวโน้ม การใช้งานพื้นที่ได้อย่างรวดเร็ว
- เมื่อมีคนเดินเข้ามา กราฟจะสูงขึ้นอย่างรวดเร็ว
- ในพื้นที่ใหญ่อย่างโรงอาหาร ไม่สามารถนับจำนวนคนทั้งหมดได้โดยตรง และระยะครอบคลุมของ Bluetooth adapter ก็ไม่แน่ชัด แต่การเพิ่มขึ้นของจำนวน beacon ที่ตรวจพบสอดคล้องกับช่วงเวลาที่นักศึกษาออกจากคาบเรียนแล้วเดินไปกินอาหารได้ดี
เหตุผลที่แนวทาง Raspberry Pi Zero W ติดขัด
- อุปกรณ์แรกที่นึกถึงสำหรับการติดตั้งระยะยาวคือ Raspberry Pi Zero W ซึ่งมีขนาดเล็ก ราคาถูก และมีทั้ง Wi-Fi กับ Bluetooth
- พยายามเขียนโค้ดใหม่ด้วย Rust เพื่อจัดการสถานการณ์อย่างการรีบูต ไม่มีเครือข่าย หรือ adapter หลุด
- ขั้นตอนการจัดการ Linux Bluetooth ในสภาพแวดล้อมแบบ headless ซับซ้อนกว่าที่คาดไว้มาก
- DBus binding ต้องการการตั้งค่าที่เกี่ยวกับการ cross-compile
- แม้ใช้ Cross ก็ยังแก้ปัญหาไม่ได้
- หลังจากจัดการ compiler flags หลายตัว งาน Makefile ที่สูญหาย และการตั้งค่า QEMU bridge ในที่สุดก็รันไบนารีบน Pi ได้
- มีการทำ Wi-Fi connection, ติดตั้งไลบรารีที่จำเป็นตอนเริ่มต้น, ลงทะเบียนไฟล์รันเป็น service และอัปเดตอัตโนมัติแล้ว แต่หลังบูตจริงกลับทำงานไม่ถูกต้อง
- แนวทางนี้เป็นการแบกรับ Linux kernel ทั้งชุด และชิ้นส่วนที่เคลื่อนไหวจำนวนมาก ทั้งที่ฟังก์ชันที่ต้องการมีเพียง Wi-Fi และ Bluetooth ที่เชื่อถือได้เท่านั้น
เปลี่ยนมาใช้ ESP32
- ตามเอกสาร ESP32 เป็นอุปกรณ์ที่มีครบทั้ง Wi-Fi, Bluetooth, การใช้พลังงานต่ำ, ราคาต่ำ และขนาดเล็ก
- ซื้อ ESP32-WROOM-32 แบบสุ่มที่มีจอ OLED จาก Amazon
- มีเป้าหมายเพื่อแสดงข้อมูลเรียลไทม์บนหน้าจอ
- เห็นว่า ecosystem ของ Rust สำหรับ ESP32 ยังไม่เพียงพอ จึงเขียนโค้ดเก็บข้อมูลใหม่ด้วย C++
- ทำให้ OLED ทำงานด้วยการตั้งค่า
SSD1306Wire display(0x3c, 5, 4); - ขอให้ IT ของแคมปัส whitelist MAC address และเขียน Cloudflare Functions กับฐานข้อมูล D1 เป็น backend สำหรับเก็บข้อมูล
ปัญหาหน่วยความจำที่พบในการติดตั้งครั้งแรก
- ติดตั้งอุปกรณ์เก็บข้อมูลในห้องสมุดของแคมปัส และยืนยันจากแล็ปท็อปว่ามีข้อมูลไหลเข้ามา
- ต่อมามีผลลัพธ์แปลก ๆ ที่ดูเหมือนทุกคนออกจากห้องสมุดไปหมดแล้ว สาเหตุคือสเปกต่ำของบอร์ด ESP32 ที่ซื้อมาแบบสุ่ม
- อุปกรณ์ crash เมื่ออยู่ใกล้จำนวนราว 250 อุปกรณ์
- ตอนแรกสงสัยว่าจำนวนผลลัพธ์ถูกเก็บในตัวเลข 1 byte ทำให้ติดที่ราว 255 รายการ
- แต่เมื่อตรวจด้วย
Serial.printพบว่า crash แบบสุ่มในช่วงใกล้เคียงกัน เช่น 249, 265 จึงไม่ใช่ integer overflow ธรรมดา
- ระหว่างสแกน ระบบเก็บผลลัพธ์ทั้งหมดไว้ใน data structure จนจบ ทำให้ข้อมูลจำนวนมาก เช่น ความแรงสัญญาณ, บริการโฆษณา, manufacturer ID สะสมขึ้นมา และ RAM ขนาดเล็กเต็ม
- ค่าที่ต้องการจริง ๆ มีเพียงจำนวนอุปกรณ์ที่ไม่ซ้ำกัน โครงสร้างที่เก็บผลสแกนทั้งหมดจึงเกินความจำเป็น
Hash set ที่ทำเองและข้อจำกัด
- วิธีแก้คือเขียน data structure ใน C++ เอง เพื่อสร้าง hash set ขนาดเล็ก
- ในแต่ละ callback จะใส่ MAC address ลงใน hash set แล้วล้างโครงสร้างผลลัพธ์ในตัวเพื่อคืนหน่วยความจำ
- วิธีนี้มีข้อเสียคือโครงสร้างผลลัพธ์ในตัวสูญเสียข้อมูลสำหรับตรวจซ้ำ ทำให้เกิด callback ทุกครั้งที่มีแพ็กเก็ตโฆษณา BLE
- ใน
addToSetมีการตรวจซ้ำใน hash set - แต่ callback ซ้ำเกิดขึ้นหลายร้อยครั้ง และการ allocate/free โครงสร้างผลลัพธ์ซ้ำ ๆ ทำให้เกิด heap churn
- ใน
- ถึงอย่างนั้นก็เห็นว่าการตรวจ hash map ที่มีรายการไม่เกิน 1000 รายการบ่อย ๆ ดีกว่าการติดเพดานความจุที่ประมาณ 250 คน
เลือกบอร์ด ESP32 ที่เสถียรกว่า
- ช่วงปิดเทอมฤดูใบไม้ร่วงลองทดสอบระยะยาว 5 วัน แต่ crash อีกครั้งเมื่ออยู่ใกล้ราว 400 อุปกรณ์
- ปัญหาเกิดหลังใช้งานราว 3 ชั่วโมง และแม้ใส่การรีบูตเป็นระยะ ก็เกิดอาการที่แต่ละการสแกนคืนค่า 0 อุปกรณ์ทันที
- ทดสอบบอร์ดหลายรุ่น
- Seeed Studio XIAO ESP32S3/C3
- WaveShare ESP32S3 Zero
- ESP32-WROOM with OLED แบบไม่มีแบรนด์
- Orange Pi Zero W
- Raspberry Pi Zero W
- บอร์ดเดียวที่ทำงานได้เสถียรระยะยาวคือ XIAO ESP32C3/S3 และทั้งสองรุ่นทำงานได้ในระดับที่ยอมรับได้
- ตัวเลือกสุดท้ายคือ XIAO ESP32C3
- ชอบตรงที่ใช้ RISC-V
- ราคาถูกกว่า
- เมื่อเปลี่ยนมาใช้บอร์ดจากผู้ผลิตที่ดีกว่า SRAM ก็เพิ่มขึ้น และแม้เก็บโครงสร้างผลลัพธ์พื้นฐานไว้แทน hash map ที่ทำเอง ก็ crash น้อยลง
- ไม่พบสัญญาณว่าช้าลงแม้ตรวจจับได้สูงสุดราว 1000 อุปกรณ์ และ heap กับ callback churn ก็น่าจะลดลงด้วย
รูปแบบการเคลื่อนที่ที่เห็นจากหน้าต่างหอพัก
- หลังหาอุปกรณ์ที่เสถียรได้แล้ว จึงย้ายอุปกรณ์ไปไว้ริมหน้าต่างห้องพักในหอ เพื่อให้ทดลองติดตั้งซ้ำได้ง่าย
- เมื่อดูข้อมูลรายวัน จะเห็น peak ในช่วงเปลี่ยนคาบเรียน
- แม้อุปกรณ์อยู่ในหอพัก แต่ไม่ได้วัดเฉพาะผู้อยู่อาศัยในหอเป็นหลัก
- หากวัดเฉพาะผู้อยู่อาศัยในหอ คาดว่าค่าจะสูงสุดตอนเช้าตรู่ แล้วลดลงเมื่อเข้าสู่ช่วงกลางวัน
- เพราะวางหันออกไปนอกหน้าต่าง จึงตรวจจับนักศึกษาที่เดินไปยังอาคารเรียนใกล้เคียงสองอาคารเป็นหลัก
- peak แถว 7:50 น. สอดคล้องกับช่วงก่อนคาบ 8 โมงของ Ewell Hall และ Washington Hall
- peak เวลา 8:50, 9:50, 10:50 สอดคล้องกับช่วงเดินไปเรียนคาบ 9 โมง, 10 โมง และ 11 โมงตามลำดับ
- อุปกรณ์ดูเหมาะสำหรับ ติดตามแนวโน้ม การเคลื่อนที่ของนักศึกษารอบ ๆ และระยะเสาอากาศดูเหมือนครอบคลุมถึง Washington Hall ราว 160ft และถึง Ewell ราว 100ft
- ความสูงระดับชั้น 3 ก็ดูเหมือนช่วยเพิ่มระยะตรวจจับด้วย
การพยากรณ์และงานตรวจสอบที่ยังเหลือ
- ข้อมูลที่เก็บมีแนวโน้มตามชั่วโมง วัน และสัปดาห์จำนวนมาก จึงเหมาะกับงาน พยากรณ์อนุกรมเวลา อย่าง NeuralProphet
- หลังเพิ่มฟังก์ชันพยากรณ์ ตอนนี้สามารถพยากรณ์แนวโน้มรายวันได้ดี
- แนวโน้มระยะยาวระดับสัปดาห์ เดือน และฤดูกาล น่าจะลู่เข้าหากันเมื่อมีข้อมูลเพียงพอ
- ยังมีคำถามอีกมากที่ยังไม่ได้แก้
- จำนวน BLE beacon ใช้แทนจำนวนประชากรจริงได้ดีเพียงใด
- จะสร้างค่าสัมประสิทธิ์ปรับเทียบ เช่น
xbeacon เท่ากับประมาณ0.7xคน ได้หรือไม่ เพราะบางคนพกหลายอุปกรณ์ - ในอาคารวิทยาการคอมพิวเตอร์ จำนวนอุปกรณ์จะมากจนสัดส่วน beacon ต่อคนสูง หรือจะต่ำเพราะมีคนปิด Bluetooth มากกว่า
- อาคารพนักงานจะมีสัดส่วนต่ำกว่านักศึกษาไหม เพราะพกหลายอุปกรณ์น้อยกว่า
- โรงอาหารจะมีสัดส่วนต่ำกว่าหรือไม่ เพราะไม่ค่อยมีการใช้แล็ปท็อป·iPad ร่วมกันเหมือนในห้องเรียน
- ยังมีวิธีปรับปรุงความแม่นยำที่เหลืออยู่
- ตั้งค่า RSSI ขั้นต่ำ เพื่อตัดสัญญาณอ่อนออก
- กรองให้นับเฉพาะ manufacturer ID ของ Apple และ Android ทั่วไป
- ปัญหาที่ Apple Watch, AirPods, MacBook ฯลฯ ยังถูกนับรวมอยู่
- ในแนวทางปัจจุบันที่ติดตามเพียงจำนวน beacon ล้วน ๆ และไม่ติดตาม MAC address จริง จำเป็นต้องเพิ่ม noise เพิ่มหรือไม่
- การระบุตัวผู้ใช้รายเดียวจากจำนวนอุปกรณ์เพียงอย่างเดียวทำได้จริงหรือไม่
- การเลือกระยะเวลาสแกน ซึ่งถ้าสั้นเกินไปจะหาอุปกรณ์หลายร้อยเครื่องไม่ครบ แต่ถ้ายาวเกินไปจะนับอุปกรณ์ที่ออกไปแล้ว
- ความยาวการสแกนแบบไดนามิกที่จบการสแกนเมื่อไม่มีการเปลี่ยนแปลงเป็นเวลาหนึ่ง
รูปแบบการติดตั้งที่เป็นไปได้
- มีแผนตรวจสอบข้อมูลในสถานที่ที่สามารถรู้จำนวนคนจริงได้ง่าย
- ยิมที่มีบันทึกการเข้าออก
- สถานที่อย่างโรงอาหารหรือ Starbucks ที่มีทางเข้าออกจำกัด
- กำลังหารือกับอาจารย์เกี่ยวกับกรณีใช้งานในคณะกรรมการของมหาวิทยาลัยหรือความเป็นไปได้ด้านงานวิจัยเชิงวิชาการ
- กำลังพิจารณาแนวทางขายให้ร้านค้าออฟไลน์ใช้วัดแนวโน้มการใช้งานพื้นที่ด้วย
- การตั้งค่าของหนึ่งหน่วยติดตั้งถูกจัดเป็นแพ็กเกจไว้ค่อนข้างดี
- ตั้งค่า Wi-Fi ใน configuration
- หากมี portal ให้เครือข่าย whitelist MAC address
- Wi-Fi แบบเปิดหรือมีรหัสผ่านจะเชื่อมต่อเมื่อบูต
- เปลี่ยน machine ID และ site ID ใน configuration
- เสียบอุปกรณ์เข้ากับปลั๊กไฟในตำแหน่งกลางหรือสะดวก
- ตั้งค่า Grafana dashboard ใน backend เพื่ออ่านข้อมูลจากแต่ละอุปกรณ์
- ตั้งค่า Grafana dashboard เพื่ออ่านแนวโน้มที่พยากรณ์เป็นกราฟแยกต่างหาก
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
เราได้สร้างธุรกิจจริง (occuspace.io) ด้วยเทคโนโลยีนี้ และเคยจัดการกับคำถามส่วนใหญ่ที่ถูกหยิบยกขึ้นมาแล้ว
จำนวน BLE beacon มีความสัมพันธ์กับจำนวนคนที่อยู่ในพื้นที่สูงมาก แต่ค่าสัมประสิทธิ์สหสัมพันธ์แตกต่างกันมากระหว่างร้านอาหาร ห้องเรียน และแต่ละชั้นของห้องสมุด ดังนั้นการใช้คุณลักษณะที่ซับซ้อนกว่านี้ร่วมด้วยมักจะดีกว่า
การประเมินเวลาที่คนอยู่ในพื้นที่จากระยะเวลาที่มองเห็น BLE beacon นั้นมองว่าไม่แม่นยำ เพราะ Bluetooth MAC จะถูกสุ่มใหม่ทุก 8–20 นาที ขึ้นอยู่กับผู้ผลิต
วิธีตัด RSSI ที่อ่อนออกเพื่อนับเฉพาะอุปกรณ์ที่อยู่ใกล้เป็นไอเดียที่ดี แต่ค่า threshold จะต่างกันตามประเภทของพื้นที่และตำแหน่งติดตั้งเซ็นเซอร์
ถ้าความต้องการเดิมคือ “หลีกเลี่ยงความแออัดในโรงอาหาร” การรู้คร่าว ๆ ว่าสูงหรือต่ำก็น่าจะพอแล้ว
ในเชิงธุรกิจก็สงสัยว่าลูกค้าคาดหวัง ความแม่นยำสูง หรือไม่ และเป็นทุกคนหรือแค่บางส่วน
ต่อให้ MAC address ถูกสุ่ม ก็น่าจะมีวิธีระบุประเภทอุปกรณ์เพื่อนับเฉพาะโทรศัพท์และตัดหูฟังออกไปได้ไม่ใช่หรือ
คิดว่าน่าจะยากเพราะสัญญาณแพร่ไปไกลกว่า และกำลังทำสตาร์ทอัพที่ต้องติดตามว่ามีคนอยู่ในคอร์ตเทนนิสหรือไม่
บางทีอาจติดตั้งอุปกรณ์ Bluetooth ไว้ที่มุมของพื้นที่กลางแจ้ง แล้วใช้ความแรงสัญญาณของมันเป็นค่า threshold ก็ได้
ถ้าติดตาม Wi‑Fi, Wi‑Fi MAC และข้อมูลวิดีโอแล้วเชื่อมโยงกัน อาจทำอะไรได้มากขึ้น
น่ารู้ไว้ในฐานะหนึ่งในคู่แข่งที่เป็นไปได้
อาคารมหาวิทยาลัยสาย STEM อาจมีอุปกรณ์ Bluetooth มากกว่า 3 เครื่องต่อคน 1 คน แต่บางสถานที่อาจมีน้อยกว่า 1 เครื่องต่อคน
เป็นบทความที่ยอดเยี่ยม
หลังจากทดสอบ Seeed Studio XIAO ESP32S3/C3, WaveShare ESP32S3 Zero, Unbranded ESP32-WROOM with OLED, Orange Pi Zero W และ Raspberry Pi Zero W แล้ว เขาบอกว่าอุปกรณ์เดียวที่ทำงานได้นานและเสถียรจนถึงตอนนี้ราวหนึ่งเดือนคือ XIAO ESP32C3/S3 ซึ่งผมสงสัยว่าอาจเป็นปัญหาเรื่องไฟเลี้ยง
ตระกูล ESP32 อาจไวต่อความผันผวนของแรงดันขณะส่งสัญญาณ จึงขอแนะนำอย่างยิ่งให้เพิ่ม คาปาซิเตอร์ ขนาดใหญ่บนรางไฟ
ทั้ง RPi และ ESP อาจจุกจิกกับอะแดปเตอร์ไฟ สายเคเบิล และความยาวสาย ส่วน SD card ของ RPi ก็เสียง่ายเมื่อไฟดับกะทันหัน
ถึงอย่างนั้น ทุกตัวก็ควรอยู่ได้นานเกินหนึ่งเดือน และ Pi กับ ESP ของผมก็ทำงานต่อเนื่องเป็นเดือน ๆ
อยากรู้ผลลัพธ์ถ้าใส่คาปาซิเตอร์ที่ใหญ่ขึ้นให้ ESP32 หรือ Pi ตัวอื่น ๆ
ESP32 ถูกใช้กันแพร่หลายมาก ดังนั้นสาเหตุน่าจะเป็น ESP32 จากผู้ผลิตไม่ทราบชื่อ ที่ซื้อครั้งแรกซึ่งทนใช้งานนานไม่ได้
พอเปลี่ยนมาใช้สินค้าจากผู้ผลิตที่เหมาะสม ปัญหาก็หายไป และ ESP32 ก็ทำงานได้ดี
Raspberry Pi แทบจะใช้งานไม่ได้จริง ๆ เพราะทำให้งานที่ควรมีแค่สแกน Bluetooth กับเรียก HTTP ซับซ้อนเกินไป และพยายามจัดการอะไรเยอะเกินไป
จ่ายไฟ 5V 1A ตรงจากปลั๊กผ่าน USB‑C ดังนั้นไม่น่าใช่ปัญหาไฟเลี้ยง แต่ Xiao ESP32-S3 ก็มีปัญหาเป็นครั้งคราวเหมือนกัน และเท่าที่จำได้ คอร์ XTensa กินไฟมากกว่า ESP32-C3 ที่ใช้ RISC‑V จึงควรลองตรวจสอบดู
มีอัปเดตผ่าน ESPHome เป็นครั้งคราว แต่ก็ไม่มีปัญหาเป็นพิเศษ
บางตัวทำหลายงานพร้อมกัน เช่น ตัวหนึ่งเป็น Bluetooth proxy ในโฮมออฟฟิศ และยังควบคุมแถบไฟที่ติดตั้งตามแผ่นผนัง Skadis ด้วย
ใช้สินค้ายี่ห้อสุ่ม ๆ ที่ซื้อจากบริษัทชื่อ “AZDelivery” บน Amazon และไม่ได้ทำอะไรเป็นพิเศษ
ใส่ไว้ในเคสพิมพ์ 3D และปกติต่อกับอะแดปเตอร์อย่างน้อย 5V/1A ด้วยสายสั้น ๆ ความยาวต่ำกว่า 30 ซม.
จะบันทึกลงดิสก์เฉพาะตอนรัน
lbu commit -dและโดยพื้นฐานแล้วบูตขึ้นมาบน tempfs แบบหนึ่งนี่เป็นโปรเจกต์ที่นักศึกษาทำในมหาวิทยาลัย และมีการติดตามคนในระดับหนึ่ง จึงเป็นโอกาสดีที่จะถามอาจารย์ว่า ถ้าเป็นงานวิจัยต้องมี ขั้นตอนวิจัยที่เกี่ยวข้องกับมนุษย์ แบบไหนบ้าง
การถามอาจารย์อาจง่ายกว่าถาม IRB ของมหาวิทยาลัย
IRB อาจปฏิเสธคุยโดยบอกว่าไม่อยู่ในเขตอำนาจ หรืออาจระแวงว่าทำไมไม่มาคุยให้เร็วกว่านี้
นโยบายความเป็นส่วนตัวและความปลอดภัยของฝ่าย IT ในแคมปัสก็อาจมีผลด้วย
แม้เว็บไซต์ แอป และอุปกรณ์ IoT ทั่วไปจะละเมิดผู้คนหนักกว่านี้มาก แต่มหาวิทยาลัยบางครั้งก็มีเป้าหมายที่จะทำให้ดีกว่าโลกภายนอก
อาจไม่ราบรื่นก็ได้ เลยไม่ได้ใส่ไว้ในเนื้อหา
beacon กำลัง broadcast อยู่ และมีความเป็นไปได้สูงว่าถูกเก็บข้อมูลโดยไม่ขอความยินยอมในแทบทุกที่ที่เราไป
บ้านผมอยู่ตรงสี่แยก ทำให้มีอุปกรณ์ Bluetooth จำนวนมากมารวมตัวอยู่แถวนี้บ่อย ๆ ครั้งหนึ่งผมเคยคิดจะติดตั้งตัวติดตาม BLE เล่น ๆ เพื่อดูว่าจะเก็บอะไรได้บ้าง และจากข้อมูลจะอนุมานอะไรได้
ตัวอย่างเช่น ผมมั่นใจว่ามีความสัมพันธ์ระหว่างคุณภาพอากาศในบ้านที่แย่ลงกับการมาถึงของอุปกรณ์ Bluetooth ในบริเวณนั้น
ประโยคที่ว่า “ใน nerd snipe แบบนี้ การไม่สูญเสียแรงส่งเป็นเรื่อง สำคัญถึงตาย” ทำเอาขำ
สมองเนิร์ดของผมก็เคยใช้ตรรกะนี้โน้มน้าวให้ผมใช้เงินมาหลายครั้งแล้ว
มันมีช่วงที่รู้สึกอยากทำโปรเจกต์มากกว่าอย่างชัดเจน และโดยเฉพาะฤดูหนาว ผมจะทำโปรเจกต์อิเล็กทรอนิกส์มากขึ้นและเล่นเกมมากขึ้นด้วย
“ซีซัน” เล่นเกมของผมก็เพิ่งเริ่มอีกครั้งเมื่อสัปดาห์ที่แล้ว
การเปลี่ยนอย่างมากจาก “วันนี้อยากทำอะไรนะ?” ไปเป็น “ซีซันนี้รู้สึกอยากทำอะไรและมีเวลาทำอะไรบ้าง?” ส่วนใหญ่เป็นผลจากอายุมากขึ้นและมีลูก แต่ช่วงเวลาที่มีทั้งความตั้งใจและเวลาสำหรับโปรเจกต์แบบนี้ห่างกันมากเสียจนถ้าเสียแรงส่งไป อาจกว่าจะกลับมาอีกทีก็อีก 1 ปี หรืออาจไม่ได้กลับมาเลย
ผมมีโปรเจกต์อิเล็กทรอนิกส์หนึ่งอันที่เริ่มไว้เมื่ออย่างน้อย 10 ปีก่อน ใช้เงินไปพอสมควร และยังดื้อว่าจะทำให้เสร็จสักวัน จนกลายเป็นโปรเจกต์ฉาวโฉ่ในหมู่ครอบครัว
นาฬิกาปลุกของผมประกอบด้วย ESP32, แผง LED ค่อนข้างใหญ่, บัซเซอร์ และเซ็นเซอร์ PIR
มันไม่ได้แสดงเวลา แต่แจ้งเตือนด้วยบัซเซอร์และไฟกะพริบ ค่อย ๆ ทำให้ห้องสว่างขึ้น หรือในตอนกลางคืน หลังจากไฟทั้งหมดดับไปแล้วระยะหนึ่งก็จะค่อย ๆ ทำให้มืดลง
ข้อดีเพิ่มเติมที่พบภายหลังคือ แม้ AP จะไม่ได้อยู่ระหว่างผมกับ ESP ผมก็สะท้อน RF ได้มากพอจนแค่ดู ล็อก RSSI ก็รู้ได้ไม่เพียงเวลาที่อยู่บนเตียง แต่ยังรู้ถึงจังหวะที่พลิกตัวตอนกลางคืนด้วย
https://imgur.com/a/VixOlu5
แม้จะมีคำเตือน แต่ไม่มีเนื้อหาวาบหวิว
สีเขียวตรงกลางคือ RSSI, สีเหลืองด้านล่างคือเซ็นเซอร์ PIR, ส่วนด้านบนเป็นข้อมูล Mi Band 3 ผสมกับคำอธิบายช่วงเวลาที่อยู่บนเตียง
ใช่ ผมอ่านข่าวอยู่นานก่อนหลับและก่อนตื่นจริง ๆ
อยากรู้ว่าคุณจัดการโปรเจกต์ ESP32 ให้ ดูเป็นผลิตภัณฑ์ ได้อย่างไร
ไม่ได้หมายถึงการผลิตจำนวนมาก แต่หมายถึงอยากทำให้มันเป็นอุปกรณ์แยกชิ้น ไม่ใช่บอร์ดที่มีสายไฟโผล่ออกมาเต็มไปหมด
หลายหน้าโชว์แต่บอร์ดเปลือย ๆ แต่ในความเป็นจริงต้องแพ็กเกจมันด้วย
ถ้าเป็นคนสายซอฟต์แวร์แบบผม ก็น่าจะยอมจ่ายเพิ่มนิดหน่อยเพื่อได้รูปแบบที่จัดเก็บเรียบร้อย มากกว่าจะลงมือดัดแปลงเองสารพัดอย่าง
ถ้ามีเครื่องพิมพ์ 3D ก็ทำ งานพิมพ์ 3D ได้
ถ้าถนัดอะคริลิก ก็ใช้เลเซอร์คัตเตอร์ตัดเป็นรูปทรงแล้วเจาะรูไม่กี่รู ก็กลายเป็นกล่องได้
ถ้าไม่มีอะไรเลยและต้องการแค่กล่องแบบขั้นต่ำสุด ก็ใช้ Altoids Tin ราคาแถว ๆ 25 ดอลลาร์ต่อ 12 ชิ้นได้ แต่ข้างในมีมินต์ที่ไม่มีประโยชน์กับงานนี้อยู่ ก็ทิ้งไปแล้วใส่โปรเจกต์ลงไปแทน
ถ้าอยากได้อะไรที่ดีกว่ากระป๋อง Altoids นิดหน่อย ก็ซื้อ Hammond Enclosure ได้
(https://www.hammfg.com/electronics/small-case)
ถ้าเป็นผม อาจพันด้วยเทปพันสายไฟ แล้วพันทับด้วยอะไรอย่างเทปผ้า จากนั้นใช้ปากกาเมจิกระบายสีเอา
โดยปกติจะมีหน้าแปลนที่เจาะรูไว้ล่วงหน้าหลายจุดให้ยึดบอร์ดด้วยสกรูได้ ส่วนรูภายนอกสำหรับอินพุต/เอาต์พุตก็เจาะเองตามต้องการ
ผู้ผลิตบางรายมีดังนี้ และถ้าซื้อบอร์ดพัฒนาหรือชิ้นส่วนอื่นอยู่แล้ว ก็มักหาได้จาก adafruit หรือ digikey ด้วยเพื่อประหยัดค่าส่ง
https://www.hammfg.com/
https://www.budind.com/
http://takachi-enclosure.com/
https://www.adafruit.com/product/903
โปรเจกต์ส่วนใหญ่ที่เห็นไม่ได้ถูกทำให้เป็นผลิตภัณฑ์
มันเป็นโปรเจกต์ครั้งเดียวของแฮกเกอร์ ถ้าคนอื่นนำไปใช้ประโยชน์ได้ก็ดี แต่ไม่ใช่เป้าหมาย จึงไม่จำเป็นต้องแพ็กเกจ และบางครั้งก็แค่ยัดลงกล่อง
ถ้าอยากได้ของที่ดูดีขึ้น ก็ต้องให้ใครสักคนออกแบบเคส
คนนั้นอาจเป็นตัวคุณเองก็ได้
ESP32 ถูกออกแบบมาให้ใส่ในผลิตภัณฑ์ของคุณเองได้ง่าย ดังนั้นแนวทางคือออกแบบแผงวงจรกับเคสให้เข้ากัน ซื้อชิป ESP32 จำนวนมาก แล้วประกอบลงบนบอร์ด
บอร์ดที่ซื้อมาเพื่อทำต้นแบบ โดยทางการแล้วเป็นเพียง บอร์ดอ้างอิง เท่านั้น และไม่ได้คาดหวังให้เป็นของที่ส่งมอบขั้นสุดท้าย แต่ในความเป็นจริงก็มีบ่อยที่ส่งบอร์ดเดิมออกไปเลย
เพราะมันเล็ก ราคาถูก และมีคนออกแบบบอร์ดที่ยากให้เสร็จแล้ว
ถ้าผลิตภัณฑ์เป็นมาตรฐานพอ อาจข้ามขั้นตอนนี้ได้
จากนั้นติดต่อผู้ผลิตในพื้นที่และผู้ผลิตในตลาดที่ใหญ่กว่าเพื่อขอตัวอย่าง แล้วตรวจสอบว่าทำงานได้ถูกต้องหรือไม่
ถ้าพอใจก็เริ่มสั่งล็อตเล็ก ๆ
ควรออกแบบ กระบวนการประกันคุณภาพ หรือหาผู้เชี่ยวชาญมาช่วย เพื่อไม่ให้ผู้ผลิตส่งของเสียมา 20%
นำไปวางขายในร้านออฟไลน์ หรือทำเว็บไซต์ แล้วขายผ่านพอร์ทัลอย่าง Amazon เป็นต้น
คุยกับลูกค้า รับฟังฟีดแบ็ก แล้วค่อย ๆ ปรับปรุงทุกขั้นตอนได้
ฟังดูน่าหนักใจ แต่จากการทำงานในสตาร์ทอัพสมาร์ตโฮมขนาดเล็ก ผมได้เรียนรู้ว่าใน Shenzhen มีทั้งอุตสาหกรรมพร้อมช่วยให้ผู้ก่อตั้งทำผลิตภัณฑ์ในฝันให้เป็นจริง และสามารถจ้างคนมาช่วยในทุกขั้นตอนได้
จากประสบการณ์ของเรา บริการฝั่งจีนดีกว่า ถูกกว่า และเร็วกว่าข้อเสนอจากยุโรปมาก
ส่วนที่เหลือของภาชนะใส่อาหารกลับบ้านก็กลายเป็น enclosure
เจาะรูบนภาชนะให้สายไฟเข้าออก
ถ้าอยากให้ดูดีขึ้นนิดหน่อย ก็ใช้ภาชนะ Tupperware
ผมตามประเด็นเรื่องการเก็บข้อมูลไว้ในหน่วยความจำไม่ทันทั้งหมด และตอนนี้ดูเหมือนจะแก้ได้แล้ว แต่ถ้าใช้ อัลกอริทึมประมาณค่า cardinality เพื่อประมาณจำนวน beacon ID ที่ไม่ซ้ำ ก็น่าจะทำได้ด้วยพื้นที่คงที่
https://en.wikipedia.org/wiki/Count-distinct_problem
เมื่อไม่นานมานี้ผมลองเอาไปที่การแข่งขันฟุตบอล เพื่อ stress test กับฝูงชนที่ใหญ่ที่สุดเท่าที่เข้าถึงได้อย่างรวดเร็ว
ถ้ามันสแกนได้หลายพันรายการโดยไม่มีปัญหา ผมก็จะถือว่าค่อนข้างทนทาน
ถึงอย่างนั้น การลองศึกษา โครงสร้างข้อมูลประมาณค่าขนาดคงที่ ก็น่าสนุกมากจริง ๆ และผมจะต้องลองดูแน่นอน
หนึ่งในส่วนที่ผมชอบที่สุดของโปรเจกต์นี้คือการได้เจาะลึกแนวคิดวิทยาการคอมพิวเตอร์ที่ลึกและน่าสนใจกว่า โดยไม่มีแรงกดดันว่าต้องใช้วิธีแก้ที่ง่ายที่สุด
ผมไม่ได้กำลังพัฒนาโซลูชันที่ต้องส่งมอบ ASAP แต่กำลังเกาในจุดที่คันอยู่
ส่วนที่ว่า “การจัดการ Linux Bluetooth แบบ headless นั้นเจ็บปวดมาก ต้องใช้เวทมนตร์ cross-compile กับ DBus binding และแม้แต่ Cross ก็ช่วยแก้ไม่ได้” ตรงกับประสบการณ์ของผมเช่นกัน
เพราะตอนนั้นผมทำอย่างอื่นอยู่ สุดท้ายเลยตัดสินใจให้สองอุปกรณ์อยู่ในเครือข่าย Wi‑Fi เดียวกัน แล้วสแกนหา pi.local แทน
แต่ก็อยากรู้ว่า crate อื่น ๆ ที่ถ้าไม่มีไลบรารีแล้วไม่ปฏิเสธตั้งแต่ตอน build แต่ไป crash ตอน runtime นั้นทำงานกันอย่างไร
ดูเหมือนผู้เขียนจะพยายามทำแบบ embedded เลยต้องลำบากกับอินเทอร์เฟซระดับต่ำกว่ามาก
ในภาษาระดับสูง ปัญหานี้ถูกแก้มานานแล้ว
ถ้าสุดท้ายตัวติดตามถูกวางไว้ที่ประตูข้างคอมพิวเตอร์ การใช้ RPi ที่รัน Python อยู่แล้วก็น่าจะเพียงพอ
https://github.com/home-assistant/core/blob/dev/homeassistan...
https://www.home-assistant.io/integrations/bluetooth_tracker...
ควรบอกให้ชัดว่านี่คือ สำหรับ BLE
ตอนแรกผมนึกว่าอิงจากอัตราการเต้นหัวใจ ความร้อน การเข้าออก หรืออะไรที่เป็นกายภาพมากกว่านี้
อีกอย่าง ความไวในการรับสัญญาณของ ESP32 อยู่ราว -94 dBm ซึ่งถือว่าค่อนข้างแย่ และอุปกรณ์ส่วนใหญ่ไปได้ถึง -100, -102 หรือแม้แต่ -104 dBm
ความต่างนี้ค่อนข้างมาก
ESPresence เป็นโปรเจกต์ที่น่าสนใจ และทำงานบน ESP32-C3 ได้ด้วย
มันถูกออกแบบมาให้เน้นการระบุว่าอยู่ในห้องไหนมากกว่า