#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "libserial.h"
#define BUTTON_PIN PD2
volatile uint8_t button_active = 0;
volatile uint8_t buzzer_state = 0; // estado do buzzer: 0 - desligado, 1 - ligado
double obter_temp(int valor_adc) {
const float BETA = 3950;
double temp_k, temp_c;
temp_c = 1 / (log(1 / (1023. / valor_adc - 1)) / BETA + 1.0 / 298.15) - 273.15;
return temp_c;
}
int main(void) {
DDRB |= (1 << DDB5);
DDRD &= ~(1 << DDD3);
EICRA |= (1 << ISC11) | (1 << ISC10);
EIMSK |= (1 << INT1);
SREG |= (1 << SREG_I);
DDRB |= (1 << DDB7);
DDRD &= ~(1 << DDD6);
EICRA |= (1 << ISC11) | (1 << ISC10);
EIMSK |= (1 << INT0);
SREG |= (1 << SREG_I);
DDRB |= (1 << DDB2);
DDRD &= ~(1 << DDD2);
EICRA |= (1 << ISC11) | (1 << ISC10);
EIMSK |= (1 << INT0);
SREG |= (1 << SREG_I);
DDRB |= (1 << DDB3);
EICRA |= (1 << ISC01); // Borda de descida PD2
//EIMSK |= (1 << INT0); // Habilitar interrupção externa INT0 em PD2
EIMSK |= (1 << PCINT1);
SREG |= (1 << SREG_I); // Habilitar Interrupções globais
TCCR2A |= (1 << COM2A1) | (1 << WGM21) | (1 << WGM20);
TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20);
USART_Init();
ADMUX |= (1 << REFS0);
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
ADCSRA |= (1 << ADEN);
while(1){
ADCSRA |= (1 << ADSC); // Iniciar a leitura ADC
while(ADCSRA & (1 << ADSC)); // Aguardar fim da leitura
double temp = obter_temp(ADC);
if(temp > 30.0){
buzzer_on();
button_active = 1;
} else {
buzzer_off();
}
USART_Tx_String("Temperatura: ");
USART_Tx_Integer(temp);
USART_Tx_String("C\n");
_delay_ms(10);
}
}
void buzzer_on(void) {
TCCR2A |= (1 << COM2A1) | (1 << WGM21) | (1 << WGM20);
TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20);
OCR2A = 128; // 50% duty cycle para gerar som no buzzer
buzzer_state = 1; // Atualiza estado do buzzer para ligado
}
void buzzer_off(void) {
TCCR2A &= ~(1 << COM2A1);
buzzer_state = 0; // Atualiza estado do buzzer para desligado
}
//4 BOTÕES NO PCINT
ISR(INT1_vect) {
PORTB ^= (1 << PORTB2);
PORTB ^= (1 << PORTB1);
}
ISR(PCINT1_vect) {
PORTB ^= (1 << PORTB5);
PORTB ^= (1 << PORTB4);
}
//INTERRUPÇÃO
ISR(INT0_vect) {
if(buzzer_state == 1) {
buzzer_off();
}
}
ISR(INT0_vect) {
PORTB ^= (1 << PORTB5);
PORTB ^= (1 << PORTB4);
if(buzzer_state == 1) {
buzzer_off();
}
}
ISR(INT1_vect) {
PORTB ^= (1 << PORTB2);
PORTB ^= (1 << PORTB1);
}
ISR(PCINT_vect){
PORTB ^= (1 << PORTB4);
if(buzzer_state == 1) {
buzzer_off();
}
}
*/