#include <LiquidCrystal_I2C.h>
#include <Arduino_FreeRTOS.h>
#include "task.h"
#include "semphr.h"
#define BUTTON_PIN_S 13
#define BUTTON_PIN_H 12
#define BUTTON_PIN_M 11
LiquidCrystal_I2C lcd(0x27,16,2);
bool pom1 = false;
bool pom2 = false;
int hours = 0;
int minutes = 0;
int seconds =0;
bool isInSettings = true;
TaskHandle_t TaskHandle_displayTime;
TaskHandle_t TaskHandle_calculateTime;
TaskHandle_t TaskHandle_checkButton;
TaskHandle_t TaskHandle_adjustHours;
SemaphoreHandle_t buttonSemaphore = NULL;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Time editor");
buttonSemaphore = xSemaphoreCreateBinary();
xTaskCreate(displayTimeTask, "DisplayTimeTask", 128, NULL, 1, &TaskHandle_displayTime);
xTaskCreate(calculateTimeTask, "CalculateTimeTask", 128, NULL, 2, &TaskHandle_calculateTime);
xTaskCreate(checkButtonTask, "CheckButtonTask", 128, NULL, 1, &TaskHandle_checkButton);
xTaskCreate(adjustHoursTask, "AdjustHoursTask", 64, NULL, 1, &TaskHandle_adjustHours);
xTaskCreate(adjustMinutesTask,"lol",64,NULL,1,NULL);
vTaskStartScheduler();
lcd.backlight();
}
void loop() {}
void calculateTimeTask(void *pvParameters) {
(void) pvParameters;
for (;;) {
if(!isInSettings){
seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
}
if (minutes >= 60) {
minutes = 0;
hours++;
}
if (hours >= 24) {
hours = 0;
}
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void displayTimeTask(void *pvParameters) {
(void) pvParameters;
for (;;) {
displayTime();
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void checkButtonTask(void *pvParameters) {
(void) pvParameters;
pinMode(BUTTON_PIN_S, INPUT);
bool buttonPressed = false;
for (;;) {
if (digitalRead(BUTTON_PIN_S) == LOW && !buttonPressed) {
buttonPressed = true;
isInSettings = !isInSettings;
xSemaphoreGive(buttonSemaphore);
vTaskDelay(pdMS_TO_TICKS(200));
} else if (digitalRead(BUTTON_PIN_S) == HIGH && buttonPressed) {
buttonPressed = false;
}
vTaskDelay(pdMS_TO_TICKS(10));
}
}
void adjustHoursTask(void *pvParameters) {
(void) pvParameters;
if (!isInSettings){
pinMode(BUTTON_PIN_H, INPUT);
bool buttonPressed = false;
for (;;) {
if(isInSettings){
if (digitalRead(BUTTON_PIN_H) == LOW && !buttonPressed) {
buttonPressed = true;
if(pom1)
hours++;
pom1 = true;
if (hours > 23) hours = 0;
xSemaphoreGive(buttonSemaphore);
vTaskDelay(pdMS_TO_TICKS(200));
} else if (digitalRead(BUTTON_PIN_H) == HIGH && buttonPressed) {
buttonPressed = false;
}
}
vTaskDelay(pdMS_TO_TICKS(10));
}
}
}
void adjustMinutesTask(void *pvParameters) {
(void) pvParameters;
if (!isInSettings){
pinMode(BUTTON_PIN_M, INPUT);
bool buttonPressed = false;
for (;;) {
if(isInSettings){
if (digitalRead(BUTTON_PIN_M) == LOW && !buttonPressed) {
buttonPressed = true;
if(pom2)
minutes++;
pom2 = true;
if (minutes > 59) minutes = 0;
xSemaphoreGive(buttonSemaphore);
vTaskDelay(pdMS_TO_TICKS(200));
} else if (digitalRead(BUTTON_PIN_M) == HIGH && buttonPressed) {
buttonPressed = false;
}
}
vTaskDelay(pdMS_TO_TICKS(10));
}
}
}
void displayTime() {
lcd.setCursor(0, 1);
lcd.print("Time: ");
String hoursStr = (hours < 10 ? "0" : "") + String(hours);
String minutesStr = (minutes < 10 ? "0" : "") + String(minutes);
String secondsStr = (seconds < 10 ? "0" : "") + String(seconds);
lcd.print(hoursStr);
lcd.print(":");
lcd.print(minutesStr);
lcd.print(":");
lcd.print(secondsStr);
}