BLEとwifiを切り替えてメモリー節約方法

BLE接続を使用しないときにWiFiを起動することで、メモリ使用量を削減できます。BLEとWiFiはどちらもメモリを多く消費するため、同時に使用しないようにすることで、メモリの節約が可能です。以下に、BLEとWiFiを切り替えて使用する方法を説明します。


1. BLEとWiFiの切り替え方法

BLEとWiFiを同時に使用しないようにするため、以下の手順で切り替えを実装します。

(1) BLEの停止とWiFiの起動

BLEを停止し、WiFiを起動します。

#include <BLEDevice.h>
#include <WiFi.h>

void startWiFi() {
  // BLEを停止
  BLEDevice::deinit();

  // WiFiを起動
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
}

 

(2) WiFiの停止とBLEの起動

WiFiを停止し、BLEを起動します。

void startBLE() {
  // WiFiを停止
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);

  // BLEを起動
  BLEDevice::init("AQUA-FAN-BLE");
  BLEServer *pServer = BLEDevice::createServer();
  // BLEの設定を続ける...
}

 


2. 切り替えのトリガー

BLEとWiFiの切り替えをどのタイミングで行うかを決めます。例えば、以下のようなトリガーを使用できます。

  • ボタン操作: 物理ボタンを押すことで、BLEとWiFiを切り替える。
  • 時間ベース: 一定時間ごとにBLEとWiFiを切り替える。
  • 外部信号: 外部からの信号(例: シリアル通信)で切り替える。

以下は、ボタン操作で切り替える例です。

#define BUTTON_PIN 0  // ボタンのピン番号

void checkButton() {
  if (digitalRead(BUTTON_PIN) == LOW) {  // ボタンが押された場合
    if (WiFi.status() == WL_CONNECTED) {
      startBLE();  // WiFiを停止し、BLEを起動
    } else {
      startWiFi();  // BLEを停止し、WiFiを起動
    }
    delay(500);  // ボタンのチャタリング防止
  }
}

 


3. メモリ使用量の確認

切り替えが正しく行われているか、メモリ使用量を確認します。

void checkMemory() {
  Serial.printf("Free Heap: %d bytes\n", ESP.getFreeHeap());
}

 


4. 全体のコード例

以下は、BLEとWiFiを切り替える全体のコード例です。

#include <BLEDevice.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

// WiFiのSSIDとパスワード
const char *ssid = "******";
const char *password = "******";

// NTPサーバーの設定
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 9 * 3600, 60000);  // 日本時間 (JST = UTC+9)

#define BUTTON_PIN 0  // ボタンのピン番号

void startWiFi() {
  // BLEを停止
  BLEDevice::deinit();

  // WiFiを起動
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
}

void startBLE() {
  // WiFiを停止
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);

  // BLEを起動
  BLEDevice::init("AQUA-FAN-BLE");
  BLEServer *pServer = BLEDevice::createServer();
  // BLEの設定を続ける...
}

void checkButton() {
  if (digitalRead(BUTTON_PIN) == LOW) {  // ボタンが押された場合
    if (WiFi.status() == WL_CONNECTED) {
      startBLE();  // WiFiを停止し、BLEを起動
    } else {
      startWiFi();  // BLEを停止し、WiFiを起動
    }
    delay(500);  // ボタンのチャタリング防止
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // ボタンのピンを入力に設定

  // 初期状態でBLEを起動
  startBLE();
}

void loop() {
  checkButton();  // ボタンの状態を確認
  checkMemory();  // メモリ使用量を確認

  if (WiFi.status() == WL_CONNECTED) {
    // WiFiが接続されている場合の処理
    timeClient.update();
    Serial.println(timeClient.getFormattedTime());
  } else {
    // BLEが接続されている場合の処理
    // BLE関連の処理を続ける...
  }

  delay(1000);
}

 


5. メモリ削減の効果

  • BLEとWiFiの同時使用を避けることで、メモリ使用量を大幅に削減できます。
  • ESP32のヒープメモリは約327680バイトですが、BLEとWiFiを同時に使用すると、ヒープメモリが不足することがあります。切り替えを実装することで、この問題を回避できます。

6. その他の注意点

  • BLEとWiFiの切り替え時間: 切り替えには若干の時間がかかります。リアルタイム性が求められる場合は、切り替え時間を考慮してください。
  • 状態の保存: 切り替え時に状態を保存する必要がある場合は、EEPROMやSPIFFSを使用します。

この方法を適用することで、メモリオーバーを回避し、スケッチを正常に動作させることができます。

タイトルとURLをコピーしました