แรงจูงใจของฉัน
โปรเจกต์ Bluetooth แรกของฉัน สำหรับ Arduino Nano 33 Sense เกี่ยวข้องกับการอ่านค่าอุณหภูมิ ความชื้น และความดันบรรยากาศจาก Nano 33 BLE Sense และทำให้ข้อมูลนั้นพร้อมใช้งานสำหรับ Bluetooth Low Energy client Bluetooth และเซ็นเซอร์ทั้งหมดถูกสร้างมาในตัว จึงเป็นเพียงการฝึกเขียนซอฟต์แวร์เท่านั้น
ในกระบวนการนี้ ฉันได้เรียนรู้มากมายเกี่ยวกับ Bluetooth Low Energy (BLE) และ Generic Attribute (GATT) characteristic ที่เป็นส่วนสำคัญของมัน ขั้นตอนเชิงตรรกะถัดไปสำหรับฉันคือการสำรวจ APDS-9960 gesture sensor ของ Nano ซึ่งสามารถอ่านค่าสีและแสงโดยรอบได้ด้วย
วัตต์ เมตร และค่าการนับ โอ้โห!
สิ่งสำคัญในสเก็ตช์นี้คือการแปลงค่าแสงโดยรอบให้อยู่ในหน่วยที่เหมาะสมสำหรับ BLE GATT characteristics GATT มีความเคร่งครัดมากในหน่วยที่ใช้ คุณต้องให้ค่าที่คาดหวัง มิฉะนั้นค่าที่อ่านได้จะไม่มีความหมาย GATT characteristic สำหรับ irradiance คือ Watts per square meter
โปรเจกต์นี้มุ่งเน้นไปที่การหาวิธีอ่านค่าแสงโดยรอบในรูปแบบที่เหมาะสมสำหรับ BLE irradiance characteristic สำหรับการแนะนำ BLE, GATT และคำศัพท์เช่น characteristic ที่เจาะลึกยิ่งขึ้น โปรดดูที่โปรเจกต์ Bluetooth Weather ของฉัน.
การรู้ว่า GATT characteristic ต้องการหน่วยเป็น W/m^2 คือชิ้นส่วนแรกของปริศนา ถัดไปคือการหาสิ่งที่เซ็นเซอร์ของ Nano อ่านได้ สำหรับสิ่งนี้ ฉันต้องหา data sheet สำหรับเซ็นเซอร์ APDS-9960.
ในหน้าสี่ของ PDF มีบรรทัดที่ระบุว่า: Clear channel irradiance responsivity โดยมีค่าต่ำสุด ทั่วไป และสูงสุดที่ 18.88; 23.60; และ 28.32 ตามลำดับ หน่วยแสดงใน counts/(μW/cm^2)
กล่าวอีกนัยหนึ่ง หากค่าแสงโดยรอบที่อ่านได้จาก APDS-9960 คือ 23.60 นั่นจะเท่ากับ 1μW/cm^2 แน่นอนว่าค่าที่อ่านได้เป็นจำนวนเต็ม ดังนั้นจึงไม่สามารถเป็น 23.60 ได้ อีกวิธีหนึ่งในการคิดคือ ทุกครั้งที่ APDS-9960 นับถึง 236 นั่นคือแสงโดยรอบ 10μW/cm^2
ขั้นตอนแรกคือการนำค่าที่รายงานโดย APDS-9960 มาหารด้วย 23.60 เพื่อให้ได้ μW/cm^2
APDS.readColor(red, green, blue, ambient);
irradiance = (float) ambient / 23.60;
แต่ Bluetooth GATT characteristics แสดงในหน่วย W/m^2 และ data sheet ของ APDS-9960 ระบุว่าหน่วยเป็น μW/cm^2 จึงต้องมีการแปลงเพิ่มเติม
มี 10,000 ตารางเซนติเมตรในหนึ่งตารางเมตร ดังนั้นการคูณด้วย 10,000 จะทำให้ได้ μW/m^2
มี 1,000,000 μW ในหนึ่งวัตต์ ดังนั้นการหารด้วย 1,000,000 จะทำให้ได้ W/m^2
การคูณด้วยหนึ่งหมื่นแล้วหารด้วยหนึ่งล้านก็เหมือนกับการหารด้วย 100
การแปลงเอาต์พุตตัวนับของ APDS-9960 เป็น W/m^2 เกี่ยวข้องกับการหารด้วย 23.60 ก่อนเพื่อให้ได้ μW/cm^2 จากนั้นหารด้วย 100 เพื่อให้ได้ W/m^2 สิ่งนี้สามารถทำให้ง่ายขึ้นโดยการหารค่าการนับด้วย 2360
APDS.readColor(red, green, blue, ambient);
irradiance = (float) ambient / 2360;
การใช้ (float) ในสมการเป็นสิ่งสำคัญ เพราะ ambient และ 2360 ต่างก็เป็นจำนวนเต็ม และส่วนที่เป็นเศษส่วนจะหายไปหากไม่มีการแปลงเป็นชนิดข้อมูล float
การสื่อสาร BLE Characteristic
ก่อนที่ค่า irradiance จะสามารถสื่อสารได้ จะต้องตั้งค่า Bluetooth ก่อน ซึ่งเริ่มต้นด้วยการสร้าง service และประกาศ service นั้น โค้ดด้านล่างนี้เป็นส่วนหนึ่งของฟังก์ชัน setup() ในสเก็ตช์
BLEService environmentalSensingService("181A");
BLEUnsignedIntCharacteristic irradianceCharacteristic("2A77", BLERead);
BLE.setLocalName("Nano33BLE");
BLE.setAdvertisedService(environmentalSensingService);
environmentalSensingService.addCharacteristic(irradianceCharacteristic);
BLE.addService(environmentalSensingService);
BLE.setConnectable(true);
โปรดดูโค้ดฉบับเต็มสำหรับ comment ที่อธิบายการทำงานของแต่ละส่วน
เมื่อตั้งค่าเสร็จแล้ว สิ่งที่เหลืออยู่คือการรอการเชื่อมต่อและอัปเดต irradiance characteristic ด้วยค่าใหม่จาก APDS-9960 โค้ดด้านล่างนี้เป็นแกนหลักของส่วน loop() ในสเก็ตช์
if (APDS.colorAvailable()) {
int red, green, blue, ambient;
APDS.readColor(red, green, blue, ambient);
irradiance = (float) ambient / 2360;
irradianceCharacteristic.writeValue((uint16_t) round(irradiance * 10));
}
ยังมีรายละเอียดอีกเล็กน้อยที่ทำให้สเก็ตช์สมบูรณ์ โปรดดูโค้ดฉบับเต็ม
การทดสอบ
หลังจากโหลดสเก็ตช์ลงบน Nano ฉันได้ลองสถานการณ์บางอย่าง ในห้องที่สว่างด้วยหลอดไฟฟลูออเรสเซนต์คอมแพคขนาด 60 วัตต์เพียงหลอดเดียว ค่าแสงโดยรอบแทบไม่ปรากฏ การส่องไฟฉาย LED แสงสีขาวห่างจากเซ็นเซอร์ไม่กี่นิ้วให้ค่าที่อ่านได้ดีขึ้นมาก น่าเสียดายที่สภาพอากาศที่นี่มีเมฆมาก ดังนั้นอาจต้องใช้เวลาสักพักก่อนที่ฉันจะสามารถทดสอบในแสงแดดจัดได้
มีประโยชน์อย่างไร?
ท้ายที่สุด ฉันวางแผนที่จะรวมสิ่งนี้เข้ากับสเก็ตช์ Bluetooth Weather ของฉันในฐานะ characteristic อีกตัวหนึ่ง ควบคู่ไปกับอุณหภูมิ ความชื้น และความดันบรรยากาศ การวัดแสงภายนอกอาคารโดยรอบสามารถนำมาใช้เพื่อกำหนดปริมาณของเมฆปกคลุมได้
อย่างน้อยที่สุด โปรเจกต์นี้ก็เป็นการแนะนำที่ดีเกี่ยวกับการสื่อสารด้วย Bluetooth และสิ่งที่ต้องทำเพื่อให้ค่าเซ็นเซอร์สามารถเข้าถึงได้ในฐานะ GATT characteristics
EXPANDED TECHNICAL DETAILS
Spectral Energy Telemetry Pro
โปรเจกต์ความแม่นยำสูงนี้วัดและถ่ายทอดข้อมูล solar irradiance (W/m²) ผ่านการเชื่อมต่อ Bluetooth ซึ่งเหมาะสำหรับผู้ติดตั้งแผงโซลาร์เซลล์และนักวิจัย
- nRF Connect SDK Integration: พัฒนาโดยใช้ nRF Connect SDK ระดับมืออาชีพ ซึ่งช่วยให้เข้าถึงคุณสมบัติ Bluetooth Low Energy (BLE) ขั้นสูงและการเพิ่มประสิทธิภาพการใช้พลังงาน
- Analog Photodiode Calibration Matrix: ใช้เซ็นเซอร์ high-gain photodiode โดย Arduino จะแปลงกระแสแอนะล็อกให้เป็นค่า Irradiance ที่แม่นยำตาม curve การสอบเทียบที่ทำในห้องปฏิบัติการซึ่งโปรแกรมไว้ในหน่วยความจำ
Performance
- Live Mobile Data Plotting: Arduino จะแพร่ภาพค่า irradiance เป็น GATT characteristic ผู้ใช้สามารถเห็นภาพ live energy-stream บนแอปพลิเคชันสมาร์ทโฟน พร้อมด้วยยอดรวมพลังงานที่เก็บเกี่ยวได้ในแต่ละวัน