2 คะแนน โดย GN⁺ 2023-11-14 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • หลังสัญญาของ 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 ใช้แทนจำนวนประชากรจริงได้ดีเพียงใด
    • จะสร้างค่าสัมประสิทธิ์ปรับเทียบ เช่น x beacon เท่ากับประมาณ 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 ความคิดเห็น

 
GN⁺ 2023-11-14
ความคิดเห็นจาก Hacker News
  • เราได้สร้างธุรกิจจริง (occuspace.io) ด้วยเทคโนโลยีนี้ และเคยจัดการกับคำถามส่วนใหญ่ที่ถูกหยิบยกขึ้นมาแล้ว
    จำนวน BLE beacon มีความสัมพันธ์กับจำนวนคนที่อยู่ในพื้นที่สูงมาก แต่ค่าสัมประสิทธิ์สหสัมพันธ์แตกต่างกันมากระหว่างร้านอาหาร ห้องเรียน และแต่ละชั้นของห้องสมุด ดังนั้นการใช้คุณลักษณะที่ซับซ้อนกว่านี้ร่วมด้วยมักจะดีกว่า
    การประเมินเวลาที่คนอยู่ในพื้นที่จากระยะเวลาที่มองเห็น BLE beacon นั้นมองว่าไม่แม่นยำ เพราะ Bluetooth MAC จะถูกสุ่มใหม่ทุก 8–20 นาที ขึ้นอยู่กับผู้ผลิต
    วิธีตัด RSSI ที่อ่อนออกเพื่อนับเฉพาะอุปกรณ์ที่อยู่ใกล้เป็นไอเดียที่ดี แต่ค่า threshold จะต่างกันตามประเภทของพื้นที่และตำแหน่งติดตั้งเซ็นเซอร์

    • สงสัยว่าจริง ๆ แล้วต้องการจำนวนที่แม่นยำบ่อยแค่ไหน
      ถ้าความต้องการเดิมคือ “หลีกเลี่ยงความแออัดในโรงอาหาร” การรู้คร่าว ๆ ว่าสูงหรือต่ำก็น่าจะพอแล้ว
      ในเชิงธุรกิจก็สงสัยว่าลูกค้าคาดหวัง ความแม่นยำสูง หรือไม่ และเป็นทุกคนหรือแค่บางส่วน
      ต่อให้ MAC address ถูกสุ่ม ก็น่าจะมีวิธีระบุประเภทอุปกรณ์เพื่อนับเฉพาะโทรศัพท์และตัดหูฟังออกไปได้ไม่ใช่หรือ
    • สงสัยว่าการติดตามการมีคนอยู่ในพื้นที่แบบนี้ทำงานได้แม่นยำใน กลางแจ้ง ด้วยหรือไม่
      คิดว่าน่าจะยากเพราะสัญญาณแพร่ไปไกลกว่า และกำลังทำสตาร์ทอัพที่ต้องติดตามว่ามีคนอยู่ในคอร์ตเทนนิสหรือไม่
      บางทีอาจติดตั้งอุปกรณ์ Bluetooth ไว้ที่มุมของพื้นที่กลางแจ้ง แล้วใช้ความแรงสัญญาณของมันเป็นค่า threshold ก็ได้
    • Meraki ก็ให้ข้อมูลแบบนี้เป็นส่วนหนึ่งของฟีเจอร์จัดการเครือข่ายผ่านคลาวด์ด้วย
      ถ้าติดตาม 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 จากผู้ผลิตไม่ทราบชื่อ ที่ซื้อครั้งแรกซึ่งทนใช้งานนานไม่ได้
      พอเปลี่ยนมาใช้สินค้าจากผู้ผลิตที่เหมาะสม ปัญหาก็หายไป และ ESP32 ก็ทำงานได้ดี
      Raspberry Pi แทบจะใช้งานไม่ได้จริง ๆ เพราะทำให้งานที่ควรมีแค่สแกน Bluetooth กับเรียก HTTP ซับซ้อนเกินไป และพยายามจัดการอะไรเยอะเกินไป
      จ่ายไฟ 5V 1A ตรงจากปลั๊กผ่าน USB‑C ดังนั้นไม่น่าใช่ปัญหาไฟเลี้ยง แต่ Xiao ESP32-S3 ก็มีปัญหาเป็นครั้งคราวเหมือนกัน และเท่าที่จำได้ คอร์ XTensa กินไฟมากกว่า ESP32-C3 ที่ใช้ RISC‑V จึงควรลองตรวจสอบดู
    • ใน Home Automation มี ESP32 หลายตัว รับงานโครงสร้างพื้นฐานสำคัญอยู่ และทำงานมาเกือบ 1 ปีโดยไม่มีปัญหา
      มีอัปเดตผ่าน ESPHome เป็นครั้งคราว แต่ก็ไม่มีปัญหาเป็นพิเศษ
      บางตัวทำหลายงานพร้อมกัน เช่น ตัวหนึ่งเป็น Bluetooth proxy ในโฮมออฟฟิศ และยังควบคุมแถบไฟที่ติดตั้งตามแผ่นผนัง Skadis ด้วย
      ใช้สินค้ายี่ห้อสุ่ม ๆ ที่ซื้อจากบริษัทชื่อ “AZDelivery” บน Amazon และไม่ได้ทำอะไรเป็นพิเศษ
      ใส่ไว้ในเคสพิมพ์ 3D และปกติต่อกับอะแดปเตอร์อย่างน้อย 5V/1A ด้วยสายสั้น ๆ ความยาวต่ำกว่า 30 ซม.
    • บน RPi ผมชอบใช้ Alpine มากเพื่อลดการเขียนลง SD card
      จะบันทึกลงดิสก์เฉพาะตอนรัน lbu commit -d และโดยพื้นฐานแล้วบูตขึ้นมาบน tempfs แบบหนึ่ง
  • นี่เป็นโปรเจกต์ที่นักศึกษาทำในมหาวิทยาลัย และมีการติดตามคนในระดับหนึ่ง จึงเป็นโอกาสดีที่จะถามอาจารย์ว่า ถ้าเป็นงานวิจัยต้องมี ขั้นตอนวิจัยที่เกี่ยวข้องกับมนุษย์ แบบไหนบ้าง
    การถามอาจารย์อาจง่ายกว่าถาม IRB ของมหาวิทยาลัย
    IRB อาจปฏิเสธคุยโดยบอกว่าไม่อยู่ในเขตอำนาจ หรืออาจระแวงว่าทำไมไม่มาคุยให้เร็วกว่านี้
    นโยบายความเป็นส่วนตัวและความปลอดภัยของฝ่าย IT ในแคมปัสก็อาจมีผลด้วย
    แม้เว็บไซต์ แอป และอุปกรณ์ IoT ทั่วไปจะละเมิดผู้คนหนักกว่านี้มาก แต่มหาวิทยาลัยบางครั้งก็มีเป้าหมายที่จะทำให้ดีกว่าโลกภายนอก

    • กำลังคุยกับอาจารย์เรื่องนั้นอยู่พอดี
      อาจไม่ราบรื่นก็ได้ เลยไม่ได้ใส่ไว้ในเนื้อหา
    • สงสัยว่ามี กฎ อะไรบ้างที่ใช้กับสิ่งอย่าง beacon สำหรับติดตาม
      beacon กำลัง broadcast อยู่ และมีความเป็นไปได้สูงว่าถูกเก็บข้อมูลโดยไม่ขอความยินยอมในแทบทุกที่ที่เราไป
      บ้านผมอยู่ตรงสี่แยก ทำให้มีอุปกรณ์ Bluetooth จำนวนมากมารวมตัวอยู่แถวนี้บ่อย ๆ ครั้งหนึ่งผมเคยคิดจะติดตั้งตัวติดตาม BLE เล่น ๆ เพื่อดูว่าจะเก็บอะไรได้บ้าง และจากข้อมูลจะอนุมานอะไรได้
      ตัวอย่างเช่น ผมมั่นใจว่ามีความสัมพันธ์ระหว่างคุณภาพอากาศในบ้านที่แย่ลงกับการมาถึงของอุปกรณ์ Bluetooth ในบริเวณนั้น
    • น่าเสียดายที่ผู้คนมักโกหก IRB กันบ่อย ๆ
  • ประโยคที่ว่า “ใน nerd snipe แบบนี้ การไม่สูญเสียแรงส่งเป็นเรื่อง สำคัญถึงตาย” ทำเอาขำ
    สมองเนิร์ดของผมก็เคยใช้ตรรกะนี้โน้มน้าวให้ผมใช้เงินมาหลายครั้งแล้ว

    • ตลกแต่ก็จริง
      มันมีช่วงที่รู้สึกอยากทำโปรเจกต์มากกว่าอย่างชัดเจน และโดยเฉพาะฤดูหนาว ผมจะทำโปรเจกต์อิเล็กทรอนิกส์มากขึ้นและเล่นเกมมากขึ้นด้วย
      “ซีซัน” เล่นเกมของผมก็เพิ่งเริ่มอีกครั้งเมื่อสัปดาห์ที่แล้ว
      การเปลี่ยนอย่างมากจาก “วันนี้อยากทำอะไรนะ?” ไปเป็น “ซีซันนี้รู้สึกอยากทำอะไรและมีเวลาทำอะไรบ้าง?” ส่วนใหญ่เป็นผลจากอายุมากขึ้นและมีลูก แต่ช่วงเวลาที่มีทั้งความตั้งใจและเวลาสำหรับโปรเจกต์แบบนี้ห่างกันมากเสียจนถ้าเสียแรงส่งไป อาจกว่าจะกลับมาอีกทีก็อีก 1 ปี หรืออาจไม่ได้กลับมาเลย
      ผมมีโปรเจกต์อิเล็กทรอนิกส์หนึ่งอันที่เริ่มไว้เมื่ออย่างน้อย 10 ปีก่อน ใช้เงินไปพอสมควร และยังดื้อว่าจะทำให้เสร็จสักวัน จนกลายเป็นโปรเจกต์ฉาวโฉ่ในหมู่ครอบครัว
  • นาฬิกาปลุกของผมประกอบด้วย ESP32, แผง LED ค่อนข้างใหญ่, บัซเซอร์ และเซ็นเซอร์ PIR
    มันไม่ได้แสดงเวลา แต่แจ้งเตือนด้วยบัซเซอร์และไฟกะพริบ ค่อย ๆ ทำให้ห้องสว่างขึ้น หรือในตอนกลางคืน หลังจากไฟทั้งหมดดับไปแล้วระยะหนึ่งก็จะค่อย ๆ ทำให้มืดลง
    ข้อดีเพิ่มเติมที่พบภายหลังคือ แม้ AP จะไม่ได้อยู่ระหว่างผมกับ ESP ผมก็สะท้อน RF ได้มากพอจนแค่ดู ล็อก RSSI ก็รู้ได้ไม่เพียงเวลาที่อยู่บนเตียง แต่ยังรู้ถึงจังหวะที่พลิกตัวตอนกลางคืนด้วย
    https://imgur.com/a/VixOlu5
    แม้จะมีคำเตือน แต่ไม่มีเนื้อหาวาบหวิว
    สีเขียวตรงกลางคือ RSSI, สีเหลืองด้านล่างคือเซ็นเซอร์ PIR, ส่วนด้านบนเป็นข้อมูล Mi Band 3 ผสมกับคำอธิบายช่วงเวลาที่อยู่บนเตียง
    ใช่ ผมอ่านข่าวอยู่นานก่อนหลับและก่อนตื่นจริง ๆ

    • อยากรู้ว่า สแตก สำหรับเก็บข้อมูลและทำ visualization เป็นอย่างไร
    • อยากดูรูปชุดนาฬิกาปลุกที่พูดถึงข้างต้นด้วย
  • อยากรู้ว่าคุณจัดการโปรเจกต์ ESP32 ให้ ดูเป็นผลิตภัณฑ์ ได้อย่างไร
    ไม่ได้หมายถึงการผลิตจำนวนมาก แต่หมายถึงอยากทำให้มันเป็นอุปกรณ์แยกชิ้น ไม่ใช่บอร์ดที่มีสายไฟโผล่ออกมาเต็มไปหมด
    หลายหน้าโชว์แต่บอร์ดเปลือย ๆ แต่ในความเป็นจริงต้องแพ็กเกจมันด้วย
    ถ้าเป็นคนสายซอฟต์แวร์แบบผม ก็น่าจะยอมจ่ายเพิ่มนิดหน่อยเพื่อได้รูปแบบที่จัดเก็บเรียบร้อย มากกว่าจะลงมือดัดแปลงเองสารพัดอย่าง

    • ถ้าถนัดงานไม้ ก็ใช้ไม้ได้
      ถ้ามีเครื่องพิมพ์ 3D ก็ทำ งานพิมพ์ 3D ได้
      ถ้าถนัดอะคริลิก ก็ใช้เลเซอร์คัตเตอร์ตัดเป็นรูปทรงแล้วเจาะรูไม่กี่รู ก็กลายเป็นกล่องได้
      ถ้าไม่มีอะไรเลยและต้องการแค่กล่องแบบขั้นต่ำสุด ก็ใช้ Altoids Tin ราคาแถว ๆ 25 ดอลลาร์ต่อ 12 ชิ้นได้ แต่ข้างในมีมินต์ที่ไม่มีประโยชน์กับงานนี้อยู่ ก็ทิ้งไปแล้วใส่โปรเจกต์ลงไปแทน
      ถ้าอยากได้อะไรที่ดีกว่ากระป๋อง Altoids นิดหน่อย ก็ซื้อ Hammond Enclosure ได้
      (https://www.hammfg.com/electronics/small-case)
      ถ้าเป็นผม อาจพันด้วยเทปพันสายไฟ แล้วพันทับด้วยอะไรอย่างเทปผ้า จากนั้นใช้ปากกาเมจิกระบายสีเอา
    • มีบริษัทจำนวนมากที่ทำ enclosure สำหรับอุปกรณ์อิเล็กทรอนิกส์ และบางแบบกันน้ำได้ด้วย
      โดยปกติจะมีหน้าแปลนที่เจาะรูไว้ล่วงหน้าหลายจุดให้ยึดบอร์ดด้วยสกรูได้ ส่วนรูภายนอกสำหรับอินพุต/เอาต์พุตก็เจาะเองตามต้องการ
      ผู้ผลิตบางรายมีดังนี้ และถ้าซื้อบอร์ดพัฒนาหรือชิ้นส่วนอื่นอยู่แล้ว ก็มักหาได้จาก adafruit หรือ digikey ด้วยเพื่อประหยัดค่าส่ง
      https://www.hammfg.com/
      https://www.budind.com/
      http://takachi-enclosure.com/
      https://www.adafruit.com/product/903
    • มีตัวเลือกเยอะ
      โปรเจกต์ส่วนใหญ่ที่เห็นไม่ได้ถูกทำให้เป็นผลิตภัณฑ์
      มันเป็นโปรเจกต์ครั้งเดียวของแฮกเกอร์ ถ้าคนอื่นนำไปใช้ประโยชน์ได้ก็ดี แต่ไม่ใช่เป้าหมาย จึงไม่จำเป็นต้องแพ็กเกจ และบางครั้งก็แค่ยัดลงกล่อง
      ถ้าอยากได้ของที่ดูดีขึ้น ก็ต้องให้ใครสักคนออกแบบเคส
      คนนั้นอาจเป็นตัวคุณเองก็ได้
      ESP32 ถูกออกแบบมาให้ใส่ในผลิตภัณฑ์ของคุณเองได้ง่าย ดังนั้นแนวทางคือออกแบบแผงวงจรกับเคสให้เข้ากัน ซื้อชิป ESP32 จำนวนมาก แล้วประกอบลงบนบอร์ด
      บอร์ดที่ซื้อมาเพื่อทำต้นแบบ โดยทางการแล้วเป็นเพียง บอร์ดอ้างอิง เท่านั้น และไม่ได้คาดหวังให้เป็นของที่ส่งมอบขั้นสุดท้าย แต่ในความเป็นจริงก็มีบ่อยที่ส่งบอร์ดเดิมออกไปเลย
      เพราะมันเล็ก ราคาถูก และมีคนออกแบบบอร์ดที่ยากให้เสร็จแล้ว
    • ให้ “product designer” ออกแบบเคสก็ได้
      ถ้าผลิตภัณฑ์เป็นมาตรฐานพอ อาจข้ามขั้นตอนนี้ได้
      จากนั้นติดต่อผู้ผลิตในพื้นที่และผู้ผลิตในตลาดที่ใหญ่กว่าเพื่อขอตัวอย่าง แล้วตรวจสอบว่าทำงานได้ถูกต้องหรือไม่
      ถ้าพอใจก็เริ่มสั่งล็อตเล็ก ๆ
      ควรออกแบบ กระบวนการประกันคุณภาพ หรือหาผู้เชี่ยวชาญมาช่วย เพื่อไม่ให้ผู้ผลิตส่งของเสียมา 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 นั้นทำงานกันอย่างไร

    • Home Assistant ทำ การตรวจจับการมีอยู่ผ่าน Bluetooth แบบ headless ด้วย Python ราว 200 บรรทัด
      ดูเหมือนผู้เขียนจะพยายามทำแบบ 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 ได้ด้วย
    มันถูกออกแบบมาให้เน้นการระบุว่าอยู่ในห้องไหนมากกว่า

    1. https://espresense.com/