// 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 sensor DHT
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
DHT dht(0, DHT22);
// Variável de estado do LCD
volatile uint8_t lcdState = 0;
// Rotina de interrupção para o pino INT5
ISR(INT5_vect) {
lcdState = (lcdState + 1) % 2;
}
void setup() {
// Inicializa o o sensor DHT e o LCD com 16 colunas e 2 linhas
dht.begin();
lcd.begin(16, 2);
// Configura a interrupção externa INT5
EIMSK |= (1 << INT5);
EICRB |= (1 << ISC51);
// Configura o pino PE5 como entrada
DDRE &= ~(1 << DDE5);
// Configura os pinos PE1 e PH4 como saídas
DDRE |= (1 << DDE1);
DDRH |= (1 << DDH4);
// Habilita as interrupções globais
sei();
}
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
}
// Verifica o estado atual do LCD e atualiza o conteúdo correspondente
if (lcdState == 0) { // Exibe a mensagem da empresa
lcd.setCursor(4, 0);
lcd.print("obyTech");
lcd.setCursor(7, 1);
lcd.print("Ltda");
} else if (lcdState == 1) { // Exibe leitura de temperatura e umidade
lcd.setCursor(2, 0);
lcd.print("Temp: ");
lcd.print(dht.readTemperature());
lcd.print("C");
lcd.setCursor(2, 1);
lcd.print("Umid: ");
lcd.print(dht.readHumidity());
lcd.print("%");
} else { // Exibe mensagem de alerta de incêndio
lcd.setCursor(0, 0);
lcd.print("FOGO FOGO FOGO!");
lcd.setCursor(0, 1);
lcd.print("FOGO FOGO FOGO!");
}
}