#define F_CPU 16000000UL
#include <avr/io.h>
#include <math.h>
#include<util/delay.h>
#include "libserial.h"
char buzzerAtivo = 0;
char bt1 = 0; //bt 1
char est1 = 0; //bt 1
char ant1 = 0; //bt 1
char bt2 = 0; //bt 2
char est2 = 0; //bt 2
char ant2 = 0; //bt 2
char bt3 = 0; //bt 3
char est3 = 0; //bt 3
char ant3 = 0; //bt 3
char bt4 = 0; //bt 4
char est4 = 0; //bt 4
char ant4 = 0; //bt 4
char bt5 = 0; //bt 5
char est5 = 0; //bt 5
char ant5 = 0; //bt 5
char bt6 = 0; //bt 6
char est6 = 0; //bt 6
char ant6 = 0; //bt 6
char zona = 3; //configuração das zonas
char sens = 1; //ativa desativa o sensor
char temp1; //temperatura
char m1,m2,m3,m4 = 0; //configuração para que mensagens seja exibidas apenas uma vez *isso é opcional no código, pois ocupa muita memória
char j1,j2,j3,j11,j21,j31,p,p1 = 0; //configuração para que mensagens seja exibidas apenas uma vez *isso é opcional no código, pois ocupa muita memória
void controleBuzzer() {
if(sens==1){
if (buzzerAtivo==1) {
// Liga Buz
if(m2==0){
USART_Tx_String("Buzzer Apitando!!\r\n");
m1=0;
m2=1;
}
PORTD |= (1 << PORTD2);
_delay_ms(100);
} else {
PORTD &= ~(1 << PORTD2);
}
}
}
void zona1(){
// Botão para led 1
bt1 = (PIND & (1 << PIND7)) == (1 << PIND7);
if (bt1 == 1 && ant1 == 0) {
if (est1 == 1)
est1 = 0;
else
est1 = 1;
}
if (est1 == 1) {
PORTB |= (1 << PORTB5); // Led 3
if(p==0){
USART_Tx_String("Porta Aberta\r\n");
p=1;
p1=0;
}
buzzerAtivo = 1;
_delay_ms(100);
} else {
if(p1==0){
USART_Tx_String("Porta Fechada\r\n");
p1=1;
p=0;
}
PORTB &= ~(1 << PORTB5); // Led 3
}
// Botão para led 2
bt2 = (PIND & (1 << PIND6)) == (1 << PIND6);
if (bt2 == 1 && ant2 == 0) {
if (est2 == 1)
est2 = 0;
else
est2 = 1;
}
if (est2 == 1) {
PORTB |= (1 << PORTB4); // Led 2
if(j1==0){
USART_Tx_String("Janela 1 Aberta\r\n");
j1=1;
j11=0;
}
buzzerAtivo = 1;
} else {
if(j11==0){
USART_Tx_String("Janela 1 Fechada\r\n");
j11=1;
j1=0;
}
PORTB &= ~(1 << PORTB4); // Led 2
}
}
void zona2() {
// Botão para led 3
bt3 = (PIND & (1 << PIND5)) == (1 << PIND5);
if (bt3 == 1 && ant3 == 0) {
if (est3 == 1)
est3 = 0;
else
est3 = 1;
}
if (est3 == 1) {
PORTB |= (1 << PORTB1); // Led 3[
buzzerAtivo = 1;
if(j2==0){
USART_Tx_String("Janela 2 Aberta\r\n");
j2=1;
j21=0;
}
} else {
if(j21==0){
USART_Tx_String("Janela 2 Fechada\r\n");
j2=0;
j21=1;
}
PORTB &= ~(1 << PORTB1); // Led 3
}
// Botão para led 4
bt4 = (PIND & (1 << PIND4)) == (1 << PIND4);
if (bt4 == 1 && ant4 == 0) {
if (est4 == 1)
est4 = 0;
else
est4 = 1;
}
if (est4 == 1) {
PORTB |= (1 << PORTB0); // Led 4
if(j3==0){
USART_Tx_String("Janela 3 Aberta\r\n");
j3=1;
j31=0;
}
buzzerAtivo = 1;
} else {
if(j31==0){
USART_Tx_String("Janela 3 Fechada\r\n");
j3=0;
j31=1;
}
PORTB &= ~(1 << PORTB0); // Led 4
}
}
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;
const float BETA = 3950; // Deve corresponder ao coeficiente beta do termistor
double temp_c = 1 / (log(1 / (1023. /valor_adc - 1)) / BETA + 1.0 / 298.15) - 273.15;
return temp_c;
}
int main(void) {
// Configurações de saída para LEDs
DDRB |= (1 << DDB0); // LED D
DDRB |= (1 << DDB1); // LED C
DDRB |= (1 << DDB2); // ZONA B
DDRB |= (1 << DDB3); // ZONA A
DDRB |= (1 << DDB4); // LED A
DDRB |= (1 << DDB5); // LED B
// Configura pino de saída para o buzzer
DDRD |= (1 << DDD2); // PD0 como saída para o buzzer
// Configurações de entrada
DDRC &= ~(1 << DDC5); // pino 2
DDRD &= ~(1 << DDD3); // pino 3
DDRD &= ~(1 << DDD4); // pino 4
DDRD &= ~(1 << DDD5); // pino 5
DDRD &= ~(1 << DDD6); // pino 6
DDRD &= ~(1 << DDD7); // pino 7
USART_Init();
ADMUX = 0x00 | (1 << REFS0);
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
ADCSRA |= (1 << ADEN);
int valor_adc;
while(1){
ADCSRA = ADCSRA | (1 << ADSC);
while(ADCSRA &(1 << ADSC));
valor_adc = ADCL;
valor_adc |= (ADCH << 8);
double temp = obter_temp(valor_adc);
// Botão para desligar buzzer
bt5 = (PIND & (1 << PIND3)) == (1 << PIND3);
if (bt5 == 1 && ant5 == 0) {
if (est5 == 1)
est5 = 0;
else
est5 = 1;
}
if (est5 == 1) {
sens = 0; //desativa o sensor
buzzerAtivo = 0;
if(m3==0){
USART_Tx_String("Controle do Buzzer Inativo\r\n");
m3=1;
m4=0;
}
} else {
sens = 1; //ativa o sensor
if(m4==0){
USART_Tx_String("Controle do Buzzer ativo\r\n");
m2=0;
m3=0;
m4=1;
}
}
if(sens == 1){
if (temp > 30) {
USART_Tx_String("Temperatura atual elevada: ");
USART_Tx_Double(temp);
USART_Tx_String("\n");
buzzerAtivo = 1;
controleBuzzer();
}
}
if(sens == 1){
if (temp <= 30 && buzzerAtivo == 0) {
if(m1 ==0){
USART_Tx_String("Buzzer mudo\r\n");
m1 = 1 ;
m2=0;
}
}
}
// Botão para configurar zonas
bt6 = (PINC & (1 << PINC5)) == (1 << PINC5);
if (bt6 == 1 && ant6 == 0) {
if (est6 != 1)
est6 = 1;
}
if (est6 == 1) {
zona = zona+1;
est6=0;
}
if(zona>=4){
zona = 0;
}
if(est1, est2, est3, est4 == 0){
buzzerAtivo=0;
}
if(zona == 0){
zona1();
zona2();
PORTB |= (1 << PORTB2); // Led z2
PORTB |= (1 << PORTB3); // Led z1
} else if (zona == 1){
zona1();
PORTB &= ~(1 << PORTB2); // Led z2
PORTB |= (1 << PORTB3); // Led z1
} else if (zona == 2){
zona2();
PORTB |= (1 << PORTB2); // Led z2
PORTB &= ~(1 << PORTB3); // Led z1
} else if(zona==3){
PORTB &= ~(1 << PORTB2); // Led z2
PORTB &= ~(1 << PORTB3); // Led z1
}
controleBuzzer();
_delay_ms(500);
}
}