#include <Arduino_FreeRTOS.h>
#include <MsTimer2.h>
#include <event_groups.h>
const int BUTTON_PIN = 2; // ボタンピン番号
const int ledpin = 3;
const int ledpin1 = 4;
const int TASK_A_FLAG = (1 << 0); // ボタンが押されたフラグ
const int TASK_B_FLAG = (1 << 1);
TaskHandle_t TaskA_Handler;
TaskHandle_t TaskB_Handler;
EventGroupHandle_t eventGroup;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(ledpin, OUTPUT);
eventGroup = xEventGroupCreate(); // イベントグループを作成
// タスクを作成
xTaskCreate(TaskA, "A", 128, NULL, 1, &TaskA_Handler);
xTaskCreate(TaskB, "B", 128, NULL, 1, &TaskB_Handler);
vTaskStartScheduler();
}
void loop() {
}
void TaskA(void *pvParameters) {
while (1) {
if (digitalRead(BUTTON_PIN) == LOW) { // LOWがフラグ
// ボタンが押されたときにフラグをセット
xEventGroupSetBits(eventGroup, TASK_B_FLAG);
vTaskDelay(200 / portTICK_PERIOD_MS);
}
/*
// ボタンが押されるまで待つ
xEventGroupWaitBits(
eventGroup,
TASK_A_FLAG, // ボタンが押されたフラグを待つ
pdTRUE, // フラグをキャッチしたらクリア
pdFALSE, // 単一ビット(TASK_A_FLAG)のみを待つ
portMAX_DELAY // 無限に待つ
);
ここの記述はTaskAが呼び出されるためのフラグ
ボタンを押すだけでTaskAが呼び出されるため、必要ない。
*/
/*
// ボタンが押された時の処理
Serial.println("Button was pressed!");
Serial.println(BUTTON_PIN);
*/
}
/*
xEventGroupSetBits(
eventGroup, //操作対象のイベントグループのハンドル(識別子)
TASK_B_FLAG //イベントグループ内で1をセットしたいビットを指定する値
);
*/
}
void TaskB(void *pvParameters) {
while(1){
// タスクBがフラグを取得するまで待機
xEventGroupWaitBits(eventGroup, TASK_B_FLAG, pdTRUE, pdFALSE, portMAX_DELAY);
digitalWrite(ledpin, HIGH);
vTaskDelay(2000 / portTICK_PERIOD_MS);
/*
// タスクAのフラグを設定してタスクAを解放
xEventGroupSetBits(eventGroup, TASK_A_FLAG);
この行はボタンを押すとTaskAが呼び出されるので必要ない
*/
}
}