#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 BOTAO 7 // Pino do botão
#define BUTTON_RED_PIN 10 // Pino do botão para ajustar o valor mínimo da temperatura
#define BUTTON_YEL_PIN 9 // Pino do botão para ajustar o valor máximo da temperatura
// Inicializa o objeto LiquidCrystal
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Inicializa o objeto DHT
DHT dht(DHTPIN, DHTTYPE);
unsigned int escala = 1;
unsigned int tela = 0;
// 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++;
// Pŕoxima tela
configuracao();
}
// 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
// Aguarda até que um botão seja pressionado
while(true)
{
if (digitalRead(BUTTON_RED_PIN) == LOW) {
// Botão vermelho pressionado, exibir temperatura em Celsius
delay(100);
escala = 1;
tela++; // tela = 2
showTemperature(escala);
break;
} else if (digitalRead(BUTTON_YEL_PIN) == LOW) {
// Botão amarelo pressionado, exibir temperatura em Fahrenheit
delay(100);
escala = 2;
tela++; // tela = 2
showTemperature(escala);
break;
} else if (digitalRead(BOTAO) == LOW) {
// Botão preto pressionado, exibir temperatura em Kelvin
delay(100);
escala = 3;
tela++; // tela = 2
showTemperature(escala);
break;
}
}
}
// Tela 2: (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: ");
if (escala == 1) { // '1' representa Celsius
lcd.print(dht.readTemperature());
lcd.print("C");
} else if (escala == 2) { // '2' representa Fahrenheit
lcd.print(dht.readTemperature(true));
lcd.print("F");
} else if (escala == 3) { // '3' representa Kelvin
lcd.print(dht.readTemperature() + 273.15);
lcd.print("K");
}
}
tela = 1;
}
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(BOTAO, INPUT_PULLUP);
pinMode(BUTTON_RED_PIN, INPUT_PULLUP); // esquerda / diminui
pinMode(BUTTON_YEL_PIN, INPUT_PULLUP); // direita / aumenta
// Exibe a mensagem inicial
showHelloMessage();
}
void loop()
{
// tela inicia em 0 (P&R)
if(digitalRead(BOTAO) == LOW) // Se apertado
{
//tela++; // Incrementa tela
delay(300);
if ( (tela == 1) || (tela > 2) ) // Se tela = primeira
{
tela = 1;
// Aparecerá para setar escala
configuracao();
// Ao selecionar, chamará a função de showTemperature()
// Serial.println(tela);
}
else if (tela == 2) // Se tela = segunda
{
tela++;
}
}
}