#include <LiquidCrystal_I2C.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
void BatLed1(void *pvParameters);
void BaTLed2(void *pvParameters);
void ButtonTask(void *pvParameters);
#define Led1_PIN 16
#define Led2_PIN 4
#define BUTTON_PIN 5
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool trangthai = false; // Trạng thái của LED 1 và LED 2
void setup() {
lcd.init();
lcd.backlight();
pinMode(Led1_PIN, OUTPUT);
pinMode(Led2_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Sử dụng INPUT_PULLUP cho nút nhấn
xTaskCreate(BatLed1, "Blink LED 1", 4096, NULL, 1, NULL);
xTaskCreate(BaTLed2, "Blink LED 2", 4096, NULL, 1, NULL);
xTaskCreate(ButtonTask, "Button Task", 4096, NULL, 1, NULL);
}
void loop() {
}
void BatLed1(void *pvParameters) {
for (;;) {
if (trangthai) {
digitalWrite(Led1_PIN, HIGH);
lcd.setCursor(0, 0);
lcd.print("Led 1: Bat ");
} else {
digitalWrite(Led1_PIN, LOW);
lcd.setCursor(0, 0);
lcd.print("Led 1: Tat ");
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void BaTLed2(void *pvParameters) {
for (;;) {
if (!trangthai) {
digitalWrite(Led2_PIN, HIGH);
lcd.setCursor(0, 1);
lcd.print("Led 2: Bat ");
} else {
digitalWrite(Led2_PIN, LOW);
lcd.setCursor(0, 1);
lcd.print("Led 2: Tat ");
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void ButtonTask(void *pvParameters) {
for (;;) {
static bool lastButtonState = HIGH;
bool currentButtonState = digitalRead(BUTTON_PIN);
// Kiểm tra xem nút có được nhấn không
if (lastButtonState == HIGH && currentButtonState == LOW) {
trangthai = !trangthai;
vTaskDelay(300 / portTICK_PERIOD_MS);
}
lastButtonState = currentButtonState;
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}