こちらの記事では、BLEのペリフェラルを作りました。CO2、温度、湿度を送ってくれます。
CO2センサを使う④AdafruitのSCD-30ボードをArduino Nano RP2040 ConnectにつないでBLEペリフェラルに(3)
これをmatlab(R2021a update3)で受けます。
AdafruitのSCD-30ブレークアウト・ボードの概要
Arduino Nano RP2040 ConnectとはSTEMMA QTコネクタでつなぎました。

- 電源電圧 3.3/5V
- 測定範囲 400~10000ppm
- 確度 ±(30ppm + 3%)
- 消費電流 19 mA @ 2秒間隔の測定
- 完全に校正および線形化
- インターフェース I2C、アドレス0x61、信号は10kΩでプルアップ
- 温湿度センサSHT31がオンボード
プログラム
CO2_UUID、Temperature_UUID 、Humidity_UUID はキャラクトリスティック用です。subscribe()はnotifyのONを要求します。Arduino Nano RP2040 Connectでは200msごとにCO2の値が変われば、新しいデータを用意します。CO2のデータは、常に変化しています。
室内では400~500ppm、人が近くにいれば1000ppm前後まで上がります。
clear
scan = blelist("Timeout", 30);
RP2060_address="84CCA82E1F5E"; % scanで見つかったアドレスを代入
b = ble(RP2060_address);
bb = b.Characteristics;
ServiceUUID = "F000AA30-0451-4000-B000-000000000000";
CO2_UUID = "F000AA31-0451-4000-B000-000000000000";
Temperature_UUID = "F000AA32-0451-4000-B000-000000000000";
Humidity_UUID = "F000AA33-0451-4000-B000-000000000000";
c10 = characteristic(b, ServiceUUID, CO2_UUID);
subscribe(c10);
c11 = characteristic(b, ServiceUUID, Temperature_UUID);
subscribe(c11);
c12 = characteristic(b, ServiceUUID, Humidity_UUID);
subscribe(c12);
CO2 = hex2numS(read(c10))
Temperature = hex2numS(read(c11))
Humidity = hex2numS(read(c12))
function shortF = hex2numS(decimal4) % IEE754の単精度浮動小数点数の形式:binary32
data11 = num2str( dec2bin( decimal4(1),8 )); % リトル・エンディアンを
data12 = num2str( dec2bin( decimal4(2),8 )); % ビッグ・エンディアンに変更
data13 = num2str( dec2bin( decimal4(3),8 ));
data14 = num2str( dec2bin( decimal4(4),8 ));
data111 = strcat(data14,data13,data12,data11);
f = (-1)^str2num(data111(1)); % 符号
sisuu = data111(2:1:9);
kasuu = ("1"+data111(10:1:end));
k = bin2dec(kasuu)/(2^23) ; % 仮数
s = 2 ^ (bin2dec(sisuu) -127) ; % 指数
shortF = f * k * s;
end