#define __ATmega2560__
#define __AVR_ATmega2560__
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <stdint.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdbool.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include "usart.h"
#include "lcd.h"
#define ar_ligado PG1 // led que indica se o ar condicionado está ligado
#define ligar_desligar_ar PD1
#define recirculacao_sinal PD3
#define recirculacao_led PC1
uint8_t recirculando, anterior_recirc, anterior_ar;
const int ac_max = 30;
const int ac_min = 17;
int ar_condicionado = 25;
// Função para configurar a interrupção externa
void external_interrupt_config(void) {
EICRA |= (1 << ISC11); // Configura interrupção para borda de descida no INT1
EIMSK |= (1 << INT1); // Habilita interrupção externa INT1
EICRA |= (1 << ISC31); // Configura interrupção para borda de descida no INT3
EIMSK |= (1 << INT3); // Habilita interrupção externa INT3
}
// Função para verificar o estado de uma chave e realizar debounce
uint8_t verifica_chave(volatile uint8_t *PORTx, uint8_t PINxn) {
static uint8_t leitura_atual_chave = 0;
static uint8_t leitura_anterior_chave = 0;
static uint8_t estado_atual_chave = 0;
static uint8_t estado_anterior_chave = 0;
_delay_ms(18); // Espera um intervalo maior que o repique do botão
leitura_anterior_chave = leitura_atual_chave;
leitura_atual_chave = (*PORTx & (1 << PINxn)) ? 1 : 0;
estado_anterior_chave = estado_atual_chave;
if (leitura_atual_chave == leitura_anterior_chave) {
estado_atual_chave = leitura_atual_chave;
}
return (estado_anterior_chave == 1 && estado_atual_chave == 0);
}
ISR(INT1_vect) {
// Verifica se houve mudança de estado e aplica debounce
if (verifica_chave(&PIND, ligar_desligar_ar)) {
// Estado estável do botão
PORTG ^= (1 << ar_ligado); // Comuta o LED de recirculação
}
}
// ISR para o botão de recirculação
ISR(INT3_vect) {
if (verifica_chave(&PIND, recirculacao_sinal)) {
// Botão pressionado
recirculando = !recirculando; // Alterna o estado de recirculação
PORTC ^= (1 << recirculacao_led); // Comuta o LED de recirculação
}
}
// Configuração do ADC e da USART
void setup(void) {
external_interrupt_config(); // Configura a interrupção externa
// Configurações para a recirculação
DDRD &= ~(1 << recirculacao_sinal); // Configura PD3 como entrada
PORTD |= (1 << recirculacao_sinal); // Habilita pull-up em PD3
DDRC |= (1 << recirculacao_led); // Configura o pino do LED de recirculação como saída
PORTC &= ~(1 << recirculacao_led);
DDRG |= (1 << ar_ligado); // Configura o pino do LED de recirculação como saída
PORTG &= ~(1 << ar_ligado);
DDRD &= ~(1 << ligar_desligar_ar); // Configura como entrada
PORTD |= (1 << ligar_desligar_ar); // Habilita pull-up
}
int main(void) {
setup();
while (1) {
sei();
}
return 0;
}