#include "Arduino.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "Wire.h"
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
//Definições para os componentes
#define DHTPIN 4
#define DHTTYPE DHT22
#define QUEUE_LENGTH 10
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
#define LED 15 // LED com intervalo de acionamento de 20s
// Variáveis para armazenamento do handle das tasks
TaskHandle_t taks1Handle = NULL; //tarefa leitura sensor humidade/temp.
TaskHandle_t taks2Handle = NULL; //tarefa que escreve no LCD
TaskHandle_t taks3Handle = NULL; //tarefa para acionar o led de aquecimento
TaskHandle_t taks4Handle = NULL; //piscar o led embutido na placa a cada 20s
//protítipos das Tasks
void vTask1(void *pvParameters);
void vTask2(void *pvParameters);
void vTask3(void *pvParameters);
void vTask4(void *pvParameters);
//filas de temperatura e humidade
QueueHandle_t temperatureQueue;
QueueHandle_t humidityQueue;
#define SENSOR_READ_INTERVAL_MS 2000
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void DHTTask(void *pvParameters) {
float temperature, humidity;
char data[50];
for (;;) {
humidity = dht.readHumidity();
temperature = dht.readTemperature();
if (!isnan(temperature) && !isnan(humidity)) {
sprintf(data, "%.2f", temperature);
xQueueSend(temperatureQueue, data, portMAX_DELAY);
sprintf(data, "%.2f", humidity);
xQueueSend(humidityQueue, data, portMAX_DELAY);
} else {
Serial.println("Falha ao ler o sensor DHT22!");
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.setCursor(6, 0);
lcd.print(temperature);
lcd.print("C");
vTaskDelay(pdMS_TO_TICKS(SENSOR_READ_INTERVAL_MS));
}
}
/*
vTask4
pisca o led a cada 200ms
*/
void vTask4(void *pvParameters)
{
while (1)
{
digitalWrite(LED,!digitalRead(LED));
vTaskDelay(pdMS_TO_TICKS(200));
}
}
void setup() {
Serial.begin(9600);
pinMode(LED,OUTPUT);
temperatureQueue = xQueueCreate(QUEUE_LENGTH, sizeof(char) * 10);
humidityQueue = xQueueCreate(QUEUE_LENGTH, sizeof(char) * 10);
xTaskCreatePinnedToCore(
DHTTask,
"DHTTask",
10000,
NULL,
1,
NULL,
1
);
xTaskCreate(vTask4,"TASK4",configMINIMAL_STACK_SIZE+1024,NULL,2,&taks2Handle);
//configurando o lcd
Wire.begin(18, 19);
lcd.init();
lcd.backlight();
}
void loop() {
}