温湿度ロガーの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で全てのサーバーを受信するように変更中です。