#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#if CONFIG_FREERTOS_UNICORE
#define ARDUINO_RUNNING_CORE 0
#else
#define ARDUINO_RUNNING_CORE 1
#endif
#ifndef LED_BUILTIN
#define LED_BUILTIN 13
#endif
#include <LiquidCrystal_I2C.h>
// Khởi tạo đối tượng LCD với địa chỉ I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Địa chỉ có thể thay đổi tùy loại LCD
void TaskBlink1(void *pvParameters);
void TaskBlink2(void *pvParameters);
void updateLCD(); // Hàm cập nhật LCD
volatile bool led1State = false; // Trạng thái LED 1
volatile bool led2State = false; // Trạng thái LED 2
void setup() {
Serial.begin(115200);
lcd.init(); // Khởi động LCD
lcd.backlight(); // Bật đèn nền LCD
xTaskCreatePinnedToCore(TaskBlink1, "TaskBlink1", 1024, NULL, 2, NULL, ARDUINO_RUNNING_CORE);
xTaskCreatePinnedToCore(TaskBlink2, "TaskBlink2", 1024, NULL, 1, NULL, ARDUINO_RUNNING_CORE);
}
void loop() {
updateLCD(); // Cập nhật trạng thái LCD
vTaskDelay(500); // Cập nhật mỗi nửa giây
}
void TaskBlink1(void *pvParameters) {
(void) pvParameters;
pinMode(19, OUTPUT);
for (;;) {
digitalWrite(19, HIGH);
led1State = true;
vTaskDelay(2000);
digitalWrite(19, LOW);
led1State = false;
vTaskDelay(3000);
}
}
void TaskBlink2(void *pvParameters) {
(void) pvParameters;
pinMode(18, OUTPUT);
for (;;) {
digitalWrite(18, HIGH);
led2State = true;
vTaskDelay(2500);
digitalWrite(18, LOW);
led2State = false;
vTaskDelay(500);
}
}
void updateLCD() {
lcd.clear(); // Xóa màn hình LCD
lcd.setCursor(0, 0); // Đặt con trỏ ở dòng đầu
lcd.print("LED 1: "); // In trạng thái LED 1
lcd.print(led1State ? "ON " : "OFF");
lcd.setCursor(0, 1); // Đặt con trỏ ở dòng thứ hai
lcd.print("LED 2: "); // In trạng thái LED 2
lcd.print(led2State ? "ON " : "OFF");
}