// Arduino ATmega2560
// Definição dos pinos
// PIN A0 (PF0) = POTENCIÔMETRO
// PIN 0 (PE0) = DHT22:SDA
// PIN 1 (PE1) = LED:A
// PIN 3 (PE5) = BOTÃO:1:1.l (ESQUERDA)
// PIN 7 (PH4) = BUZZER:bz1:2
// PIN 8 (PH5) = LCD:D7
// PIN 9 (PH6) = LCD:D6
// PIN 10 (PB4) = LCD:D5
// PIN 11 (PB5) = LCD:D4
// PIN 12 (PB6) = LCD:EN
// PIN 13 (PB7) = LCD:RS
// 5V = {POTENCIÔMETRO:VCC; DHT22:VCC; BUZZER:bz1:2; LCD:VDD}
// GND = {POTENCIÔMETRO:GND; DHT22:GND; BOTÃO:1:2.l; BUZZER:bz1:1; LCD:VSS:RW; LED:C}
#include <avr/interrupt.h>
#include <LiquidCrystal.h>
#include <DHT.h>
// Inicializa o LCD e o DHT
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
DHT dht(0, DHT22);
// Estado do LCD
volatile uint8_t lcdState = 0;
// Interrupção para o pino 3 (INT5)
ISR(INT5_vect) {
lcdState = (lcdState + 1) % 2;
}
void setup() {
// Inicializa o o sensor DHT e o LCD
dht.begin();
lcd.begin(16, 2);
// Desabilita interrupções temporariamente
cli();
// Configura a interrupção externa INT5
EIMSK |= (1 << INT5);
EICRB |= (1 << ISC51);
// Habilita as interrupções globais
sei();
// Configura o pino 3 (PE5) como entrada
DDRE &= ~(1 << DDE5);
// Configura os pinos 1 (PE1) e 7 (PH4) como saídas
DDRE |= (1 << DDE1);
DDRH |= (1 << DDH4);
}
void loop() {
PORTE &= ~(1 << PORTE1); // Desliga o LED
PORTH &= ~(1 << PORTH4); // Desliga o BUZZER
// Verifica se o valor no potenciômetro (A0) é maior que 500
if (analogRead(A0) > 500) {
lcdState = 2; // Liga o alarme de incêndio
PORTE |= (1 << PORTE1); // Liga o LED
PORTH |= (1 << PORTH4); // Liga o BUZZER
}
lcdDisplay();
}
// Verifica o estado do LCD e atualiza o DISPLAY
void lcdDisplay() {
if (lcdState == 0) { // Tela inicial: EMPRESA
lcd.setCursor(0, 0);
lcd.print(" obyTech ");
lcd.setCursor(0, 1);
lcd.print(" Ltda ");
} else if (lcdState == 1) { // Tela de informação: Umidade e Temperatura
lcd.setCursor(0, 0);
lcd.print(" Temp: ");
lcd.print(dht.readTemperature());
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print(" Umid: ");
lcd.print(dht.readHumidity());
lcd.print("% ");
} else { // Tela de alerta: Alarme de Incêndio
lcd.setCursor(0, 0);
lcd.print(" !!! ALERTA !!! ");
lcd.setCursor(0, 1);
lcd.print(" FOGO FOGO FOGO ");
}
}