#include <driver/gpio.h>
#include <esp_log.h>
#include <esp_system.h>
#include <freertos/FreeRTOS.h>
#include <freertos/queue.h>
#include <freertos/task.h>

#define LED_PIN GPIO_NUM_21

QueueHandle_t buffer; // Objeto da queue

void task1(void *pvParams)
{
    uint32_t snd = 0;

    while (1) {
        // Se menor ou igual a 10
        if (++snd <= 10) {
            // Envia a variavel para queue
            xQueueSend(buffer, &snd, pdMS_TO_TICKS(0));
        } else {
            // Se nao, espera 5 segundos para testar o timeout da outra tarefa
            vTaskDelay(pdMS_TO_TICKS(4500));
            snd = 0;
        }

        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

void task2(void *pvParams)
{
    uint32_t rcv = 0;

    while (1) {
        // Se recebeu o valor dentro de 1seg (timeout), mostrara na tela
        if (xQueueReceive(buffer, &rcv, pdMS_TO_TICKS(1000)) == true) {
            ESP_LOGE("Queue", "Item recebido: %u", rcv); // Mostra o valor recebido na tela
        } else {
            ESP_LOGE("Queue", "Item não recebido, timeout expirou!"); // Se o timeout expirou, mostra erro
        }
    }
}

void task3(void *pvParams)
{
    gpio_pad_select_gpio(LED_PIN);
    gpio_set_direction (LED_PIN, GPIO_MODE_OUTPUT);

    while (1) {
        gpio_set_level(LED_PIN, 0);
        vTaskDelay(500 / portTICK_RATE_MS);
        gpio_set_level(LED_PIN, 1);
        vTaskDelay(500 / portTICK_RATE_MS);
    }
}

void app_main()
{
    TaskHandle_t xHandle = NULL;
    buffer = xQueueCreate(10, sizeof(uint32_t)); // Cria a queue *buffer* com 10 slots de 4 Bytes

    xTaskCreate(task1, "task1", 2048, NULL, 3, xHandle); // Cria tarefa que escreve valores na queue
    xTaskCreate(task2, "task2", 2048, NULL, 2, xHandle); // Cria tarefa que le valores da queue
    xTaskCreate(task3, "task3", 2048, NULL, 1, xHandle); // Cria tarefa para piscar o led
}
Loading
franzininho-wifi