#define BLYNK_TEMPLATE_ID "TMPL26RsjPQpj"
#define BLYNK_TEMPLATE_NAME "PRATICA 04"
#define BLYNK_AUTH_TOKEN "UdO8HaSQ8kMZaiIRLIVPTmLyI0LtUuhW"
#include <WiFi.h>
#include <DHT.h>
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <freertos/semphr.h>
#include <BlynkSimpleEsp32.h>
#define Led 2
#define DHTPIN 21
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// --- CORREÇÃO: Declaração do Timer do Blynk ---
BlynkTimer timer;
float temperatura = 0;
float umidade = 0;
SemaphoreHandle_t xSerialSemaphore;
char auth [] = BLYNK_AUTH_TOKEN;
char ssid [] = "Wokwi-GUEST";
char pass [] = "";
// Protótipos das tarefas
void TaskLed(void *pvParameters);
void TaskSensor(void *pvParameters);
void setup() {
Serial.begin(115200);
pinMode(Led, OUTPUT);
// Inicializa Blynk
Blynk.begin(auth, ssid, pass);
// Inicializa Semáforo
if (xSerialSemaphore == NULL) {
xSerialSemaphore = xSemaphoreCreateMutex();
}
dht.begin();
// Criação das Tarefas
xTaskCreate(TaskLed, "LED", 2048, NULL, 3, NULL);
xTaskCreatePinnedToCore(TaskSensor, "SENSOR", 10000, NULL, 2, NULL, 0);
// Removi a TaskDisplay pois o LCD não estava no seu código atual
}
void loop() {
// No FreeRTOS com Blynk, o loop principal cuida da conexão
Blynk.run();
timer.run();
}
// Tarefa para piscar LED via código (Independente do Blynk)
void TaskLed(void *pvParameters) {
for (;;) {
if (xSemaphoreTake(xSerialSemaphore, portMAX_DELAY) == pdTRUE) {
digitalWrite(Led, HIGH);
vTaskDelay(500 / portTICK_PERIOD_MS);
digitalWrite(Led, LOW);
vTaskDelay(500 / portTICK_PERIOD_MS);
xSemaphoreGive(xSerialSemaphore);
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
// Tarefa para ler sensor e enviar ao Serial/Blynk
void TaskSensor(void *pvParameters) {
for (;;) {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (xSemaphoreTake(xSerialSemaphore, portMAX_DELAY) == pdTRUE) {
temperatura = t;
umidade = h;
if (isnan(t) || isnan(h)) {
Serial.println("Erro no DHT!");
} else {
Serial.printf("Temp: %.1f | Umid: %.1f\n", t, h);
// Envia para o App Blynk
Blynk.virtualWrite(V1, t);
Blynk.virtualWrite(V2, h);
}
xSemaphoreGive(xSerialSemaphore);
}
vTaskDelay(2000 / portTICK_PERIOD_MS); // Sensor DHT precisa de 2s
}
}
// Controle do Led via Botão no App Blynk (V0)
BLYNK_WRITE(V0) {
int buttonState = param.asInt();
digitalWrite(Led, buttonState);
Serial.println(buttonState == HIGH ? "Led Ligado via Blynk" : "Led Desligado via Blynk");
}