二酸化炭素濃度(CO2)センサー VSON WP6003(安心宝)のデータをBLEで読み出す(2)

2020/12/22ガジェット

換気チェックのために購入した二酸化炭素濃度(CO2)センサー VSON WP6003(安心宝)のデータをBLEで読み出す記事の続きです。

使っている機器の説明や、いままでに解析した部分については前回記事を参照ください。


BLE経由で読み出してみた(続き)

WP6003のフリをするBLEデバイスをM5StickCで作成し、プロトコルを解析しました。

スマホアプリからの設定は CUSTOM SERVICE(UUID:0000FFF1-0000-1000-8000-00805F9B34FB)のCUSTOM CHARACTERISTIC(UUID:0000FFF1-0000-1000-8000-00805F9B34FB)に書き込まれます。最初の1バイトがコマンドのようです。

アプリ接続後、下記のデータが来ます。

ee
aa 14 0c 14 00 25 13
ae 02
ab
(以下、1秒毎にab)

ee: リセット?

用途不明。

aa: 日時設定

BLE connect直後に1度だけ送られます。コマンド aa に続いて年月日時分秒が送られます。

例: aa 14 0c 14 00 19 12

0x14(20年)、0x0c(12月)、0x14(20日)、0x00(0時)、0x19(25分)、0x12(18秒)

ae: 読み出し間隔の設定?

読み出し間隔再設定時に送られます。

データは3バイトで、ae,01,xx です。xx は分単位で設定します。5分なら ae,01,05、 30分なら ae,01,1e です。

開始直後は ae, 02 が来るのですが、用途不明。測定開始か?

追記: ae02 はセンサ内部に保持されている読み出し間隔をリクエストしているようです。ae03に続いて分単位の間隔が返ります。 thanks to saso5.

-> Value: ae02
<- Value: ae0305


ab: notify request

データを要求します。WP6003はこのコマンドを受け取ると 即座にnotify を返します。
(通常は notify は ae コマンドで指定された間隔で送られます)。

ad: キャリブレーション

1バイトで 0xad が送られます。

WP6003のフリをするコード


#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <ble2902.h>
#include <M5StickC.h>

#define SERVICE_UUID          "0000FFF0-0000-1000-8000-00805F9B34FB"
#define CHARACTERISTIC_UUID_1 "0000FFF1-0000-1000-8000-00805F9B34FB"
#define CHARACTERISTIC_UUID_4 "0000FFF4-0000-1000-8000-00805F9B34FB"

boolean connected = false;

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      connected = true;
      M5.Lcd.println("connect");
    };

    void onDisconnect(BLEServer* pServer) {
      connected = false;
      M5.Lcd.println("disconnect");
    }
};

class MyCallbacks_fff1: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string rxValue = pCharacteristic->getValue();
      //    M5.Lcd.fillScreen(BLACK);
   if (rxValue.length() > 0) {
        for (int i = 0; i < rxValue.length(); i++) {
          M5.lcd.printf("%02x ", rxValue[i]);
        }
        if(rxValue[0]!=0xab) M5.lcd.println();
      }
    }
};


BLEService *pService;
BLECharacteristic *pCharacteristic_fff1;
BLECharacteristic *pCharacteristic_fff4;

void setup() {
  M5.begin();
  M5.Lcd.setRotation(0);
  M5.Lcd.setTextSize(1);

  BLEDevice::init("6003#XXXXXXXXXXXXX");
  BLEServer *pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  pService = pServer->createService(SERVICE_UUID);

  pCharacteristic_fff1 = pService->createCharacteristic(
                           CHARACTERISTIC_UUID_1,
                           BLECharacteristic::PROPERTY_WRITE |
                           BLECharacteristic::PROPERTY_WRITE_NR
                         );
  pCharacteristic_fff1->setCallbacks(new MyCallbacks_fff1());

  pCharacteristic_fff4 = pService->createCharacteristic(
                           CHARACTERISTIC_UUID_4,
                           BLECharacteristic::PROPERTY_READ |
                           BLECharacteristic::PROPERTY_NOTIFY
                         );
  pCharacteristic_fff4->addDescriptor(new BLE2902());
  pService->start();
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  M5.Lcd.println("start");
}

int n = 0;
uint8_t notify_data[] = { 0x0a, 0x14, 0x0c, 0x13, 0x14, 0x23, 0x00, 0xbb, 0x58, 0x02, 0x00, 0x03, 0x00, 0x00, 0x01, 0x00, 0x02, 0x19 };

void loop() {
  delay(5000);

  if (connected) {
    pCharacteristic_fff4->setValue(notify_data, sizeof(notify_data));
    pCharacteristic_fff4->notify();
    M5.lcd.print("* ");
  }
}

ToDo

  • センサーのエラー?によりデータがおかしくなることがある。どうすれば治るのか?
    “TVOC: 9.999 mg/㎥ HCHO: 1.999 mg/㎥ CO2 : 2000 ppm” になる。これスマホアプリでも発生するんだよな。安心宝の電源をON/OFFしないと治らない?

続き: 二酸化炭素濃度(CO2)センサー VSON WP6003(安心宝)のデータをBLEで読み出す(3) – ESP32(M5atom)編 | ず@沖縄

リンク

ガジェット

Posted by ず@沖縄