/*
Desenvolva o código multitarefas com o FreeRTOS que realiza as seguintes
ações:
Tarefa 1: Pisca um LED com o período ajustado através de uma variável
recebida por uma fila (Queue) vinda da Tarefa 3
Tarefa 2: Pisca um LED por 1 segundo, apenas quando a Tarefa 3 envia uma
notificação
Tarefa 3: Realiza a leitura de uma entrada analógica (conectada a um
potenciômetro) e utiliza o valor para configurar o tempo de delay (em ms)
da Tarefa 1, enviando o valor de delay através de uma fila. O valor lido
do ADC (0 - 4096) deve ser convertido em valores de 0 a 500 ms. Esta tarefa
é executada a cada 3 segundos. Quando o valor do potenciômetro estiver em 0,
uma notificação deve ser enviada para a Tarefa 2.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "freertos/semphr.h"
//#include "esp_log.h"
#define pinPot 36
#define LED2 GPIO_NUM_18
float valPot = 0.0;
xTaskHandle recep;
xQueueHandle ledAjust;
void lerPot(void *pvParams)
{
while (true)
{
valPot = map(analogRead(pinPot), 0, 4096, 0, 500);
printf("Valor potenciometro: %f\n", valPot);
if(valPot == 0){
xTaskNotify(recep, 10, eNoAction);
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
}
void task2(void *params)
{
while(true)
{
ulong respostaTask2 = ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
printf("Notificação recebida %lu \n", respostaTask2);
gpio_set_level(LED2, 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);
gpio_set_level(LED2, 0);
//vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void task1(void *params)
{
while(true)
{
}
}
extern "C" void app_main(void)
{
gpio_pad_select_gpio(LED2);
gpio_set_direction(LED2, GPIO_MODE_OUTPUT);// configura LED como saída digital
ledAjust = xQueueCreate(5, sizeof(float));
xTaskCreate(&lerPot, "Leitura pot", 2048, NULL, 0, NULL);
xTaskCreate(&task2, "Receptor", 2048, NULL, 0, &recep);
//xTaskCreate(&task2, "Display", 2048, NULL, 0, NULL);
}