#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <math.h>
#include <stdio.h>
int BETA = 3950; // Valor do parametro B do NTC
void Inicia_USART(long unsigned int baud_rate)
{
int ubrr;
ubrr = ((F_CPU) / (8 * baud_rate)) - 1;
UBRR0H = (unsigned char)(ubrr >> 8);
UBRR0L = (unsigned char)ubrr;
UCSR0A |= (1 << U2X0);
UCSR0B |= ((1 << RXEN0) | (1 << TXEN0));
UCSR0C &= ~((1 << UMSEL01) | (1 << UMSEL00));
UCSR0C &= ~((1 << UPM01) | (1 << UPM00));
UCSR0C &= ~(1 << USBS0);
UCSR0C &= ~(1 << UCSZ02);
UCSR0C |= ((1 << UCSZ01) | (1 << UCSZ00));
UCSR0B |= (1 << RXCIE0); // Habilita a interrupção da recepção da USART
}
void enviar_dado(unsigned char data)
{
while (!(UCSR0A & (1 << UDRE0))); // Aguarda o buffer esvaziar
UDR0 = data; // Envia o dado
}
void enviar_string(const char *s) {
while (*s) {
enviar_dado(*s++);
}
}
// Configuração e leitura do ADC
void initADC() {
ADMUX |= (0 << REFS1) | (1 << REFS0);; // Configura VCC como referência
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Liga o ADC e configura prescaler
}
int readADC(int channel) {
ADMUX = (ADMUX & 0xF8) | channel; // Seleciona o canal do ADC (AD0)
ADCSRA |= (1 << ADSC); // Inicia a conversão
while (ADCSRA & (1 << ADSC)); // Espera a conversão completar
return ADC;
}
int main(void) {
initADC();
Inicia_USART(9600);
sei();
char buffer[50];
while (1) {
int AD0 = readADC(0);
int V0_mV = (int)((float)AD0 * 5000.0 / 1024.0); // Tensão em milivolts
// Envia a tensão da porta A0
snprintf(buffer, sizeof(buffer), "Tensao A0: %d.%02d V\n", V0_mV / 1000, V0_mV % 1000);
enviar_string(buffer);
// Calculo da temperatura
float T = 1 / (log(1 / (1023. / AD0 - 1)) / BETA + 1.0 / 298.15) - 273.15;
int T_dec = (int)(T * 100); // Temperatura multiplicada por 100
// Envia a temperatura
snprintf(buffer, sizeof(buffer), "Temperatura: %d.%02doC\n\n", T_dec / 100, T_dec % 100);
enviar_string(buffer);
_delay_ms(3000);
}
return 0;
}