/**
ESP32 + DHT22
*/
/*
Carrega a biblioteca do sensor de temperatura e umidade
*/
#include "DHTesp.h"
#include <ESP32Time.h>
/**************************************/
/* Declaração de IO´s */
/**************************************/
#define DHT_PIN 15 /* Seleciona o pino de IO a ser utilizado na comunicação One-Wire entre o sensor e o microcontrolador */
#define PinOsc 2 /* Definição da saída do Oscilador */
#define FimDeCurso 4
DHTesp dhtSensor; /* Declara o objeto para obter os dados do sensor, temperatura e umidade. */
/**************************************/
/* Declaração de variáveis */
/**************************************/
bool chaveAcionado = 0;
bool chaveEstadoAtual = 0;
bool chaveUltimoEstado = 0;
bool habilitaIntTimer = 0;
unsigned long tempoAtual;
unsigned long tempoAnterior1;
hw_timer_t *My_timer = NULL;
/**************************************/
/* Tratamento de Interrupção */
/**************************************/
void IRAM_ATTR onTimer() { /* Tarefa a ser realizada pela chamada da interrupção de timer */
if(habilitaIntTimer == true){
digitalWrite(PinOsc, !digitalRead(PinOsc)); /* Inverte o estado lógico da saída a cada 1 segundo */
}else{
digitalWrite(PinOsc, LOW); /* Liga o led Verde */
}
}
/**************************************/
/* Tratamento da chave Fim de Curso */
/**************************************/
boolean debounce(int pin, boolean ultimoEstado) {
boolean atual;
atual = digitalRead(pin); // Armazena o estado da entrada digital
if (ultimoEstado != atual) {
delay(5); // Aguarda 5 milisegundo
atual = digitalRead(pin); // Leitura da entrada digital
}
// Só virá aqui quando o estado da entrada digital estiver estável por mais tempo que o período de debounce
return atual;
}
/**************************************/
/* Configuração do microcontrolador */
/**************************************/
void setup() {
pinMode(FimDeCurso, INPUT);
pinMode(PinOsc, OUTPUT);
Serial.begin(115200); /* Configura a UART para degug serial do programa, "Console.log" */
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); /* Este função define qual IO será usado para ler o modelo do sensor. */
/* Configuração do Timer e interrupção */
My_timer = timerBegin(0, 80, true); /* Informa a frequencia de clock do microcontrolador */
timerAttachInterrupt(My_timer, &onTimer, true); /* Associa My_timer como a rotina a ser chamada a cada estouro do timer */
timerAlarmWrite(My_timer, 1000000, true); /* Habilita a interrupção a cada 1 segundo */
timerAlarmEnable(My_timer); /* Habilita o tratamento de interrupção */
}
/****************************************/
/* Executa a aplicação do usuário */
/* Leitura da temperatura e Umidade */
/****************************************/
void loop() {
chaveEstadoAtual = debounce(FimDeCurso, chaveUltimoEstado); /* Lê esta da chave fim de curso */
if (/*chaveUltimoEstado == true &&*/ chaveEstadoAtual == false) { /* verifica se o botão foi pressionado. */
chaveUltimoEstado = chaveEstadoAtual;
habilitaIntTimer = true; /* Habilita o ciclo do sinaleiro */
/* Lê a temperatura a cada 1 segundo */
tempoAtual = millis(); /* Leitura de timer para evitar o uso da função Delay */
if (tempoAtual >= (tempoAnterior1 + 1000)) { /* Tempo entre leituras da temperatura e umidade, essas grandezas físicas possuem em condições normais
baixa velocidade de alteração de valor, considerando a leitura de um ambiente, uma sala ou até um forno.*/
tempoAnterior1 = tempoAtual;
TempAndHumidity data = dhtSensor.getTempAndHumidity(); /* Neste linha temos a Struct TempAndHumidity, declarada na biblioteca do sensor
ela irá salvar os dados de leitura do sensor de temperatura e umidade nesta struct.*/
/* Apresentação dos valores obtidos do sensor de temperatura, utilizando-se qualquer Software de leitura serial tais como,
TeraTerm ou Docklight é possível ler os dados do Sensor, ou utilizando uma interface OnTheGo da USB do smartphone é possível ler os dados da serial do microcontrolador */
Serial.println("Temp: " + String(data.temperature, 2) + "°C"); /* Escreve na UART o valor da temperatura convertido para decimal ASCII com duas casas decimais.*/
Serial.println("Humidity: " + String(data.humidity, 1) + "%"); /* Escreve na UART o valor da umidade convertido para decimal ASCII com uma casa decimal.*/
Serial.println("Sala em USO, CUIDADO!"); /* Mensagem alertando o uso da sala. */
Serial.println("---"); /* Separador de mensagens para o usuário.*/
}
}else{
habilitaIntTimer = false; /* Interrompe o ciclo do sinaleiro */
}
}