#include <Arduino_FreeRTOS.h>
// タスクハンドルを定義
TaskHandle_t Taskcar_Handler; //車
TaskHandle_t Taskwalker_Handler; //歩行者
TaskHandle_t Taskswich_Handler; //
TaskHandle_t SerialTask_Handler;
// 3つのタスクを定義(プロトタイプ宣言)
void Taskcar(void *pvParameters); //車
void Taskwalker(void *pvParameters); //歩行者
void Taskswich(void *pvParameters);
void SerialTask(void *p);
#define led 10 //車 赤
#define yellow 9 //車 黄
#define bule 8 //車 青
#define button 13 //ボタン右
#define buttonB 5 //ボタン左
#define ledRight 11 //歩行者 赤 右
#define ledLeft 6 //歩行者 赤 左
#define buleRight 12 //歩行者 青 右
#define buleLeft 7 //歩行者 青 左
bool readButton(void);
void ledControl(void);
int buttonState = 0;
int counter = 0;
int inputNumber = 0;
unsigned long carRedtime = 0;
void setup() {
pinMode(led, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(bule, OUTPUT);
pinMode(button, INPUT_PULLUP); // 内蔵プルアップ抵抗を使う
pinMode(buttonB, INPUT_PULLUP); // もう1つのボタンも同様
Serial.begin(115200);
Serial.println("10以上の数字を入力してください:");
xTaskCreate(Taskcar, "car", 128, NULL, 1, &Taskcar_Handler);
xTaskCreate(Taskwalker, "walker", 128, NULL, 1, &Taskwalker_Handler);
xTaskCreate(Taskswich, "button", 128, NULL, 1, &Taskswich_Handler);
xTaskCreate(SerialTask, "SerialTask", 128, (void *)"Serial", 1, &SerialTask_Handler);
}
void loop() {}
void Taskcar(void* pvParameters) {
for (;;) {
if (counter == 0){
digitalWrite(led, LOW); // 赤を消灯
digitalWrite(yellow, LOW); // 黄色を消灯
digitalWrite(bule, HIGH); // 青を点灯
}else {
vTaskDelay(5000 / portTICK_PERIOD_MS); // 5秒間待機
digitalWrite(bule, LOW);
digitalWrite(yellow, HIGH); //黄 点灯
vTaskDelay(5000 / portTICK_PERIOD_MS); // 5秒間待機
digitalWrite(yellow, LOW);
digitalWrite(led, HIGH); //赤 点灯
Serial.println(carRedtime);
vTaskDelay(carRedtime / portTICK_PERIOD_MS); // 変数秒間待機
}
vTaskDelay(50 / portTICK_PERIOD_MS); // 短い遅延を入れて無限ループを高速回転しないようにする
}
}
void Taskwalker(void* pvParameters) {
for (;;) {
if (counter == 0){
digitalWrite(ledRight, HIGH);
digitalWrite(ledLeft, HIGH);
}else{
vTaskDelay(12000/ portTICK_PERIOD_MS); // 変数マイナス10秒間待機
digitalWrite(ledRight, LOW);
digitalWrite(ledLeft, LOW);
digitalWrite(buleRight, HIGH);
digitalWrite(buleLeft, HIGH);
vTaskDelay((carRedtime-10000) / portTICK_PERIOD_MS); // 5秒間待機
for (int i = 0; i < 6; i++) { // 5秒間点滅 (1秒ごとに点灯・消灯)
digitalWrite(buleRight, HIGH); // LEDを点灯
digitalWrite(buleLeft, HIGH); // LEDを点灯
vTaskDelay(500 / portTICK_PERIOD_MS); // 指定した時間だけ待つ
digitalWrite(buleRight, LOW); // LEDを消灯
digitalWrite(buleLeft, LOW); // LEDを消灯
vTaskDelay(500 / portTICK_PERIOD_MS); // 指定した時間だけ待つ
}
digitalWrite(ledRight, HIGH);
digitalWrite(ledLeft, HIGH);
vTaskDelay(3000 / portTICK_PERIOD_MS); // 3秒間待機
counter = 0;
}
}
}
void Taskswich(void* pvParameters) {
for (;;) {
buttonState = readButton();
if (buttonState == LOW) { // ボタンが押されたとき
counter = 1;
// }
} else {
counter = 0; // ボタンが押されていないときにリセット
}
vTaskDelay(50 / portTICK_PERIOD_MS); // チャタリング対策のための50ms遅延
}
}
// readButton関数を定義
bool readButton() {
if (digitalRead(button) == LOW || digitalRead(buttonB) == LOW) {
return LOW; // どちらかのボタンが押された場合
}
return HIGH; // 両方とも押されていない場合
}
void SerialTask(void *p) {
for (;;) {
if (Serial.available() > 0) {
// 入力された数字を読み取る
inputNumber = Serial.parseInt();
// もしparseInt()で有効な数字が読み取れたら表示する
if (inputNumber >= 10) { // 0が有効な場合も考慮
Serial.print("入力された数字は: ");
Serial.println(inputNumber);
} else {
Serial.println("無効な入力です。数字を再入力してください。");
}
carRedtime = inputNumber;
carRedtime = carRedtime*1000;
Serial.println(carRedtime);
// シリアルバッファをクリア
while (Serial.available() > 0) {
Serial.read(); // バッファを空にする
}
}
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}