/*
Aluno: Barbara Alyce Prado de Arruda
Projeto: Automação de Temperatura
temperatura de limite:
Celsius = 38 °C.
Fahrenheit = 100,4 °F.
Nota de transparência sobre utilização de IA:
A lógica principal do projeto foi desenvolvida por mim mesma.
Foi utilizada a IA Gemini apenas como apoio para organizar o código
e auxiliar na implementação do botão, pois tive algumas dificuldades
nessa parte. Também reaproveitei o projeto de botão desenvolvido em sala.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inicializa o display no endereço 0x27 com 16 colunas e 2 linhas
LiquidCrystal_I2C lcd(0x27, 16, 2);
// botao ---
#define chave 3
int modoEscala = 0; // 0 para Celsius, 1 para Fahrenheit
int estadoBotaoAnt = HIGH; // Guarda o último estado do botão
//LED
int verde = 5;
int Vermelho= 4;
//som de alarme perigo!!!!
int buzzer = 6;
int valor_sensor = 0;
const float beta = 3950;
void setup()
{
Serial.begin(115200);
pinMode(5, OUTPUT);//led verde
pinMode(4, OUTPUT);//led vermelho
pinMode(buzzer, OUTPUT);//som
// Inicia o display LCD
lcd.init();
lcd.backlight();
// Configuração do Botão por Registradores (Pino Digital 3)
DDRD = DDRD & ~(1 << chave); // Configura como ENTRADA
PORTD = PORTD | (1 << chave); // Habilita o Pull-Up interno
// Escreve o texto base apenas uma vez
lcd.setCursor(0, 0);
lcd.print("Temp: ");
}
void loop()
{
// --- 1. Leitura do botão usando Registradores ---
int estadoBotaoAtual;
if (PIND & (1 << chave)) {
estadoBotaoAtual = HIGH;
} else {
estadoBotaoAtual = LOW;
}
// Detecta se o botão foi pressionado (transição de HIGH para LOW)
if (estadoBotaoAtual == LOW && estadoBotaoAnt == HIGH) {
modoEscala = !modoEscala; // Inverte o modo (0 vira 1, ou 1 vira 0)
delay(50); // Debounce rápido para o Wokwi
}
estadoBotaoAnt = estadoBotaoAtual; // Atualiza o estado anterior
// --- 2. Leitura e Cálculo do Sensor NTC ---
valor_sensor = analogRead(A0);
// Calcula a temperatura em Celsius
float tempC = 1.0 / (log(1.0 / (1023.0 / valor_sensor - 1.0)) / beta + 1.0 / 298.15) - 273.15;
float tempF = (tempC * 1.8) + 32.0;
// --- 3. Mostrar dados no LCD ---
lcd.setCursor(6, 0); // Vai direto para a posição do número
if (modoEscala == 0) {
// Modo Celsius
lcd.print(tempC, 1);
lcd.print(" C "); // Espaços limpam caracteres antigos
Serial.print("valor da temperatura: ");
Serial.println(tempC);
} else {
// Modo Fahrenheit
lcd.print(tempF, 1);
lcd.print(" F ");
Serial.print("valor da temperatura: ");
Serial.println(tempF);
}
// --- 4. Verificação de Alerta de Perigo ---
//lembrando que temperatura de limite escolida foi temperatura de limite:Celsius = 38 °C, Fahrenheit = 100,4 °F.
lcd.setCursor(0, 1);
if ((modoEscala == 0 && tempC >= 38.0) || (modoEscala == 1 && tempF >= 100.4))
{
lcd.print("PERIGO !!! ");
digitalWrite(Vermelho, HIGH);
digitalWrite(verde, LOW);
tone(buzzer, 1000); // Liga o alarme
}
else
{
lcd.print("Esta seguro ");
digitalWrite(Vermelho, LOW);
digitalWrite(verde, HIGH);
noTone(buzzer); // Desliga o alarme
}
// Reduzido para 50ms para que o botão responda IMEDIATAMENTE ao clique
delay(50);
}