はじめに
この記事は以前投稿した記事を最新情報をもとにアップデートする目的で投稿しました。
対象の過去記事については以下のリンク先をご確認ください。
https://fa-vivorock-mura.com/m5stickcplus-raspberrypi4b-ble/
趣旨
以前M5stick c PlusとRaspberry Pi 4B間をBLE通信するプログラムを投稿しましたが、以下のリンク先にも投稿したように、ENV IIIに関するincludeファイルのアップデートが行われたようなので、プログラム修正をしました。
https://fa-vivorock-mura.com/m5stick-c-plusenv-iii-ver240224/
今回変更したのはM5stick c Plusプログラムのみで、Raspberry pi 4B側のプログラム、機器構成、実行結果に変更はありません。
プログラム
2024年2月24日時点でのプログラムです。
#include <M5StickCPlus.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <esp_sleep.h>
#include "M5UnitENV.h"
#define T_PERIOD 10 // アドバタイジングパケットを送る秒数
#define S_PERIOD 20 // Deep Sleepする秒数
SHT3X sht3x;
QMP6988 qmp;
float temperature = 0.0;
float humidity = 0.0;
float pressure = 0.0;
RTC_DATA_ATTR static uint8_t seq; // 送信SEQ
// BLEデータを設定する関数
void setAdvData(BLEAdvertising *pAdvertising, float temperature, float humidity, float pressure) {
BLEAdvertisementData oAdvertisementData = BLEAdvertisementData();
// アドバタイジングパケットの設定
oAdvertisementData.setFlags(0x06);
std::string strServiceData = "";
strServiceData += (char)0x0a;
strServiceData += (char)0xff;
strServiceData += (char)0xff;
strServiceData += (char)0xff;
strServiceData += (char)seq;
strServiceData += (char)((uint16_t)(temperature * 100) & 0xFF);
strServiceData += (char)(((uint16_t)(temperature * 100) >> 8) & 0xFF);
strServiceData += (char)((uint16_t)(humidity * 100) & 0xFF);
strServiceData += (char)(((uint16_t)(humidity * 100) >> 8) & 0xFF);
strServiceData += (char)((uint16_t)(pressure / 100) & 0xFF);
strServiceData += (char)(((uint16_t)(pressure / 100) >> 8) & 0xFF);
oAdvertisementData.addData(strServiceData);
pAdvertising->setAdvertisementData(oAdvertisementData);
}
// センサーデータをディスプレイに表示する関数
void displaySensorData(float temperature, float humidity, float pressure) {
M5.Lcd.setCursor(0, 0, 1);
M5.Lcd.printf("Temperature: %4.1f'C\r\n", temperature);
M5.Lcd.printf("Humidity: %4.1f%%\r\n", humidity);
M5.Lcd.printf("Pressure: %4.0fhPa\r\n", pressure);
}
void setup() {
M5.begin();
M5.Axp.ScreenBreath(10);
M5.Lcd.setRotation(1);
M5.Lcd.setTextSize(2);
M5.Lcd.setTextColor(WHITE, BLACK);
Wire.begin(32,33);
if (!qmp.begin(&Wire, QMP6988_SLAVE_ADDRESS_L, 32, 33, 400000U)) {
M5.lcd.println("Couldn't find QMP6988");
while (1) delay(1);
}
if (!sht3x.begin(&Wire, SHT3X_I2C_ADDR, 32, 33, 400000U)) {
M5.lcd.println("Couldn't find SHT3X");
while (1) delay(1);
}
pressure = qmp.calcPressure();
if(sht3x.update()){
temperature = sht3x.cTemp;
humidity = sht3x.humidity;
}
displaySensorData(temperature, humidity, pressure); // センサーデータをディスプレイに表示
BLEDevice::init("blepub-01");
BLEServer *pServer = BLEDevice::createServer();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
setAdvData(pAdvertising, temperature, humidity, pressure); // BLEデータを設定
pAdvertising->start();
delay(T_PERIOD * 1000);
pAdvertising->stop();
seq++;
delay(10);
esp_deep_sleep(1000000LL * S_PERIOD);
}
void loop() {
// このプログラムではloop()は使用されないので、何も記述しない
}
プログラムを書き込む際、エラーのような赤文字文章が続きましたが、書き込みはでき、問題なく実行もできました。