#include "DHT.h"
#include <LiquidCrystal.h>
// Definições globais
#define prints // Habilita todos os serial.print
// Variáveis globais ***************************************************
// DHT ----------------------------
int u, t; // umidade, temperatura
//---------------------------------
// *********************************************************************
// LiquidCrystal lcd(<pino RS>, <pino enable>, <pino D4>, <pino D5>, <pino D6>, <pino D7>)
LiquidCrystal lcd(12, 11, 9, 8, 7, 6);
// Definições DHT22
#define DHTPIN A4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Definições sensor da porta, buzzer e seletor
#define sensorPorta A7
#define buzzer 5
#define seletor A3
#define ajuste A5
#define aquecedor 10
void setup() {
Serial.begin(9600);
dht.begin(); // Inicialização DHT22
lcd.begin(16, 2); // definição display
pinMode(sensorPorta, INPUT); // definição porta do sensorPorta
pinMode(buzzer, OUTPUT); // definição porta do buzzer
pinMode(seletor, INPUT); // definição porta do buzzer
pinMode(ajuste, INPUT);
pinMode(aquecedor, OUTPUT);
}
void atualizaTempUmid() {
// Leitura da temperatura com esse sensor leva cerca de 250 millisegundos
// Pode levar até 2 segundos para mudar
u = dht.readHumidity();
// Lê a temperatura em ºC (padrão)
t = dht.readTemperature();
// Checa se nenhuma leitura falhou e tenta novamente
if (isnan(u) || isnan(t)) {
Serial.println(F("Falha ao ler o sensor DHT!"));
return; // transformar esse return em uma tratativa de erro depois
}
#ifdef prints
Serial.print(F("\nUmidade: "));
Serial.print(u);
Serial.print(F("% | Temperatura: "));
Serial.print(t);
Serial.print(F("°C"));
#endif
}
bool verificaPorta() {
bool porta;
int16_t sensor = analogRead(sensorPorta);
if(sensor > 800){porta = 1;}
else {porta = 0;}
return porta;
}
void loop() {
static bool configurando = 1;
static bool configurandoCiclo = 1;
static unsigned long tempoCiclo1 = 0;
static unsigned long tempoCiclo2 = 0;
if(configurando) { lcd.clear(); }
while(configurando){
while(configurandoCiclo){ // Seleção de tempo para o ciclo 1
tempoCiclo1 = map(analogRead(ajuste), 0, 1023, 0, 24);
lcd.setCursor(0, 0);
lcd.print("Tempo do ciclo 1:");
lcd.setCursor(5, 1);
lcd.print(tempoCiclo1);
lcd.print("H ");
configurandoCiclo = digitalRead(seletor);
delay(300);
}
configurandoCiclo = 1;
while(configurandoCiclo){ // Seleção de tempo para o ciclo 2
tempoCiclo2 = map(analogRead(ajuste), 0, 1023, 0, 24);
lcd.setCursor(0, 0);
lcd.print("Tempo do ciclo 2:");
lcd.setCursor(5, 1);
lcd.print(tempoCiclo2);
lcd.print("H ");
configurandoCiclo = digitalRead(seletor);
if(configurandoCiclo == 0) {configurando = 0; }
}
}
static unsigned long tempoCiclo1Seg = tempoCiclo1*3600; // Calcula o tempo selecionado em segundos
static unsigned long tempoCiclo2Seg = tempoCiclo2*3600;
unsigned long tempoInicioSeg = millis()/1000; // Obtem o tempo atual em segundos para a contagem do tempo que passou do início do ciclo
bool portaFechada = verificaPorta(); // Verifica se a porta está fechada para iniciar o ciclo
bool encerraCiclo1 = 0;
bool encerraCiclo2 = 0;
if(!portaFechada){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Feche a porta");
lcd.setCursor(0, 1);
lcd.print("para iniciar");
}
else{
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Iniciando");
lcd.setCursor(3, 1);
lcd.print("Aguarde...");
delay(2000);
}
delay(300);
while(!encerraCiclo2 && portaFechada){
while(!encerraCiclo1){
unsigned long tempoAtualSeg = millis()/1000; // Obtém o tempo atual em segundos
if((tempoAtualSeg - tempoInicioSeg) >= tempoCiclo1Seg){ // Verifica se o tempo do ciclo acabou para encerrar
encerraCiclo1 = 1;
tempoInicioSeg = millis()/1000;
}
if(!verificaPorta()){
digitalWrite(buzzer, HIGH);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Porta aberta!");
}else {
digitalWrite(buzzer, LOW);
lcd.clear();
atualizaTempUmid();
lcd.setCursor(2, 0);
lcd.print(t);
lcd.print(" C | ");
lcd.print(u);
lcd.print(" %");
}
if(t<20){ digitalWrite(aquecedor, HIGH); }
else if(t>25) { digitalWrite(aquecedor, LOW); }
delay(300);
}
}
// ...
// ...
}