#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#if CONFIG_FREERTOS_UNICORE
#define ARDUINO_RUNNING_CORE 0
#else
#define ARDUINO_RUNNING_CORE 1
#endif
#define BUTTON_PIN 34
#define LED1_PIN 19
#define LED2_PIN 18
void TaskBlink1(void *pvParameters);
void TaskButton(void *pvParameters);
volatile bool ledToggle = false;
void setup() {
lcd.init(); // Khởi tạo LCD
lcd.backlight();
Serial.begin(115200);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED1_PIN, OUTPUT);
pinMode(LED2_PIN, OUTPUT);
xTaskCreatePinnedToCore(
TaskBlink1, // Hàm thực thi Task
"TaskBlink1", // Tên Task
2048, // Kích thước stack
NULL, // Tham số truyền vào (không có)
2, // Độ ưu tiên của Task
NULL, // Handle của Task (không cần)
ARDUINO_RUNNING_CORE // Chạy trên core chỉ định
);
xTaskCreatePinnedToCore(
TaskButton, // Hàm thực thi Task
"TaskButton", // Tên Task
1024, // Kích thước stack
NULL, // Tham số truyền vào (không có)
1, // Độ ưu tiên của Task
NULL, // Handle của Task (không cần)
ARDUINO_RUNNING_CORE // Chạy trên core chỉ định
);
}
void loop() {
// Không sử dụng loop() vì các Task đã được khởi tạo ở setup()
}
void TaskBlink1(void *pvParameters) {
(void) pvParameters;
for (;;) {
if (ledToggle) {
digitalWrite(LED1_PIN, HIGH);
digitalWrite(LED2_PIN, LOW);
lcd.setCursor(0, 0);
lcd.print("LED1: ON ");
lcd.setCursor(0, 1);
lcd.print("LED2: OFF ");
} else {
digitalWrite(LED1_PIN, LOW);
digitalWrite(LED2_PIN, HIGH);
lcd.setCursor(0, 0);
lcd.print("LED1: OFF ");
lcd.setCursor(0, 1);
lcd.print("LED2: ON ");
}
vTaskDelay(100 / portTICK_PERIOD_MS); // Kiểm tra trạng thái mỗi 100ms
}
}
void TaskButton(void *pvParameters) {
(void) pvParameters;
bool lastButtonState = HIGH;
for (;;) {
bool currentButtonState = digitalRead(BUTTON_PIN);
if (lastButtonState == HIGH && currentButtonState == LOW) {
// Nút nhấn được nhấn
ledToggle = !ledToggle; // Đổi trạng thái LED
}
lastButtonState = currentButtonState;
vTaskDelay(50 / portTICK_PERIOD_MS); // Chống dội nút
}
}