// Define os pinos usados para o botão e a interrupção
const int buttonPin = 2; // Pino do botão
volatile int contarclicks = 0; // Contagem de cliques
unsigned long ultimoclick = 0; // Último tempo de clique
unsigned long ultimoRPM = 0; // Último tempo de cálculo de RPM
unsigned long rpm = 0; // RPM atual
float distancia_percorrida = 0;
float diametro = 0.4064;
float velocidade = 0;
const float BETA = 3950;
int farol = 0;
const int temperatura_ac_max = 30;
const int temperatura_ac_min = 16;
volatile int ac_setpoint = 20; // Valor inicial do setpoint
const int buttonpinincrementar = 3; // Pino do botão para aumentar o setpoint
const int buttonpindecrementar = 21; // Pino do botão para diminuir o setpoint
const int buttonPinRecirculacao = 20; // botao da recirculação
int circulacao = 0;
void buttonISR() {
// Verifica se passou tempo suficiente desde o último clique
unsigned long tempoatual = millis();
if (tempoatual - ultimoclick > 100) {
contarclicks++;
ultimoclick = tempoatual;
}
distancia_percorrida += 0.4064*PI;
}
/**
* @brief Configuramos o ADC para realizar leituras no canal ADC5. Consideramos
* a frequência de relógio do sistema de 16 MHz. Usaremos os 10 bits do conversor.
*/
void ADC_configura(void)
{
ADCSRA = 0x87; // ADEN=1 ADSC=0 ADATE=0 ADIE=0 ADIF=0 ADPS[2:0]=111
ADCSRB = 0x00; // bit[7]=reservado=0 ACME=0 bits[5:4]=reservado=0 MUX[5]=0 ADTS[2:0]=000
ADMUX = 0x45; // REFS[1:0]=01 ADLAR=0 MUX[4:0]=00101
}
// Realiza a leitura do sensor 1
uint16_t ler_sensor1(void)
{
// Configura o MUX (canal do ADC) para o sensor 1
ADMUX = (ADMUX & 0xF0) | 0x01; // Exemplo: sensor 1 está no canal 1
ADCSRA |= (1 << ADSC); // Inicia a conversão
while (ADCSRA & (1 << ADSC)) // Aguarda o término da conversão
;
return ADC; // Retorna o valor do sensor 1
}
// Realiza a leitura do sensor 2
uint16_t ler_sensor2(void)
{
// Configura o MUX para o sensor 2
ADMUX = (ADMUX & 0xF0) | 0x02; // Exemplo: sensor 2 está no canal 2
ADCSRA |= (1 << ADSC); // Inicia a conversão
while (ADCSRA & (1 << ADSC)) // Aguarda o término da conversão
;
return ADC; // Retorna o valor do sensor 2
}
// Realiza a leitura do sensor 3
uint16_t ler_sensor3(void)
{
// Configura o MUX para o sensor 3
ADMUX = (ADMUX & 0xF0) | 0x03; // Exemplo: sensor 3 está no canal 3
ADCSRA |= (1 << ADSC); // Inicia a conversão
while (ADCSRA & (1 << ADSC)) // Aguarda o término da conversão
;
return ADC; // Retorna o valor do sensor 3
}
uint16_t ler_sensor4(void)
{
// Configura o MUX para o sensor 4
ADMUX = (ADMUX & 0xF0) | 0x04; // Exemplo: sensor 4 está no canal 4
ADCSRA |= (1 << ADSC); // Inicia a conversão
while (ADCSRA & (1 << ADSC)) // Aguarda o término da conversão
;
return ADC; // Retorna o valor do sensor 4
}
void setup() {
// Inicializa os pinos
pinMode(buttonPin, INPUT_PULLUP);
pinMode(buttonpinincrementar, INPUT_PULLUP);
pinMode(buttonpindecrementar, INPUT_PULLUP);
pinMode(buttonPinRecirculacao, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), buttonISR, RISING);
attachInterrupt(digitalPinToInterrupt(buttonpinincrementar), buttonISRIncrease, RISING);
attachInterrupt(digitalPinToInterrupt(buttonpindecrementar), buttonISRDecrease, RISING);
attachInterrupt(digitalPinToInterrupt(buttonPinRecirculacao), buttonREC, RISING);
// Inicializa a comunicação serial com USART0 (Serial0) a 9600 bps
UCSR0B = (1 << TXEN0); // Habilita a transmissão
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // Define o formato de transmissão (8 bits de dados, 1 bit de parada)
UBRR0 = 51; // Configura a velocidade de transmissão para 9600 bps
}
void transmitByte(uint8_t data) {
// Aguarda até que o buffer de transmissão esteja vazio
while (!(UCSR0A & (1 << UDRE0))) {}
// Envia o byte
UDR0 = data;
}
void transmitString(const char *str) {
while (*str) {
transmitByte(*str);
str++;
}
}
void transmitNumber(unsigned long num) {
char buffer[10]; // Tamanho máximo de um número de 32 bits é 10 dígitos
itoa(num, buffer, 10);
transmitString(buffer);
}
void buttonISRIncrease() {
ac_setpoint++; // Aumenta o setpoint quando o botão de aumento é pressionado
if (ac_setpoint > temperatura_ac_max){
ac_setpoint = temperatura_ac_max;
}
}
void buttonISRDecrease() {
ac_setpoint--; // Diminui o setpoint quando o botão de diminuição é pressionado
if (ac_setpoint < temperatura_ac_min){
ac_setpoint = temperatura_ac_min;
}
}
void buttonREC() {
circulacao = !circulacao; // Diminui o setpoint quando o botão de diminuição é pressionado
}
void loop() {
// Calcula RPM a cada segundo
unsigned long tempoatual = millis();
if (tempoatual - ultimoRPM >= 1000) {
//CALCULO DE RPM A CADA 1 SEGUNDO
rpm = (contarclicks * 60) / (16 * (tempoatual - ultimoRPM) / 1000); // RPM = (Clique * 60) / (Polegadas * Tempo em segundos)
// Envia os dados para a porta serial USART0 (Serial0)
transmitString("RPM: ");
transmitNumber(rpm);
transmitString("\n");
contarclicks = 0;
ultimoRPM = tempoatual;
//ACABA AS MEDIDAS DE RPM
//COMEÇA O CALCULO DE KM/H
velocidade = (rpm * diametro * 60 * PI) / (10^5);
transmitString("Velocidade (km/h): ");
transmitNumber(velocidade);
transmitString("\n");
//FIM DO CALCULO DE KM/H
//PRINTA A DISTANCIA PERCORRIDA QUE É CALCULADA DENTRO DA INTERRUPÇÃO
transmitString("Distancia Percorrida (m): ");
transmitNumber(distancia_percorrida);
transmitString("\n");
//FIM DO PRINT DA DISTANCIA PERCORRIDA
transmitString("Temperatura Externa: "); //A1
transmitNumber( 1 / (log(1 / (1023. / ler_sensor1() - 1)) / BETA + 1.0 / 298.15) - 273.15);
transmitString("\n");
transmitString("Temperatura Interna: "); //A2
transmitNumber(1 / (log(1 / (1023. / ler_sensor2() - 1)) / BETA + 1.0 / 298.15) - 273.15);
transmitString("\n");
transmitString("Temperatura na saída do AC: "); //A3
transmitNumber(1 / (log(1 / (1023. / ler_sensor3() - 1)) / BETA + 1.0 / 298.15) - 273.15);
transmitString("\n");
transmitString("Temperatura escolhida (AC): ");
transmitNumber(ac_setpoint);
transmitString("\n");
transmitString("\n");
if (ler_sensor4()>633){
farol = 1;
}
if(ler_sensor4()<600){
farol = 0;
}
if (farol == 1){
transmitString("Faról: Ligado ");
transmitString("\n");
}
else{
transmitString("Faról: Desligado ");
transmitString("\n");
}
if (circulacao == 0){
transmitString("Circulação de ar: INTERNA");
transmitString("\n");
}
if (circulacao == 1){
transmitString("Circulação de ar: EXTERNA");
transmitString("\n");
}
}
}