#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 PI 3.14159
#define BETA 3950 //do sensor de temperatura
#define GAMMA 0.7 //do photoresistor
#define RL10 50 //photoresistor
#define THRESHOLD 853 //crepúsculo
#define FAROL PD7 //faróis
const int ac_max = 30;
const int ac_min = 17;
int ar_condicionado = 25;
// Função para inicializar o ADC
void adc_config(void) {
// Selecionar a referência de tensão(5V) para AVCC com um capacitor em AREF
ADMUX = (1 << REFS0);
// Configurar a prescaler para 128 para uma taxa de amostragem de 125 kHz com um clock de 16 MHz
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
// Função para ler o canal ADC especificado
uint16_t ler_adc(uint8_t canal) {
// Certifique-se de que o canal está entre 0 e 7
if (canal > 7) {
return 0;
}
// Configurar o canal (limpando bits de canal, então definindo o canal desejado)
ADMUX = (ADMUX & 0xF0) | (canal & 0x07);
// Iniciar a conversão
ADCSRA |= (1 << ADSC);
// Esperar a conversão terminar (ADSC será limpo após a conclusão)
while (ADCSRA & (1 << ADSC));
// Retornar o valor convertido
return ADCW; // ADCW é o valor de 16 bits da conversão
}
// Configuração do ADC e da USART
void setup(void) {
adc_config(); // Configura o ADC para leitura do valor analógico
LCD_Init(); // inicializa o LCD
}
int main(void) {
setup();
char buffer[16];
while (1) {
// Lendo o sensor de temperatura externa
uint16_t valor_temperatura_externa = ler_adc(1);
float temperatura_ex = 1 / (log(1 / (1023.0 / valor_temperatura_externa - 1)) / BETA + 1.0 / 298.15) - 273.15;
LCD_gotoxy(0, 0);
LCD_string("T. Ext: ");
dtostrf(temperatura_ex, 4, 1, buffer);
LCD_string(buffer);
LCD_string(" C");
// Lendo o sensor de temperatura interna
uint16_t valor_temperatura_interna = ler_adc(5);
float temperatura_in = 1 / (log(1 / (1023.0 / valor_temperatura_interna - 1)) / BETA + 1.0 / 298.15) - 273.15;
LCD_gotoxy(1, 0);
LCD_string("T. Int: ");
dtostrf(temperatura_in, 4, 1, buffer);
LCD_string(buffer);
LCD_string(" C");
_delay_ms(2000); // Delay para exibir os valores no LCD
// Lendo a temperatura na saída do ar condicionado
uint16_t valor_temperatura_arcond = ler_adc(7);
float temperatura_arcond = 1 / (log(1 / (1023.0 / valor_temperatura_arcond - 1)) / BETA + 1.0 / 298.15) - 273.15;
// Limitar a temperatura do ar condicionado dentro dos limites
if (ar_condicionado > ac_max) {
ar_condicionado = ac_max;
}
if (ar_condicionado < ac_min) {
ar_condicionado = ac_min;
}
LCD_Clear();
LCD_gotoxy(0, 0);
LCD_string("AC Temp: ");
dtostrf(temperatura_arcond, 4, 1, buffer);
LCD_string(buffer);
LCD_string(" C");
// Exibição da temperatura configurada no ar condicionado
LCD_gotoxy(1, 0);
LCD_string("AC Set: ");
dtostrf(ar_condicionado, 4, 1, buffer);
LCD_string(buffer);
LCD_string(" C");
_delay_ms(2000); // Delay para exibir os valores no LCD
// Lendo o fotoresistor
uint16_t valor_luminosidade = ler_adc(3); // Leitura do pino A2
float v_luz = (valor_luminosidade * 5) / 1024.0; // 5V é a tensão de referência
float resistencia = 2000 * v_luz / (1 - v_luz / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistencia, (1 / GAMMA));
LCD_Clear();
LCD_gotoxy(0, 0);
LCD_string("Lum: ");
dtostrf(lux, 4, 1, buffer);
LCD_string(buffer);
LCD_string(" lux");
if (lux > THRESHOLD) {
PORTD &= ~(1 << FAROL); // Apaga a luz/LED
LCD_gotoxy(1, 0);
LCD_string("Farol desligado");
} else {
PORTD |= (1 << FAROL); // Acende a luz/LED
LCD_gotoxy(1, 0);
LCD_string("Farol ligado");
}
_delay_ms(1000); // Delay para exibir os valores no LCD
}
return 0;
}