//15/OCT/2024
// Incluir la librería de FreeRTOS
#include <Arduino_FreeRTOS.h>
#include <semphr.h> // Librería para semáforos en FreeRTOS
// Definiciones
#define BUTTON_PIN 2 // Pin donde está conectado el botón
#define LED_PIN 13 // Pin del LED integrado
// Declarar el handle del semáforo
SemaphoreHandle_t xSemaphore = NULL;
// Prototipos de funciones
void vTaskButton(void *pvParameters);
void vISR_ButtonPress();
void vTareaLed(void *pvParameters);
// Configuración inicial
void setup() {
// Inicializar los pines
Serial.begin(9600);
pinMode(8, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP); // Botón con resistencia pull-up interna
pinMode(LED_PIN, OUTPUT);
// Crear el semáforo binario
xSemaphore = xSemaphoreCreateBinary();
// Verificar si se creó el semáforo correctamente
if (xSemaphore != NULL) {
// Crear la tarea que esperará al semáforo
xTaskCreate(vTaskButton, "Button Task", 128, NULL, 1, NULL);
xTaskCreate(vTareaLed, "Tarea Led", 128, NULL, 1, NULL);
}
// Configurar interrupción para el botón
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), vISR_ButtonPress, FALLING);
}
void loop() {
// El loop se deja vacío, FreeRTOS se encarga del scheduling
}
// Tarea que espera a que el botón sea presionado
void vTaskButton(void *pvParameters) {
for (;;) {
// Esperar a que el semáforo sea "dado" (botón presionado)
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
// Encender el LED por 1 segundo cuando el semáforo es tomado
Serial.println("Me desperte");
digitalWrite(LED_PIN, HIGH);
vTaskDelay(1000 / portTICK_PERIOD_MS);
digitalWrite(LED_PIN, LOW);
}
}
}
// ISR que se activa cuando el botón es presionado
void vISR_ButtonPress() {
// Dar el semáforo desde la ISR
xSemaphoreGiveFromISR(xSemaphore,NULL);
}
void vTareaLed(void *pvParameters){
while(1){
Serial.println("ON");
digitalWrite(8, HIGH);
vTaskDelay(300/portTICK_PERIOD_MS);
Serial.println("OFF");
digitalWrite(8, LOW);
vTaskDelay(300/portTICK_PERIOD_MS);
}
}