M5StickC plusでBlynkを使ったパワーLEDの制御

本記事は、AndroidスマホからBLE(Bluetooth Low Energy)によってM5StickC Plusに信号を送り、パワーLEDの光り方を制御する方法についてまとめます。


準備するハードウェア

ソフトウェア

手順

  1. パワーLEDを光らせる回路を組みます

f:id:prescott0216:20210904013736p:plain:w250
LEDドライバ(PWM調光)の回路図

  1. M5StickCの信号線をLEDドライバと接続します
f:id:prescott0216:20210904015243p:plain:w400
M5Stick PWM信号出力
  1. Blynkのsampleコードをもとに、コーディングします

基本的には、loop関数内でBlynk.run()を実行するだけで良いです。
ただ、一度スマートフォン側でBLEを切断したのち、再接続しようとしても接続できませんでした。
そこで、ライブラリを修正しました。
具体的には、スマホが接続されたらBLEのアドバタイジングを止める、スマホが切断されたらBLEのアドバタイジングを開始できるようにしてみました。
今回、M5StickCに対して同時に何台も接続する必要がないので、とにかく再接続ができれば良しとしました。

メインプログラム

#include "M5StickCPlus.h"
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>

#define AUTHTOKEN "01234abcdef7890ghijklmn"
void setup()
{
  M5.begin();
  pinMode(GPIO_NUM_26, OUTPUT);
  Serial.begin(9600);

  Blynk.setDeviceName("KawasakiPannir");
  Blynk.begin(AUTHTOKEN);

  ledcSetup(LED_CH0, 12000, 8);
  ledcAttachPin(GPIO_NUM_26, LED_CH0);

   ledcWrite(LED_CH0, 0);    // LED OFF
}

BLYNK_WRITE(V0)            // Slider 0 to 255, PIN V0
{
  uint32_t value = param.asInt();
  Serial.println(value);
  ledcWrite(LED_CH0, value);
}

void loop()
{
  static bool myblestat = false;
  int ret;

  if(myblestat == false && Blynk.connected() == true)
  {
    Serial.println(" > Status Changed ! [ Connected ]");
    Blynk.endScan();
    myblestat = true;
  }
  ret = Blynk.run();
  if(ret < 0)
  {
    if(myblestat == true)
    {
      myblestat = false;
      resetLed0();
      Serial.println("Please wait...");
      delay(1000);
      Blynk.startScan();
      Serial.println("New Device Waiting...");
    }
    delay(500);
  }

}

BlynkSimpleEsp32_BLE.h

 (省略)
class BlynkTransportEsp32_BLE :
    public BLEServerCallbacks,
    public BLECharacteristicCallbacks
{
(省略)
public: 
    void stopAdvertising()
    {
        pServer->getAdvertising()->stop();
    }

    void startAdvertising()
    {
        pServer->getAdvertising()->start();
    }

(省略)
};

(省略)

class BlynkEsp32_BLE
    : public BlynkProtocol<BlynkTransportEsp32_BLE>
{
    typedef BlynkProtocol<BlynkTransportEsp32_BLE> Base;
public:
    BlynkEsp32_BLE(BlynkTransportEsp32_BLE& transp)
        : Base(transp)

 (省略)
    void startScan()
    {
        conn.startAdvertising();
    }

    void endScan()
    {
        conn.stopAdvertising();
    }

};

まとめ

スマートフォンとM5StickC PlusをBLEで接続し、 パワーLEDの調光ができました。

The following post may lead us to the solution of the BLE reconnection trouble that is included in the ESP32 library.