#if CONFIG_FREERTOS_UNICORE
#define ARDUINO_RUNNING_CORE 0
#else
#define ARDUINO_RUNNING_CORE 1
#endif
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#ifndef LED_BUILTIN
#define LED_BUILTIN 16
#endif
const int buttonPin = 4;
volatile bool led1State = false;
volatile bool led2State = false;
volatile bool buttonPressed = false;
void TaskBlink1(void *pvParameters);
void TaskBlink2(void *pvParameters);
void TaskButton(void *pvParameters);
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
pinMode(19, OUTPUT); // LED 1
pinMode(18, OUTPUT); // LED 2
pinMode(buttonPin, INPUT_PULLUP);
xTaskCreatePinnedToCore(TaskBlink1, "TaskBlink1", 1024, NULL, 2, NULL, ARDUINO_RUNNING_CORE);
xTaskCreatePinnedToCore(TaskBlink2, "TaskBlink2", 1024, NULL, 1, NULL, ARDUINO_RUNNING_CORE);
xTaskCreatePinnedToCore(TaskButton, "TaskButton", 1024, NULL, 3, NULL, ARDUINO_RUNNING_CORE);
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("LED 1: ");
lcd.print(led1State ? "ON " : "OFF");
lcd.setCursor(0, 1);
lcd.print("LED 2: ");
lcd.print(led2State ? "ON " : "OFF");
vTaskDelay(500 / portTICK_PERIOD_MS);
}
void TaskBlink1(void *pvParameters) {
(void) pvParameters;
for (;;) {
if (buttonPressed) {
digitalWrite(19, HIGH);
led1State = true;
led2State = false;
digitalWrite(18, LOW);
buttonPressed = false;
} else {
digitalWrite(19, led1State ? HIGH : LOW);
}
vTaskDelay(200 / portTICK_PERIOD_MS);
}
}
void TaskBlink2(void *pvParameters) {
(void) pvParameters;
for (;;) {
if (buttonPressed) {
digitalWrite(18, HIGH);
led2State = true;
led1State = false;
digitalWrite(19, LOW);
buttonPressed = false;
} else {
digitalWrite(18, led2State ? HIGH : LOW);
}
vTaskDelay(250 / portTICK_PERIOD_MS);
}
}
void TaskButton(void *pvParameters) {
(void) pvParameters;
for (;;) {
if (digitalRead(buttonPin) == LOW) {
buttonPressed = true;
Serial.println("Button pressed");
vTaskDelay(200 / portTICK_PERIOD_MS);
}
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}