#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
//#include "freertos/FreeRTOS.h"
//#include "freertos/task.h"
#define SERVO_PIN 18
#define POTENTIOMETER_PIN 13
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
const float GAMMA = 0.7;
const float RL10 = 50;
Servo myservo;
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
TaskHandle_t xHandle_LCD;
volatile int potValue = 0;
volatile int servoPos = 0;
volatile bool blinkingState = false;
volatile float lux = 0;
TaskHandle_t Task1;
TaskHandle_t Task2;
TaskHandle_t Task3;
TaskHandle_t Task4;
TaskHandle_t Task5;
void setup() {
Serial.begin(115200);// швидкість передачі даних
pinMode(13, INPUT);
myservo.attach(SERVO_PIN);
//Створюємо задачу, яка буде виконуватись на ядрі 0 з максимальним пріоритетом 1
xTaskCreatePinnedToCore(
Task1code, /* Назва функції задачі. */
"Task1", /* Її імя. */
10000, /* Розмір стеку функції*/
NULL, /* Параметри */
1, /* Пріоритет */
&Task1, /* Дескриптор задачі для відслідкування */
0); /* Вказуємо пін для даного ядра */
delay(500);
xTaskCreatePinnedToCore(Task2code, "Task2", 10000, NULL, 1, &Task2, 1);
// Створюємо 2 задачу, яка буде виконуватись на ядре 1 з максимальним пріоритетом (1)
delay(500);
xTaskCreatePinnedToCore(Task3code, "Task3", 10000, NULL, 0, &Task3, 0);
// Створюємо 3 задачу, яка буде виконуватись на ядре 0 з пріоритетом (1)
xTaskCreatePinnedToCore(Task4code, "Task4", 10000, NULL, 1, &Task4, 1);
// Створюємо 4 задачу, яка буде виконуватись на ядре 1 з пріоритетом 1
delay(500);
xTaskCreatePinnedToCore(Task5code, "Task5", 10000, NULL, 1, &Task5, 0);
delay(500);
}
void Task5code(void *pvParameters) {
Serial.println("Задача 5");
for (;;) {
int analogValue = analogRead(15);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
vTaskDelay(pdMS_TO_TICKS(500));
}
}
// Task1code: мигає світлодіодом раз в 2 секунди
void Task1code(void *pvParameters) {
Serial.println("Задача 1");
for (;;) {
potValue = analogRead(POTENTIOMETER_PIN);
servoPos = map(potValue, 0, 4095, 0, LCD_COLUMNS);
vTaskDelay(pdMS_TO_TICKS(10));
}
}
// Task2code: мигає раз у 0,7 секунди
void Task2code(void *pvParameters) {
Serial.println("Задача 2");
for (;;) {
int targetPosition = map(potValue, 0, 4095, 0, 180);
Serial.println(targetPosition);
myservo.write(targetPosition);
vTaskDelay(pdMS_TO_TICKS(20));
}
}
// Task2code: мигає раз у 0,1 секунди
void Task3code(void *pvParameters) {
Serial.println("Задача 3");
for (;;) {
blinkingState = !blinkingState;
vTaskDelay(pdMS_TO_TICKS(500)); // Невелика затримка, щоб зменшити навантаження
}
}
// Task4code: вмикання та вимк. раз на 0,5 сек
void Task4code(void *pvParameters) {
Serial.println("Задача 4");
lcd.init();
lcd.backlight();
byte squareChar[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
lcd.createChar(0, squareChar);
bool displayBlink = false;
for (;;) {
lcd.setCursor(0, 0);
lcd.print("Angle: ");
lcd.print(map(servoPos, 0, LCD_COLUMNS, 0, 180));
lcd.setCursor(0, 1);
lcd.print("Lypkan/Rachkovsky");
vTaskDelay(pdMS_TO_TICKS(1000));
lcd.clear();
vTaskDelay(pdMS_TO_TICKS(500));
lcd.setCursor(0, 1);
lcd.print("Lux: ");
lcd.print(lux);
vTaskDelay(pdMS_TO_TICKS(1000));
lcd.clear();
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void loop() {
// Ваш код для функції loop (якщо потрібно)
Serial.println(xPortGetCoreID());
vTaskDelay(pdMS_TO_TICKS(500));
}