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