この記事でわかること
- EventGroup(イベントグループ)の機能内容(何ができるか)
- 使うメリット(どんな時に効くか)
- 最小構成のサンプル(ESP32 Arduinoで動く)
1. EventGroupの機能内容(何ができる?)
EventGroupは、複数のフラグ(ビット)を1つにまとめて管理し、
タスク同士で「条件が揃うまで待つ」を実現する仕組みです。
ざっくり言うと、
- 条件が成立したらビットを立てる
- 必要なビットが揃うまで待つ(AND待ち / OR待ち)
ができます。
例:
- Wi-Fi 接続完了
- センサー初期化完了
この 2つが揃ったら送信開始、みたいな待ち合わせが簡単になります。
2. EventGroupを使うメリット(何が嬉しい?)
メリット1:複数条件待ちがスッキリ書ける
「Wi-FiもOK」「センサーもOK」みたいな条件が増えると、
グローバル変数のフラグ監視(ポーリング)は見通しが悪くなりがちです。
EventGroupなら 待つ条件をビットでまとめて表現できます。
メリット2:待っている間はCPUを使わない
ポーリングだと「まだかな?」を定期チェックする必要がありますが、
EventGroupなら **条件が揃うまでタスクをブロック(待機)**できます。
3. 軽い実装:2条件が揃うまで待つ(ESP32 Arduino)
やること
- TaskA:Wi-Fi準備完了(を想定して)ビットを立てる
- TaskB:センサー準備完了(を想定して)ビットを立てる
- TaskC:2つのビットが揃うまで待つ → 揃ったら処理する
#include <Arduino.h>
static EventGroupHandle_t eg;
// どのビットが何を意味するかは「設計で決める」
#define WIFI_READY_BIT (1 << 0)
#define SENSOR_READY_BIT (1 << 1)
void WifiTask(void *pvParameters) {
vTaskDelay(pdMS_TO_TICKS(3000)); // 3秒後にWi-Fi接続できた想定
xEventGroupSetBits(eg, WIFI_READY_BIT); // ビットをたててWi-Fi接続完了を知らせる
for(;;) vTaskDelay(pdMS_TO_TICKS(1000));
}
void SensorTask(void *pvParameters) {
vTaskDelay(pdMS_TO_TICKS(1000)); // 1秒後にセンサー準備できた想定
xEventGroupSetBits(eg, SENSOR_READY_BIT); // ビットをたててセンサー準備完了を知らせる
for(;;) vTaskDelay(pdMS_TO_TICKS(1000));
}
void MainTask(void *pvParameters) {
for(;;) {
// Wi-Fi と Sensor の両方が揃うまで待つ(AND待ち)
xEventGroupWaitBits(
eg,
WIFI_READY_BIT | SENSOR_READY_BIT, // 待つ条件(ビットの組み合わせ:ここでは0b0011)
pdFALSE, // 成立してもビットは消さない(状態として扱う)
pdTRUE, // 全ビットが揃うまで待つ(AND)
portMAX_DELAY // 無期限待ち
);
Serial.println("[Main] Wi-Fi & Sensor OK -> Start!");
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void setup() {
Serial.begin(115200);
eg = xEventGroupCreate();
xTaskCreate(WifiTask, "WifiTask", 2048, NULL, 1, NULL);
xTaskCreate(SensorTask, "SensorTask", 2048, NULL, 1, NULL);
xTaskCreate(MainTask, "MainTask", 2048, NULL, 1, NULL);
}
void loop() {
vTaskDelay(portMAX_DELAY);
}
4. 使いどころのイメージ
-
「Wi-Fi接続完了」+「MQTT接続完了」→ 送信開始
-
「初期化完了」+「SDカードOK」→ ログ開始
-
「センサー準備完了」+「キャリブレーション完了」→ 計測開始
5. まとめ
-
EventGroupは ビット(フラグ)を束ねて タスク間で待ち合わせできる仕組み
-
**複数条件待ち(AND/OR)**が簡単になる
-
ポーリングせずに 条件が揃うまで待機できる