#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <LiquidCrystal_I2C.h>
#define ledPin 33
#define buttonPin 2
// กำหนดที่อยู่ I2C และขนาดจอ
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
int counter = 0; // ตัวนับค่า
int lastButtonState = LOW; // สถานะก่อนหน้าของปุ่ม
// Define task handles
TaskHandle_t TaskHandle_LED = NULL;
TaskHandle_t TaskHandle_Button;
TaskHandle_t TaskHandle_LCD = NULL;
// Task 1: Blink LED
void TaskLED(void *pvParameters) {
pinMode(ledPin, OUTPUT);
for (;;) {
digitalWrite(ledPin, HIGH);
vTaskDelay(pdMS_TO_TICKS(500));
if(counter%2 == 0){
digitalWrite(ledPin, LOW);
vTaskDelay(pdMS_TO_TICKS(500));
}
}
}
// Task 2: อ่านปุ่มกด
void TaskButton(void *pvParameters) {
static int lastButtonState = HIGH;
for (;;) { // Task จะรันแบบวนลูป
bool currentButtonState = digitalRead(buttonPin); // อ่านสถานะปุ่ม
// Serial.printf("taskbutt: %d\n", currentButtonState == HIGH && lastButtonState == LOW); // แสดงสถานะปุ่มก่อนเปลี่ยน
// Serial.printf("task button: currentButtonState %d lastButtonState %d\n", currentButtonState, lastButtonState);
if (currentButtonState == HIGH && lastButtonState == LOW) {
counter++; // เพิ่มค่าตัวนับ
// Serial.printf("Button is pressing: %d\n", counter);
}
lastButtonState = currentButtonState; // อัปเดตสถานะปุ่มเดิม
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}
// Task 3: อัปเดตจอ LCD
void TaskLCD(void *pvParameters) {
for (;;) {
LCD.setCursor(0, 1); // ย้ายเคอร์เซอร์ไปตำแหน่งแรกของบรรทัดแรก
LCD.print("Value: "); // แสดงข้อความ
LCD.setCursor(7, 1); // ย้ายเคอร์เซอร์ไปหลังคำว่า "Value: "
LCD.print(counter); // แสดงค่าตัวนับ
LCD.print(" "); // ลบค่าที่เหลือ (ถ้ามี)
vTaskDelay(pdMS_TO_TICKS(300)); // อัปเดตทุก 500ms
}
}
void setup() {
Serial.begin(115200);
while (!Serial) { ; }
Serial.println("FreeRTOS Demo on ESP32");
pinMode(buttonPin, INPUT_PULLUP);
delay(50);
bool currentButtonState1 = digitalRead(buttonPin);
Serial.printf("start taskbutt: %d\n", currentButtonState1);
LCD.init(); // เริ่มต้นการทำงานของจอ LCD
LCD.backlight(); // เปิดแสงไฟของจอ LCD
LCD.setCursor(0, 0);
LCD.print("Counter");
Serial.printf("Count start: %d\n", counter);
// สร้าง Task
xTaskCreate(TaskLED, "LED Blink", 1024, NULL, 1, &TaskHandle_LED);
xTaskCreate(TaskButton, "ReadButton", 1024, NULL, 2, &TaskHandle_Button);
xTaskCreate(TaskLCD, "UpdateLCD", 2048, NULL, 1, &TaskHandle_LCD);
}
void loop() {}