CO2センサを使う④AdafruitのSCD-30ボードをArduino Nano RP2040 ConnectにつないでBLEペリフェラルに(3)
SCD-30ボードはCO2以外に温度と湿度のデータも扱っています。前回のスケッチに、温度と湿度も扱えるようにしました。
●スケッチ
DescriptorのUUIDはいずれも2901です。2901は、Characteristicの説明文字列(UTF-8)を追加します。
#include <ArduinoBLE.h>
#define SCD30_SERVICE_UUID "F000AA30-0451-4000-B000-000000000000"
// BLE Service
BLEService Sensor_SCD30_Service(SCD30_SERVICE_UUID);
#define SCD30_C_Characteristic_UUID "F000AA31-0451-4000-B000-000000000000"
#define SCD30_T_Characteristic_UUID "F000AA32-0451-4000-B000-000000000000"
#define SCD30_H_Characteristic_UUID "F000AA33-0451-4000-B000-000000000000"
// BLE Characteristic
BLEFloatCharacteristic SCD30_CO2_Characteristic(SCD30_C_Characteristic_UUID, BLERead | BLENotify);
BLEFloatCharacteristic SCD30_Temperature_Characteristic(SCD30_T_Characteristic_UUID, BLERead | BLENotify);
BLEFloatCharacteristic SCD30_Humidity_Characteristic(SCD30_H_Characteristic_UUID, BLERead | BLENotify);
#define SCD30_C_Descriptor_UUID "2901"
#define SCD30_T_Descriptor_UUID "2901"
#define SCD30_H_Descriptor_UUID "2901"
// BLE Descriptor
BLEDescriptor SCD30_C_Descriptor(SCD30_C_Descriptor_UUID, "CO2;ppm IEEE-754 format");
BLEDescriptor SCD30_T_Descriptor(SCD30_T_Descriptor_UUID, "Temperature;`C");
BLEDescriptor SCD30_H_Descriptor(SCD30_H_Descriptor_UUID, "Humidity;%");
#include <Adafruit_SCD30.h>
Adafruit_SCD30 scd30;
float CO2 = 0, Temperature = 0, Humidity = 0;
void readSCD30() {
if (scd30.dataReady()){
if (!scd30.read()){ Serial.println("Error reading sensor data"); return; }
CO2 = scd30.CO2; Temperature = scd30.temperature, Humidity = scd30.relative_humidity;
}
}
#define localNAME "RP2060_SCD30_float"
#define DeviceNAME "RP2060_CO2_BLE"
float oldValue = 0; // last value
float previousMillis = 0; // last time value was checked, in ms
void setup() {
Serial.begin(9600); // initialize serial communication
while (!Serial);
// begin initialization
if (!BLE.begin()) {
Serial.println("starting BLE failed!");
while (1);
}
if (!scd30.begin()) {
Serial.println("Failed to find SCD30 chip");
while (1) { delay(10); }
}
BLE.setLocalName(localNAME);
BLE.setDeviceName(DeviceNAME);
// add the service UUID
BLE.setAdvertisedService(Sensor_SCD30_Service);
// add characteristic
Sensor_SCD30_Service.addCharacteristic(SCD30_CO2_Characteristic);
Sensor_SCD30_Service.addCharacteristic(SCD30_Temperature_Characteristic);
Sensor_SCD30_Service.addCharacteristic(SCD30_Humidity_Characteristic);
// add descriptor
SCD30_CO2_Characteristic.addDescriptor(SCD30_C_Descriptor);
SCD30_Temperature_Characteristic.addDescriptor(SCD30_T_Descriptor);
SCD30_Humidity_Characteristic.addDescriptor(SCD30_H_Descriptor);
// Add service
BLE.addService(Sensor_SCD30_Service);
// set initial value for this characteristic
SCD30_CO2_Characteristic.writeValue(0);
SCD30_Temperature_Characteristic.writeValue(0);
SCD30_Humidity_Characteristic.writeValue(0);
// start advertising
BLE.advertise();
Serial.println("Bluetooth device active, waiting for connections...");
}
void loop() {
// wait for a BLE central
BLEDevice central = BLE.central();
// if a central is connected to the peripheral:
if (central) {
delay(100);
Serial.print("Connected to central: ");
// print the central's BT address:
Serial.println(central.address());
// check every 200ms. while the central is connected:
while (central.connected()) {
long currentMillis = millis();
// if 200ms have passed, check value:
if (currentMillis - previousMillis >= 200) {
previousMillis = currentMillis;
updateValue();
delay(1000);
}
}
// when the central disconnects
Serial.print("Disconnected from central: ");
Serial.println(central.address());
}
}
void updateValue() {
readSCD30();
// if value has changed
if (CO2 != oldValue) {
Serial.println(String(CO2,2) + "ppm " + String(Temperature,1) + "`C " + String(Humidity,1) + "%");
// update characteristic
SCD30_CO2_Characteristic.writeValue(CO2);
SCD30_Temperature_Characteristic.writeValue(Temperature);
SCD30_Humidity_Characteristic.writeValue(Humidity);
oldValue = CO2; // save the level for next comparison
}
}
RSL10のモニタで観測しました。