โจทย์ปัญหา

ถ้ำเนี่ย เป็นสถานที่เงียบสงบ คนไม่ค่อยเข้าไปกันนัก แต่กลับมีความงามที่พิเศษสุดๆ อยู่ข้างใน ความสวยงามในถ้ำเนี่ยมันคนละเรื่องกับทิวทัศน์ธรรมชาติที่อื่นเลยนะเว้ย เพราะกิจกรรมของมนุษย์เข้าไปรบกวนน้อยมาก ความงามตามธรรมชาติเลยยังบริสุทธิ์อยู่เต็มที่ การสำรวจถ้ำ (Caving) เลยเป็นหนึ่งในตัวเลือกสำหรับคนที่อยากไปชมความงามแบบนี้
กิจกรรมสำรวจถ้ำกลายเป็นงานอดิเรกที่ฮิตมากขึ้นเรื่อยๆ ในช่วงหลายสิบปีมานี้ บางคนทำเพื่อความสนุก บางคนทำเพื่อออกกำลังกาย หรือแม้แต่เพื่อการสำรวจทางวิทยาศาสตร์ ทั้งฟิสิกส์และชีววิทยา ก็มีบทบาทสำคัญไม่น้อยเลยทีเดียว และด้วยเสื้อผ้าและอุปกรณ์สมัยใหม่ที่พัฒนาขึ้น การสำรวจถ้ำก็ปลอดภัยขึ้นกว่าแต่ก่อนเยอะ
แต่ถามจริง... อุปกรณ์ทั้งหมดที่นักสำรวจพกไปเนี่ย มันปกป้องพวกเขาได้ 100% ไหม? คำตอบคือ "ไม่ครับพี่น้อง!" ยังมีอันตรายอีกเพียบที่คอยข่มขวัญความปลอดภัยของนักสำรวจในถ้ำ เช่น อุณหภูมิสุดขั้ว อากาศชื้นแฉะ ความกดอากาศต่ำ คุณภาพอากาศแย่ และก๊าซพิษต่างๆ อีกทั้งปัญหาการขาดระบบสื่อสารบางครั้งก็ทำให้สถานการณ์แย่ลง เพราะนักสำรวจติดต่อกับโลกภายนอกไม่ได้เลย
ทางออกของปัญหา

จากปัญหานี้แหละ รุ่นพี่เลยจะพัฒนา "Sajac Project" ขึ้นมาเพื่อช่วยเหล่าคนรักการสำรวจถ้ำโดยเฉพาะ โครงการนี้คือระบบตรวจสอบสภาพแวดล้อมอัจฉริยะ (Smart Monitoring System) ที่มีเป้าหมายเพื่อเฝ้าสังเกตสภาพภายในถ้ำ ระบบจะให้ข้อมูลเกี่ยวกับสิ่งแวดล้อมรอบตัวผู้ใช้ แถมยังติดตั้ง Machine Learning ไว้เพื่อประเมินว่าสภาพแวดล้อมนั้นปลอดภัยและเป็นมิตรกับผู้ใช้หรือเปล่า
และที่สำคัญ! ในแต่ละจุดตรวจ (Checkpoint) ภายในถ้ำ จะมีเครื่องส่งสัญญาณ (Transmitter) ที่เชื่อมต่อตรงไปยังเจ้าหน้าที่รักษาการณ์ด้านนอกโดยตรง ถ้าผู้ใช้ได้รับแจ้งเตือนอันตรายจากเสื้อแจ็กเก็ต ก็สามารถขอความช่วยเหลือได้ทันทีที่จุดตรวจที่ใกล้ที่สุดโดยใช้เครื่องส่งสัญญาณนี้ แล้วทีมช่วยเหลือก็จะรีบมาช่วยเหลือให้เร็วที่สุด
มันทำงานยังไงนะ?


ระบบนี้ใช้บอร์ด **Nicla Sense ME** เป็นตัวประเมินสภาพแวดล้อม อุปกรณ์ตัวนี้สามารถวัดคุณภาพสิ่งแวดล้อมรอบตัวผู้ใช้ได้ในครั้งเดียว แล้วส่งผลไปยังแอปพลิเคชัน Sajac ในสมาร์ทโฟนของผู้ใช้ ถ้าสภาพในถ้ำไม่เหมาะสำหรับการสำรวจ ก็จะมีแจ้งเตือนขึ้นทั้งบน Nicla Sense ME และบนสมาร์ทโฟน การคำนวณทั้งหมดใช้โมเดล Machine Learning ที่เทรนไว้บนแพลตฟอร์ม Edge Impulse มาแล้ว ซึ่งมีความแม่นยำสูงและมีอัตราความผิดพลาดต่ำมาก ไว้ใจได้!
ในแต่ละจุดตรวจ จะมีเครื่องส่งสัญญาณ (Transmitter) ที่จะแจ้งข้อมูลสภาพแวดล้อมในถ้ำตรงไปยังเจ้าหน้าที่ที่ด่านหน้าเลย เพราะในถ้ำไม่มีสัญญาณอินเทอร์เน็ต ระบบนี้เลยใช้ระบบสื่อสาร **LoRa** ในการส่งข้อมูลจากจุดตรวจออกมา ระบบส่วนนี้พัฒนาด้วย **XIAO ESP32C3** ที่ติดตั้งโมดูล **Grove Wio E5** จาก Seeed Studio ไว้ด้วย เวลาผู้ใช้มาถึงจุดตรวจ แค่กดปุ่ม "ส่ง" หลังจากเชื่อมต่อกับเครื่องส่งสัญญาณที่ด่านหน้าเสร็จแล้วเท่านั้น ผู้ใช้ยังสามารถเลือกได้ว่าจะกลับออกมาด้วยตัวเอง หรือให้ทีมช่วยเหลือมารับ ถ้าสภาพแวดล้อมไม่อำนวยให้สำรวจต่อ
ส่วนเจ้าหน้าที่ที่ด่านหน้าหลัก จะรับข้อมูลที่ส่งมาจากในถ้ำผ่านระบบ LoRa โดยตรง ที่ด่านหน้าจะมี **Wio Terminal** ที่ติดตั้ง Grove Wio E5 ไว้เพื่อรับข้อมูลจากเครื่องส่งสัญญาณในถ้ำ Wio Terminal ตัวนี้ใช้ง่ายและเหมาะกับสถานที่ที่แหล่งพลังงานมีจำกัด เพราะใช้พลังงานแค่ 5 โวลต์จาก Power Bank เท่านั้นเอง ง่ายๆ จัดไปวัยรุ่น!
เจาะลึกแบบช่างๆ
SAJAC (Smart Jacket for Caving) นี่คือภารกิจระดับโคตรซีเรียสที่เราจะลงลึกไปในโลกของ การตรวจจับสภาพแวดล้อมใต้ดิน (Subterranean Environmental Forensics) และ การส่งข้อมูลแบบอะซิงโครนัส (Asynchronous Telemetry) ในสภาพแวดล้อมถ้ำสุดหิน โคตรท้าทาย GPS และสัญญาณมือถือทั่วไปมักพังไม่เป็นท่า ทำให้เหล่านักสำรวจโดนตัดขาดจากโลกภายนอก SAJAC จึงเป็นเหมือนตาข่ายนิรภัยแบบกระจายศูนย์ ด้วยการผสานพลังของ Nicla Sense ME จาก Bosch เข้ากับโมเดล AI จาก Edge Impulse เพื่อตรวจจับสภาวะบรรยากาศที่เป็นอันตราย ระบบนี้ใช้สะพานสื่อสารหลายขั้นตอน (BLE สู่ LoRa) เพื่อส่งข้อมูลชีพจรแบบเรียลไทม์และสัญญาณขอความช่วยเหลือ (SOS) จากจุดตรวจลึกในถ้ำ ขึ้นไปยังสถานีเฝ้าระวังบนพื้นผิวได้เลย
- Nicla Sense ME & BSEC AI Forensics:
- Bosch Sensortec Environmental Cluster (BSEC): หัวใจของเซ็นเซอร์ในเสื้อตัวนี้คือ BME688 เซ็นเซอร์แก๊ส 4-in-1 มันใช้การวิเคราะห์แบบขับเคลื่อนด้วย AI เพื่อตรวจสอบคุณภาพอากาศภายใน (IAQ), สารประกอบอินทรีย์ระเหยง่าย (VOC), และการเปลี่ยนแปลงความกดอากาศ ซึ่งสามารถตรวจจับการสะสมของแก๊สพิษได้ล่วงหน้านาน ก่อนที่ร่างกายมนุษย์จะแสดงอาการออกมาเสียอีก
- Edge-AI Inference Loop: ข้อมูลดิบจากเซ็นเซอร์ (อุณหภูมิ, ความชื้น, ความดัน, แก๊ส) จะถูกประมวลผลในตัวบนบอร์ด Nicla เลย โดยใช้ Edge Impulse Neural Network โมเดลจะจำแนกสภาพแวดล้อมออกเป็นหมวดหมู่ "ปลอดภัย", "แย่", หรือ "อันตราย" ด้วยความถี่สูง ทำให้ลดความล่าช้าระหว่างการตรวจจับภัยและการแจ้งเตือนผู้ใช้ได้สุดๆ
- Multi-Protocol Telemetry Architecture:
- The BLE-to-LoRa Mesh Bridge: เพราะในถ้ำไม่มีเน็ต SAJAC เลยใช้การสื่อสารสองชั้นแบบนี้:
- ชั้นที่ 1 (Personal Hub): Nicla Sense ME ส่งสถานะไปยังสมาร์ทโฟนของผู้ใช้ผ่าน BLE (GATT Profiles)
- ชั้นที่ 2 (Long-Range Uplink): ที่จุดตรวจ (checkpoints) บริดจ์ XIAO ESP32C3 จะรับข้อมูลจากโทรศัพท์ผ่าน BLE แล้วห่อมันเป็นแพ็กเก็ต LoRa ผ่านโมดูล Wio-E5 อีกที
- LoRa RFCFG Diagnostics: Wio-E5 ทำงานที่ความถี่ 866MHz ด้วย Spreading Factor SF12 การตั้งค่านี้ช่วยให้สัญญาณทะลุผ่านหินและหินปูนได้ดีสุดๆ ทำให้ส่งข้อมูลได้ไกลเป็นกิโลเมตรโดยไม่จำเป็นต้องเห็นหน้ากัน (line-of-sight)
- The BLE-to-LoRa Mesh Bridge: เพราะในถ้ำไม่มีเน็ต SAJAC เลยใช้การสื่อสารสองชั้นแบบนี้:
- Mbed OS & PlatformIO Memory Forensics:
- Memory Optimization: การรันโมเดล AI ซับซ้อนและสแต็ก BLE บน Nicla ตัวจิ๋ว ต้องการการจัดการหน่วยความจำที่แน่นหนามาก เดฟเลยเปลี่ยนจาก Arduino Mbed core มาตรฐาน มาใช้ PlatformIO เพื่อจัดการการจองพื้นที่ heap/stack ให้มีประสิทธิภาพมากขึ้น ป้องกันการแครชแบบ "Out of Memory" (OOM) ขณะที่กำลังสุ่มตัวอย่างเซ็นเซอร์และส่งสัญญาณ BLE พร้อมกัน
ขั้นตอนแบบ Step by Step
- 1. Setup the Nicla Sense ME in Arduino IDE
- 2. Testing Sensor using Sense ME Dashboard
- 3. Testing Transmit Sensors Data using BLE
- 4. Gui Design using MIT App Inventor
- 5. Receive Data from Nicla Sense ME using Android
- 6. Transmit Data from Android to XIAOESP32C3
- 7. Send Notification from XIAOESP32C3 to Wio Terminal
- 8. Show notifications to the Guards using Wio Terminal
- 9. Collect data
- 10. Data Training using Edge Impulse
- 11. Model Implementation
- 12. Testing the Device
1. Setup the Nicla Sense ME in Arduino IDE

Nicla Sense ME คือเครื่องมือจิ๋วแต่แจ๋ว แรงดันต่ำ ที่ตั้งมาตรฐานใหม่ให้กับโซลูชันการตรวจจับอัจฉริยะ ด้วยความง่ายในการบูรณาการและความสามารถในการขยายตัวของ Arduino ecosystem บอร์ดตัวนี้รวมเซ็นเซอร์ล้ำสมัยจาก Bosch Sensortec ไว้ถึงสี่ตัว:
- เซ็นเซอร์ตรวจจับการเคลื่อนไหว BHI260AP พร้อม AI ในตัว
- BMM150 แมกนีโตมิเตอร์
- BMP390 เซ็นเซอร์วัดความดัน
- BME688 เซ็นเซอร์แก๊ส 4-in-1 พร้อม AI และเซ็นเซอร์วัดความดัน, ความชื้น, อุณหภูมิ ที่มีความแม่นยำสูง
เจ้า Nicla Sense ME ตัวนี้โปรแกรมง่ายมากผ่าน Arduino IDE แต่ว่าก่อนจะใช้ได้ ก็ต้องเซ็ตอัพกันนิดหน่อยครับ กระบวนการก็คือการติดตั้งบอร์ดและไลบรารีสำคัญๆ สำหรับ Nicla Sense ME ใน Arduino IDE ตามวิดีโอสอนด้านล่างนี้ได้เลย ง่ายๆ
บอร์ดที่ต้องติดตั้ง:
- Arduino Mbed OS Nicla Boards
- Arduino SAMD Boards


ไลบรารีที่ต้องติดตั้ง:
- Arduino_BHY2
- Arduino_BHY2Host
- ArduinoBLE
- EdgeML-Arduino
- Arduino_ConnectionHandler
- ArduinoIoTCloud


**หมายเหตุสำคัญจ้า:** ตอนที่พี่ลองใช้ Arduino Mbed OS Nicla Boards เวอร์ชัน 3.5.1 มันทำให้ชาร์จไฟเข้า Nicla ไม่ได้เลยนะ! น้องต้องใช้เวอร์ชันล่าสุดที่มัน ignore ตัว NTC ในบอร์ดไปซะ นี่เป็นส่วนหนึ่งของกระบวนการ **Subterranean Hardening** นะฮะ ในสภาพแวดล้อมชื้นสุดขั้ว ระบบความปลอดภัยการชาร์จที่ใช้ NTC มาตรฐานอาจจะป้องกันไม่ให้แบตเตอรี่ทำงานได้ เฟิร์มแวร์เวอร์ชันใหม่นี้ใช้การอัปเดต Mbed core ล่าสุดเพื่อข้ามการแจ้งเตือนเรื่องความร้อนที่ไม่จำเป็น ทำให้มั่นใจได้ว่าอุปกรณ์จะยังคงมีไฟใช้ในส่วนของถ้ำที่เย็นและชื้นได้
2. ทดสอบเซ็นเซอร์ด้วย Sense ME Dashboard
Nicla Sense ME สามารถให้ค่าอ่านเซ็นเซอร์ได้มากถึง 65 ตัวแปรเลยทีเดียว! 65 ตัวแปรนี้แบ่งออกเป็น 6 คลาสหลักๆ ดังนี้:
- **Sensor:** คลาสนี้จัดการเซ็นเซอร์อื่นๆ ที่มีค่าให้อ่านค่าเดียว เช่น อุณหภูมิ, แก๊ส, ความดัน ฯลฯ รวมถึงเซ็นเซอร์แบบ event เช่น step detector คลาสนี้จะให้ข้อมูลเซ็นเซอร์ผ่าน property `value` ที่คืนค่าเป็น float
- **SensorOrientation:** คลาสนี้จัดการเซ็นเซอร์ที่ใช้รูปแบบออยเลอร์ (Euler) เช่น ใช้กับ orientation (การวางตัว) ทำให้เราอ่านค่า pitch, roll และ heading ได้
- **SensorXYZ:** คลาสนี้จัดการเซ็นเซอร์ที่ใช้รูปแบบ XYZ เช่น accelerometer และ gyroscope มันจะมีค่า x, y และ z อยู่ในตัว
- **SensorQuaternion:** ใช้จัดการเซ็นเซอร์ที่ใช้รูปแบบควอเทอร์เนียน (quaternion) ใช้คำนวณ rotation vector, game rotation vector และ geomagnetic rotation vector ได้ เข้าถึง property x, y, z และ w ผ่านคลาสนี้เลย
- **SensorActivity:** ใช้คลาสนี้จัดการเซ็นเซอร์ที่ใช้รูปแบบ activity (กิจกรรม) activity จะถูกเข้ารหัสเป็น ID และดึงมาจาก property `value` ใช้เมธอด `getActivity()` เพื่อให้ได้ข้อความที่มนุษย์อ่านเข้าใจได้ เช่น "Walking activity started"
- **SensorBSEC:** BSEC ย่อมาจาก Bosch Sensortec Environmental Cluster พูดง่ายๆ คือใช้เข้าถึงระดับคุณภาพอากาศ (IAQ) นั่นเอง
ถ้าอยากรู้ลึกกว่านี้ ไปดูเอกสารอย่างเป็นทางการของ Arduino Nicla Sense ME Cheat Sheet ได้เลยครับ มีรายละเอียดครบถ้วน
Nicla Sense ME ให้ข้อมูลสิ่งแวดล้อมกับเราได้ เช่น ความดัน, อุณหภูมิ และค่าก๊าซ บางครั้งเราอาจต้องวางเซ็นเซอร์ในจุดที่เข้าถึงยากเพราะข้อกำหนดของสภาพแวดล้อม การเข้าถึงข้อมูลแบบไร้สายจึงสะดวกและช่วยได้มาก เพื่อสาธิตเรื่องนี้ Arduino ได้เตรียมสเก็ตช์ตัวอย่างและแดชบอร์ดไว้ให้ลองเล่นกัน น้องสามารถดาวน์โหลดโค้ดตัวอย่างได้จากไฟล์แนบด้านล่างนี้เลย

น้องแค่ต้องอัพโหลดโค้ดลงบอร์ดแบบไม่ต้องแก้อะไรเลย จากนั้นก็เข้าไปที่ **Arduino Nicla Sense ME - Web BLE Test** ได้เลย ตรงนี้จะช่วยให้น้องเข้าใจเซ็นเซอร์ใน Nicla Sense ME ได้ชัดเจนขึ้นอีกโขเลย

3. ทดลองส่งข้อมูลเซ็นเซอร์ผ่าน BLE
ในโปรเจคนี้ เราจะสร้างระบบที่ตรวจจับสภาพแวดล้อมรอบตัวผู้ใช้ได้ มีพารามิเตอร์ที่เราเลือกมาใช้ดังนี้:
- อุณหภูมิ (Temperature)
- ความชื้น (Humidity)
- ความดันอากาศ (Air Pressure)
- คุณภาพอากาศในร่ม (Indoor Air Quality)
- แก๊ส VOC
เซ็นเซอร์บางตัวนี่เข้าถึงง่ายมาก แค่ทำตามใน Arduino Nicla Sense Cheatsheet ก็พอ ลองมาดูค่ามันผ่าน Serial Monitor ด้วยโค้ดด้านล่างนี้เลย (โค้ดเต็มอยู่ในไฟล์แนบของโปรเจค)


โอเค ตอนนี้น้องอ่านค่าจากเซ็นเซอร์ที่จะใช้ได้แล้ว ขั้นต่อไป เราจะส่งข้อมูลที่อ่านได้นี่ผ่าน BLE ไปให้อุปกรณ์อื่นอ่านต่อ BLE ย่อมาจาก Bluetooth Low Energy หรือบางทีก็เรียก Bluetooth Smart มันคือบลูทูธแบบประหยัดพลังงาน เราใช้สมาร์ทโฟนเป็นตัวรับ และ Nicla Sense ME เป็นตัวส่งข้อมูล ดังนั้นเราต้องมีแอปเพื่อแสดงข้อมูลจาก Nicla Sense ME แอปที่เราจะใช้คือ **LightBlue** ซึ่งสามารถอ่านข้อมูลจากตัวส่งผ่าน BLE ได้

ข้อมูลที่อ่านจากเซ็นเซอร์บน Nicla Sense ME จะถูกส่งผ่าน BLE เราสามารถดัดแปลงโปรแกรม Nicla Sense Dashboard จากขั้นตอนที่แล้วมาใช้ได้เลย แค่ต้องปรับนิดหน่อย ซึ่งจะส่งผลใหญ่ต่อข้อมูลที่แสดงในแอป นั่นคือเปลี่ยนรูปแบบข้อมูลตัวแปรที่ส่งไปเป็น "Char/String" เพื่อให้ง่ายต่อการแสดงผลในขั้นตอนต่อไป ลองดูโค้ดในไฟล์แนบได้ (หรือจะเอาไปเทียบกับโปรแกรม Nicla Sense Dashboard ตัวเดิมดูก็ได้ว่าต่างกันยังไง)
ข้อมูลที่ได้รับมาจะอยู่ในรูปแบบ Hex มาดูกันว่าในแอป LightBlue เราจะได้เห็นอะไรบ้าง 😀
4. ออกแบบ GUI ด้วย MIT App Inventor
ตอนนี้เราส่งข้อมูลจาก Nic