#include <LiquidCrystal.h>
#include <DHT.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define DHTPIN 8 // Pino de dados conectado ao DHT22
#define DHTTYPE DHT22 // Tipo do sensor DHT
#define BUTTON_RED_PIN 18 // Pino do botão para ajustar o valor mínimo da temperatura
#define BOTAO_BLACK 19 // Pino do botão
#define BUTTON_YEL_PIN 20 // Pino do botão para ajustar o valor máximo da temperatura
#define BUTTON_BLU_PIN 21 // Pino do botão para desligar os alarmes quando estes estiverem soando
#define LED 31
#define BUZZER 33
#define POT A1
bool led_ligado = false;
bool buz_ligado = false;
bool botao_pressionado = false;
bool temperatura_fora_intervalo = false;
// Inicializa o objeto LiquidCrystal
LiquidCrystal lcd(24, 25, 26, 27, 28, 29);
// Inicializa o objeto DHT
DHT dht(DHTPIN, DHTTYPE);
bool tem_led = false;
bool tem_buzzer = false;
float temp_min = 20;
float temp_max = 37;
int time = 0;
int tela = 0;
unsigned int aux = 0;
unsigned int escala = 1; // Celsius
// Tela 0: (P&R tech's)
void showHelloMessage() {
// Limpa o display LCD
lcd.clear();
// Escreve a mensagem "Olá" no display LCD
lcd.print("Ola, P&R tech's");
// Espera 2 segundos
delay(2000);
// Incrementa para próxima tela (1)
tela++;
// Somente irá passar para a próxima tela quando pressionar o botão preto
}
// Tela 1: (Escolha a escala de temperatura)
void configuracao(){
// Limpa o display LCD
lcd.clear();
// Na primeira linha e coluna, seta "Escolha:"
lcd.print("Escolha o modo:");
// Na segunda linha primeira coluna, seta "Celsius" como primeira opção
lcd.setCursor(0, 1);
lcd.print("1(C)");
// Na segunda linha e sexta coluna, seta "Kelvin" como segunda opção
lcd.setCursor(6, 1);
lcd.print("2(K)");
// Na segunda linha e coluna doze, seta "Fahrenheit" como terceira opção
lcd.setCursor(12, 1);
lcd.print("3(F)");
// Não incrementa tela, pq ela vai ser exibida após a escala ser selecionada na próxima função
// Precisa incrementar tela dentro do while, linhas que estarão depois desse while não serão lidas
// Aguarda até que um botão seja pressionado
while(true)
{
if (digitalRead(BUTTON_RED_PIN) == LOW)
{ // Vermelho pressionado, temperatura em Celsius
delay(200);
escala = 1;
tela++; // tela = 2
ajuste_temp(escala);
break;
}
else if (digitalRead(BUTTON_YEL_PIN) == LOW)
{ // Amarelo pressionado, temperatura em Fahrenheit
delay(200);
escala = 2;
tela++; // tela = 2
ajuste_temp(escala);
break;
}
else if (digitalRead(BOTAO_BLACK) == LOW)
{ // Preto pressionado, temperatura em Kelvin
delay(200);
escala = 3;
tela++; // tela = 2
ajuste_temp(escala);
break;
}
}
}
// Tela 2: (Mínimo: X °C, Máximo: Y °C)
void ajuste_temp(char escala){
// Limpa o display LCD
lcd.clear();
// Na primeira linha e coluna, seta "Min:"
lcd.setCursor(0, 0);
lcd.print("Minimo: ");
// Temperatura mínima escolhida com a escala escolhida
if (escala == 1) // '1' - Celsius
{
lcd.print(temp_min);
lcd.print("C");
}
else if (escala == 2) // '2' - Fahrenheit
{
lcd.print((temp_min * 9.0 / 5.0) + 32.0);
lcd.print("F");
}
else if (escala == 3) // '3' - Kelvin
{
lcd.print(temp_min + 273.15);
lcd.print("K");
}
// Na segunda linha e primeira coluna, seta "Max"
lcd.setCursor(0, 1);
lcd.print("Maximo: ");
// Temperatura máxima escolhida com a escala escolhida
if (escala == 1) // '1' - Celsius
{
lcd.print(temp_max);
lcd.print("C");
}
else if (escala == 2) // '2' - Fahrenheit
{
lcd.print((temp_max * 9.0 / 5.0) + 32.0);
lcd.print("F");
}
else if (escala == 3) // '3' - Kelvin
{
lcd.print(temp_max + 273.15);
lcd.print("K");
}
}
// Lógica do botão (tela 2)
void DimAumTemp()
{
// Ajuste de temperatura mínima
while(!(digitalRead(BOTAO_BLACK) == LOW)){ // Enquanto botão (preto) não for pressionado
if(digitalRead(BUTTON_RED_PIN) == LOW) { // Se botão (esquerda) for apertado
temp_min -= 1.0; // decrementa
delay(100);
ajuste_temp(escala); // atualiza lcd com a nova temperatura
}
if(digitalRead(BUTTON_YEL_PIN) == LOW) { // Se botão (direita) for apertado
temp_min += 1.0; // incrementa
delay(100);
ajuste_temp(escala); // atualiza lcd com a nova temperatura
}
}
// Espera 300 MILIsegundo
delay(200);
// Ajuste de temperatura máxima
while(!(digitalRead(BOTAO_BLACK) == LOW)){ // Enquanto botão (preto) não for pressionado
if(digitalRead(BUTTON_RED_PIN) == LOW) { // Se botão (esquerda) for apertado
temp_max -= 1.0; // decrementa
delay(100);
ajuste_temp(escala); // atualiza lcd com a nova temperatura
}
if(digitalRead(BUTTON_YEL_PIN) == LOW) { // Se botão (esquerda) for apertado
temp_max += 1.0; // incrementa
delay(100);
ajuste_temp(escala); // atualiza lcd com a nova temperatura
}
}
}
// Tela 3: ON ou OFF de led e buzzer
void setAlarme(){
// Limpa o display LCD
lcd.clear();
// Escreve a mensagem "Olá" no display LCD
lcd.print("LED:");
lcd.setCursor(7,0);
// Se o led está ligado, printa ON, se não, printa OFF
if (tem_led == true)
{
lcd.print("ON");
}
else
{
lcd.print("OFF");
}
lcd.setCursor(0,1);
lcd.print("Buzzer:");
if (tem_buzzer == true)
{
lcd.print("ON");
}
else
{
lcd.print("OFF");
}
}
// ON e OFF de led e buzzer (tela 3)
void OnOff() {
// Verifica se o botão está pressionado
while (!(digitalRead(BOTAO_BLACK) == LOW)) {
// Se o botão vermelho for pressionado, alterna o estado do LED
if (digitalRead(BUTTON_RED_PIN) == LOW) {
tem_led = !tem_led; // Alterna o estado do LED
// digitalWrite(LED_PIN, tem_led ? HIGH : LOW); // Liga ou desliga o LED conforme o estado
delay(200);
setAlarme(); // Atualiza o LCD com o estado do LED e do buzzer
}
// Se o botão amarelo for pressionado, alterna o estado do buzzer
if (digitalRead(BUTTON_YEL_PIN) == LOW) {
tem_buzzer = !tem_buzzer; // Alterna o estado do buzzer
// if (tem_buzzer) {
// // Se o buzzer está ligado, emite um som
// tone(BUZZER_PIN, 1000);
// } else {
// // Se o buzzer está desligado, para de emitir som
// noTone(BUZZER_PIN);
// }
delay(200);
setAlarme(); // Atualiza o LCD com o estado do LED e do buzzer
}
}
// Aguarda um curto período para evitar rebotes
//delay(300);
}
// Tela 4: (Temperatura atual: X °C, mínimo e máximo setados)
void showTemperature(char escala)
{
// Lê a temperatura do sensor DHT
float temperatura = dht.readTemperature();
// Verifica se a leitura da temperatura foi bem-sucedida
if (isnan(temperatura)) {
lcd.clear();
lcd.print("Erro ao ler temp.");
} else {
// Limpa o display LCD
lcd.clear();
// Escreve a temperatura atual no display LCD
lcd.print(" Temp: ");
// Imprimir a temperatura atual na escala escolhida na tela 1
if (escala == 1)
{ // '1' representa Celsius
temperatura = dht.readTemperature();
lcd.print(temperatura);
lcd.print("C");
}
else if (escala == 2)
{ // '2' representa Fahrenheit
temperatura = dht.readTemperature(true);
lcd.print(temperatura);
lcd.print("F");
}
else if (escala == 3)
{ // '3' representa Kelvin
temperatura = dht.readTemperature() + 273.15;
lcd.print(temperatura);
lcd.print("K");
}
// Escreve temperatura máxima e mínima que a água pode estar
// Na segunda linha e primeira coluna, seta "Min:"
lcd.setCursor(0, 1);
lcd.print("Min:");
// Temperatura mínima escolhida com a escala escolhida
if (escala == 1) // '1' - Celsius
{
int min_C = temp_min;
lcd.print(min_C);
lcd.print("C");
}
else if (escala == 2) // '2' - Fahrenheit
{
int min_F = (temp_min * 9.0 / 5.0) + 32.0;
lcd.print(min_F);
lcd.print("F");
}
else if (escala == 3) // '3' - Kelvin
{
int min_K = temp_min + 273.15;
lcd.print(min_K);
lcd.print("K");
}
// Na segunda linha e sétima coluna, seta "Max"
lcd.setCursor(8, 1);
lcd.print("Max:");
// Temperatura máxima escolhida com a escala escolhida
if (escala == 1) // '1' - Celsius
{
int max_C = temp_max;
lcd.print(max_C);
lcd.print("C");
}
else if (escala == 2) // '2' - Fahrenheit
{
int max_F = (temp_max * 9.0 / 5.0) + 32.0;
lcd.print(max_F);
lcd.print("F");
}
else if (escala == 3) // '3' - Kelvin
{
int max_K = temp_max + 273.15;
lcd.print(max_K);
lcd.print("K");
}
}
}
void setup() {
// Serial.begin(9600);
// Inicializa o display LCD com 16 colunas e 2 linhas
lcd.begin(16, 2);
// Inicializa o sensor DHT
dht.begin();
// Configura o pino do botão como entrada e habilita o resistor pull-up interno
pinMode(BUTTON_RED_PIN, INPUT_PULLUP); // esquerda / diminui
pinMode(BOTAO_BLACK, INPUT_PULLUP);
pinMode(BUTTON_YEL_PIN, INPUT_PULLUP); // direita / aumenta
pinMode(BUTTON_BLU_PIN, INPUT_PULLUP); // desliga buzzer quando este ligar
// Exibe a mensagem inicial
showHelloMessage();
}
// Três modos de configurações
// 1º Setar mínimo e máximo FEITO
// 2º Escala de temperatura TERMINAR
// 3º Tipo de alarme FEITO
void loop() {
// tela inicia em 0 (P&R)
// Se tela = 4, ficar atualizando as temperaturas
// que estão sendo detectadas pelo sensor
if (tela == 2) // Se tela = segunda
{
//Serial.println(tela);
// ajust_temp já chamada dentro de configuracao() (tela 1)
// Precisa aperta uma vez no botão preto para entrar nesse
// if e então vai para a função DimAumTemp()
DimAumTemp();
if(digitalRead(BOTAO_BLACK) == LOW) // Se apertado
{
delay(100);
tela++; // tela = 3
}
}
else if (tela == 3) // Se tela = terceira
{
// Serial.println(tela);
setAlarme();
OnOff();
if(digitalRead(BOTAO_BLACK) == LOW) // Se apertado
{
delay(200);
tela++; // tela = 4
}
}
else if (tela == 4)
{
// Serial.println(tela);
showTemperature(escala); // Temperatura atual: X °C, mínimo e máximo setados
// Chamada da função para ligar o LED
ledON(temp_min, temp_max, escala);
delay(500);
if(digitalRead(BOTAO_BLACK) == LOW) // Se apertado
{
delay(100);
tela++; // tela = 5
}
// if (tem_led && (tem_buzzer == false)){
// ledON();
// }
// else if (tem_buzzer && (tem_led == false)) {
// buzON();
// }
// else if (tem_led && tem_buzzer) {
// ledON();
// buzON();
// }
// else {
// }
}
else // Se incrementar para um número diferente dos considerados anteriormente, volta a ser a primeira tela
{
tela = 1; // Reiniciar o loop
configuracao(); // Aparecerá para setar escala
//Serial.println(tela);
if(digitalRead(BOTAO_BLACK) == LOW) // Se apertado
{
delay(100);
tela++; // indo para tela 2
}
}
}
// Função para ligar o LED
void ledON(float temp_min, float temp_max, int escala) {
float minimo=0, maximo=0;
// convertendo para a escala de temp
if (escala == 2) {
minimo = (temp_min * 9.0 / 5.0) + 32.0;
maximo = (temp_max * 9.0 / 5.0) + 32.0;
}
else if (escala == 3) {
minimo = temp_min + 273.15;
maximo = temp_max + 273.15;
}
else if (escala == 1) {
minimo = temp_min;
maximo = temp_max;
}
float temperatura = 0;
// Lê a temperatura atual do sensor
if (escala == 1) {
// Celsius
temperatura = dht.readTemperature();
} else if (escala == 2) {
// Fahrenheit
temperatura = dht.readTemperature(true);
} else if (escala == 3) {
// Kelvin
temperatura = dht.readTemperature() + 273.15;
}
if (temperatura < minimo || temperatura > maximo)
{
digitalWrite(LED, HIGH);
}
else
{
digitalWrite(LED, LOW);
}
}