M5stick c Plus⇔Raspberry Pi 4B間BLE通信(過去記事情報更新)

はじめに

この記事は以前投稿した記事を最新情報をもとにアップデートする目的で投稿しました。

対象の過去記事については以下のリンク先をご確認ください。

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()は使用されないので、何も記述しない
}

プログラムを書き込む際、エラーのような赤文字文章が続きましたが、書き込みはでき、問題なく実行もできました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA



reCaptcha の認証期間が終了しました。ページを再読み込みしてください。