M5StickCPlusで温湿度ロガー その3 ー BLEデータ構造 ー

温湿度ロガーのBLEで使うデータ構造

struct {   // Bluetoothで送信するデータ   2byte * 7 = 14byte
  struct _sq {
    uint8_t       id;             // uniqueID 送信側の個々IDを使用
    uint8_t       unused = 0;     // 未使用
  } sq;
  struct _md {                    // 月日
    uint8_t       month;          // 月
    uint8_t       date;           // 日
  } md;
  struct _hm {                    // 時分
    uint8_t       hours;          // 時
    uint8_t       minutes;        // 分
  } hm;
  int16_t         pressure;       // 気圧         int(pres *  10)
  int16_t         temperature;    // 温度         int(temp * 100)
  int16_t         humidity;       // 湿度         int(humi * 100)
  int16_t         voltage;        // 電圧         int(volt * 100)
} bleDataPacket;  

2バイト単位で纏められるから頭の方に未使用の1バイトがある。

送信側のコード

bleDataPacket.sq.id       = bleDeviceNumber;
bleDataPacket.sq.unused   = 0;
bleDataPacket.md.month    = rtcDate.Month;
bleDataPacket.md.date     = rtcDate.Date;
bleDataPacket.hm.hours    = rtcTime.Hours;
bleDataPacket.hm.minutes  = rtcTime.Minutes;
bleDataPacket.pressure    = (int)(bmp280.readPressure() / 10.);
bleDataPacket.temperature = (int)(sht3x.cTemp    * 100.);
bleDataPacket.humidity    = (int)(sht3x.humidity * 100.);
bleDataPacket.voltage     = (int)(M5.Axp.GetBatVoltage() * 100.);
pBLECharacteristic->setValue((uint8_t*)&bleDataPacket, sizeof(bleDataPacket));   // 送信データをセットする

受信側のコード

BLEのコールバック関数内で受け取ったpDataを7行目の「memcpy」で構造体のbleDataPacketにコピーする、その後は各メンバ変数を使用する。

static void notifyCallback(
  BLERemoteCharacteristic* pBLERemoteCharacteristic,
  uint8_t* pData,
  size_t length,
  bool isNotify) {

  memcpy((char *)&bleDataPacket,(char *)pData,14);         // 受信データをパケット構造体へコピー

  Serial.printf("ID %d -->  ",bleDataPacket.sq.id);
  Serial.printf("Temp %.2f / Humi %.2f / ",bleDataPacket.temperature / 100.,bleDataPacket.humidity / 100.);
  Serial.printf("Pres %.1f / Volt %.2f\n",bleDataPacket.pressure / 10.,bleDataPacket.voltage / 100.);
}

温湿度ロガー現状

M5StickCPlusにデータ収集プログラムを入れ複数のサーバーを動かしてM5StickCで一つのサーバーデータを受信表示は作成済。

いまはM5StickCで全てのサーバーを受信するように変更中です。