//*************************************************************************************
//* Atividade leitura sensor humidade/temperatura ht22 + sensor de proximidade
//* André Penha Soares Silva
//* Matrícula: 20212EE0013
//*************************************************************************************
//faz a leitura do sensor de humidade/temperatura e grava em variaveis globais
//criada uma tarefa exclusiva para escrever na serial
//faz a leitura da distancia e manda para a tarefa de escrita na serial
//cria em tempo de execucao uma tarefa para o freio (aciona led)
//depois de executada a tarefa do freio ele é excluida
//Biblioteca do Arduino
#include <Arduino.h>
//Bibliotecas FreeRTOS
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
//do sensor de humidade/temperatura
#include <DHT.h>
#define DHT_SENSOR_PIN 32 // ESP32 pin GPIO21 conectado no sensor DHT22
#define DHT_SENSOR_TYPE DHT22
//do sensor de distancia
#define TRIG_PIN 26 // ESP32 pino GPIO26 conectado no pino de TRIG do sensor ultrasonic
#define ECHO_PIN 25 // ESP32 pino GPIO25 conectado no pino de ECHO do sensor ultrasonic
#define DISTANCE_THRESHOLD 30 // limite de acionamento de distancia em centimetros
//led que sinaliza acionamento de freio
#define LED_PIN 2 // pino do led onboard do esp32
// Variáveis para armazenamento do handle das tasks
TaskHandle_t taks1Handle = NULL; //tarefa leitura sensor humidade/temp.
TaskHandle_t taks2Handle = NULL; //tarefa que escreve na serial
TaskHandle_t taks3Handle = NULL; //tarefa leitura sensor distancia
TaskHandle_t taks4Handle = NULL; //tarefa do acionamento do freio (sinalizado com o led)
//protítipos das Tasks
void vTask1(void *pvParameters);
void vTask2(void *pvParameters);
void vTask3(void *pvParameters);
void vTask4(void *pvParameters);
DHT dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE);
void setup() {
Serial.begin(115200);
dht_sensor.begin(); // initializa o DHT22 sensor
//configuracao dos pinos do sensor de distancia
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
//configurando pino do led como saida para o freio
pinMode(LED_PIN, OUTPUT);
//garante que o esp32 é inicializado com o led desligado
digitalWrite(LED_PIN, LOW); // turn off LED
//criação das tasks
xTaskCreate(vTask1,"TASK1",configMINIMAL_STACK_SIZE+1024,NULL,3,&taks1Handle);
xTaskCreate(vTask2,"TASK2",configMINIMAL_STACK_SIZE+1024,NULL,2,&taks2Handle);
xTaskCreate(vTask3,"TASK3",configMINIMAL_STACK_SIZE+1024,NULL,4,&taks3Handle);
}
//função loop (vazia)
void loop() {
}
//variaveis globais para o sensor de humidade/temperatura
float humi, tempC;
//variaveis globais do sensor de distancia
float duration_us, distance_cm;
//vTask1 - leitura do sensor de humidade/temperatura
void vTask1(void *pvParameters)
{
while (1)
{
// leitura do sensor de humidade
humi = dht_sensor.readHumidity();
// leitura da temperatura em graus Celsius
tempC = dht_sensor.readTemperature();
//periodo de leitura do sensor de 250ms
vTaskDelay(pdMS_TO_TICKS(100));
}
}
//vTask2 - escreve na serial
void vTask2(void *pvParameters)
{
while (1)
{
if ( isnan(tempC) || isnan(humi)) {
Serial.println("Falha na leitura do sensor DHT22!");
} else {
//impressao na serial do sensor de humidade/temperatura
Serial.print("Humidade: ");
Serial.print(humi);
Serial.print("%");
Serial.print(" | ");
Serial.print("Temp. : ");
Serial.print(tempC);
Serial.print("°C ");
// impressao na serial do sensor de distancia
Serial.print(" | ");
Serial.print( "Dist: ");
Serial.print(distance_cm);
Serial.println(" cm");
}
vTaskDelay(pdMS_TO_TICKS(300));
}
}
//vTask3 - leitura do sensor de distancia
void vTask3(void *pvParameters){
while (1) {
//gerando pulso de 10 microsegundos no pino do TRIG do sensor de distancia
digitalWrite(TRIG_PIN, HIGH);
vTaskDelay(pdMS_TO_TICKS(0.01)); //púlso de 10 microsegundos
digitalWrite(TRIG_PIN, LOW);
// medindo a duracao do pulso no pino ECHO
duration_us = pulseIn(ECHO_PIN, HIGH);
// calculando a distancia em centimetros
distance_cm = 0.017 * duration_us;
//monitor temporario do limite da distancia
if (distance_cm < DISTANCE_THRESHOLD){
xTaskCreate(vTask4,"TASK4",configMINIMAL_STACK_SIZE+1024,NULL,4,&taks4Handle);
}
//frequencia de atualizacao da leitura de distancia de 100ms
vTaskDelay(pdMS_TO_TICKS(100));
}
}
//vTask4 - acionamento do freio, sinalizado com o led
void vTask4(void *pvParameters){
digitalWrite(LED_PIN, HIGH); // turn on LED
vTaskDelete(NULL); //deleta a tarefa ao terminar o acionamento
}