#include <Arduino_FreeRTOS.h>
#include <task.h>
#include <Arduino.h>
#include <semphr.h>
// Definim porturile pentru butoane si led-uri
#define BUTTON1_PIN 29
#define BUTTON2_PIN 31
#define LED1_PIN 27
#define LED2_PIN 33
// Definim variabilele globale pentru numaratoarea led-ului si pentru setarea frecventei acestuia
int led2_counter = 0;
int led2_frequency = 5; // led-ul 2 va fi intermitent la fiecare 5 secunde
// Definim semafoarele pentru butoane
SemaphoreHandle_t button1Semaphore = NULL;
SemaphoreHandle_t button2Semaphore = NULL;
// Functia pentru task-ul Button Led
void buttonLedTask(void *pvParameters) {
pinMode(BUTTON1_PIN, INPUT_PULLUP);
pinMode(LED1_PIN, OUTPUT);
for(;;) {
if (xSemaphoreTake(button1Semaphore, portMAX_DELAY) == pdTRUE) {
digitalWrite(LED1_PIN, !digitalRead(LED1_PIN));
}
}
}
// Functia pentru task-ul Led Intermitent
void ledIntermitentTask(void *pvParameters) {
pinMode(LED2_PIN, OUTPUT);
for(;;) {
if (digitalRead(LED1_PIN) == LOW) {
digitalWrite(LED2_PIN, !digitalRead(LED2_PIN));
} else {
digitalWrite(LED2_PIN, LOW);
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
led2_counter++;
if (led2_counter >= led2_frequency) {
led2_counter = 0;
vTaskResume(NULL);
}
}
}
// Functia pentru task-ul Incrementare/Decrementare
void incrementDecrementTask(void *pvParameters) {
pinMode(BUTTON2_PIN, INPUT_PULLUP);
for(;;) {
if (digitalRead(BUTTON2_PIN) == LOW) {
led2_frequency+=1;
} else if (digitalRead(BUTTON2_PIN) == HIGH){
led2_frequency-=1;
}
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
// Functia pentru task-ul Idle
void idleTask(void *pvParameters) {
for(;;) {
Serial.print("LED1 Binary State: ");
Serial.println(digitalRead(LED1_PIN));
Serial.print("LED2 Binary State: ");
Serial.println(digitalRead(LED2_PIN));
Serial.print("led2_frequency: ");
Serial.println(led2_frequency);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void setup() {
Serial.begin(9600);
// Initializam semafoarele pentru butoane
button1Semaphore = xSemaphoreCreateBinary();
button2Semaphore = xSemaphoreCreateBinary();
// Cream task-urile
xTaskCreate(buttonLedTask, "Button Led Task", 128, NULL, 2, NULL);
xTaskCreate(ledIntermitentTask, "Led Intermitent Task", 128, NULL, 2, NULL);
xTaskCreate(incrementDecrementTask, "Increment/Decrement Task", 128, NULL, 2, NULL);
xTaskCreate(idleTask, "Idle Task", 128, NULL, 1, NULL);
}
// Incepem program
void loop() {
// Verificam daca butonul 1 a fost apasat si eliberat
if (digitalRead(BUTTON1_PIN) == LOW) {
xSemaphoreGive(button1Semaphore);
Serial.println("Button 1 pressed");
}
// Verificam daca butonul 2 a fost apasat si eliberat
if (digitalRead(BUTTON2_PIN) == LOW) {
xSemaphoreGive(button2Semaphore);
Serial.println("Button 2 pressed");
}
}