#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <math.h>
#include "libserial.h"
#include <avr/interrupt.h>
volatile bool buzzer_ativo = false; // Estado do buzzer
volatile bool mensagem_enviada = false; // Estado da mensagem
volatile bool sistema_ativo = false; // Estado do sistema
void buzzer_estridente() {
if (buzzer_ativo && sistema_ativo) {
for (int i = 0; i < 100; i++) {
PORTB |= (1 << PORTB4);
_delay_us(100);
PORTB &= ~(1 << PORTB4);
_delay_us(100);
}
}
}
double obter_temp(int valor_adc) {
double temp_k, temp_c;
temp_k = log(10000.0 * (1024.0 / valor_adc - 1));
temp_k = 1 / (0.001129148 + (0.000234125 +
(0.0000000876741 * temp_k * temp_k)) * temp_k);
temp_c = temp_k - 273.15;
return temp_c;
}
ISR(INT0_vect) {
sistema_ativo = true; // Alterna o estado do sistema
}
ISR(INT1_vect) {
sistema_ativo = false; // Desativa o sistema
}
int main(void){
USART_Init();
ADMUX |= (1 << REFS0);
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // fator de divisão clock dividido por 128
ADCSRA |= (1 << ADEN); // liga o circuito do adc
DDRD &= ~(1 << DDD2); // Configura o pino PD2 como entrada
DDRD &= ~(1 << DDD3); // Configura o pino PD3 como entrada
PORTD &= ~(1 << PORTD2); // Desativa o resistor de pull-up para o pino PD2
PORTD &= ~(1 << PORTD3); // Desativa o resistor de pull-up para o pino PD3
EICRA |= (1 << ISC01) | (1 << ISC11); // Configura as interrupções para a borda de descida
EIMSK |= (1 << INT0) | (1 << INT1); // Habilita as interrupções externas INT0 e INT1
sei(); // Habilita interrupções globais
while(1){
if (sistema_ativo) {
ADCSRA |= (1 << ADSC); // inicia a conversão
while(ADCSRA & (1 << ADSC)); // espera a conversão terminar
double temp = obter_temp(ADC);
if (temp > 30.0 && !mensagem_enviada) {
USART_Tx_String("Temperatura: ");
USART_Tx_Double(temp); // Corrigido para usar a função que transmite doubles
USART_Tx_String("C\r\n");
USART_Tx_String("Temperatura acima de 30 graus\r\n");
buzzer_ativo = true;
mensagem_enviada = true;
} else if (temp <= 30.0) {
buzzer_ativo = false;
mensagem_enviada = false;
}
}
buzzer_estridente(); // Chama a função do buzzer
}
}