//esquema com monitoramento da bateria
/*
Esquema do Divisor de Tensão da Bateria
Utilize um resistor de 10 kΩ e um de 4,7 kΩ montados da seguinte forma:
Conecte uma ponta do resistor de 10 kΩ ao positivo (+12V) da bateria (ou pós-chave).
Conecte a outra ponta do resistor de 10 kΩ a uma ponta do resistor de 4,7 kΩ.
Conecte a ponta restante do resistor de 4,7 kΩ ao GND do Arduino.
O ponto de encontro (junção) entre os dois resistores deve ser ligado ao pino analógico A1 do Arduino.
*/
/*
esquema para o platinado
(O circuito do platinado com o optoacoplador continua exatamente igual,
ligado ao Pino Digital 2)
*/
/*
display lcd 20x4 i2c
GND -> GND do Arduino
VCC -> 5V do Arduino
SDA -> Pino A4 (no Uno/Nano) ou pino específico SDA (no Mega)
SCL -> Pino A5 (no Uno/Nano) ou pino específico SCL (no Mega)
*/
/*
esquema do sensor de temperatura
Esquema do Divisor de Tensão (Sensor NTC)Monte o circuito físico da seguinte forma para enviar o sinal ao Arduino:
Conecte uma extremidade do sensor NTC ao GND do Arduino.
Conecte a outra extremidade do NTC ao pino analógico A0 do Arduino e também a uma das pontas de um resistor fixo de 10 kΩ.
Conecte a outra ponta do resistor fixo de 10 kΩ ao pino 5V do Arduino.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <math.h>
// =========================================================================
// CONFIGURAÇÕES DO PROJETO - AJUSTE AQUI OS SEUS DADOS
// =========================================================================
const int NUMERO_CILINDROS = 4; // Opções: 1, 2, 4, 6 ou 8 cilindros
// Configurações do sensor NTC 10k
const float TERMISTOR_NOMINAL = 10000.0;
const float TEMP_NOMINAL = 25.0;
const float FATOR_BETA = 3950.0;
const float RESISTOR_DIVISOR_NTC = 10000.0;
// Configurações do Divisor de Tensão da Bateria
const float R1 = 10000.0; // Resistor de 10k ohms (ligado ao +12V)
const float R2 = 4700.0; // Resistor de 4.7k ohms (ligado ao GND)
// =========================================================================
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Pinos de entrada
const byte pinoInterrupcao = 2; // Platinado (Digital 2)
const byte pinoNTC = A0; // Temperatura (Analógico A0)
const byte pinoBateria = A1; // Voltagem (Analógico A1)
// Variáveis do RPM
volatile unsigned int contadorPulsos = 0;
volatile unsigned long ultimoTempoPulso = 0;
unsigned long tempoAnterior = 0;
float rpm = 0;
float pulsosPorVolta = 0;
// Variáveis de Cálculo
unsigned long tempoAtual;
int rpmExibir, leituraBateria, leituraNTC;
float tensaoPortaV, tensaoBateria, resistenciaNTC, temperaturaCelsius;
unsigned int copiaPulsos;
volatile unsigned long tempoAgora;
void setup()
{
pinMode(pinoInterrupcao, INPUT);
pulsosPorVolta = (float)NUMERO_CILINDROS / 2.0;
lcd.init();
lcd.backlight();
// Tela de Inicialização
lcd.setCursor(0, 0);
lcd.print(" MULTIMETER PANEL ");
lcd.setCursor(0, 2);
lcd.print("Config: ");
lcd.print(NUMERO_CILINDROS);
lcd.print(" Cylinders");
lcd.setCursor(0, 3);
lcd.print("Calib. System");
for (int i=14;i<20;i++)
{ lcd.setCursor(i, 3);
lcd.print(".");
delay(500);
}
lcd.clear();
// Desenha o layout fixo nas 4 linhas do display
lcd.setCursor(0, 0);
lcd.print("ROTACAO: RPM");
lcd.setCursor(0, 1);
lcd.print("TENSAO : V");
lcd.setCursor(0, 2);
lcd.print("TEMP. : oC");
lcd.setCursor(0, 3);
lcd.print("STATUS : OK");
attachInterrupt(digitalPinToInterrupt(pinoInterrupcao), contarPulsoComFiltro, FALLING);
}
void loop()
{ tempoAtual = millis();
// Atualiza tudo a cada 500ms
if (tempoAtual - tempoAnterior >= 500)
{ calculaRPM();
calculaBateria();
calculaTemp();
mostraRPM();
mostraBateria();
mostraTemp();
tempoAnterior = tempoAtual;
}
}
void contarPulsoComFiltro()
{ tempoAgora = micros();
if (tempoAgora - ultimoTempoPulso > 3000)
{ contadorPulsos++;
ultimoTempoPulso = tempoAgora;
}
}
void calculaRPM()
{// --- 1. CÁLCULO DO RPM ---
noInterrupts();
copiaPulsos = contadorPulsos;
contadorPulsos = 0;
interrupts();
if (copiaPulsos == 0)
{ rpm = 0;}
else
{ rpm = (copiaPulsos * 120.0) / pulsosPorVolta;}
rpmExibir = (int)rpm;
}
void calculaBateria()
{ // --- 2. CÁLCULO DA TENSÃO DA BATERIA ---
leituraBateria = analogRead(pinoBateria);
tensaoPortaV = (leituraBateria * 5.0) / 1023.0;
tensaoBateria = tensaoPortaV / 0.32; // 0.32 equivale a (R2 / (R1 + R2));
}
void calculaTemp()
{// --- 3. CÁLCULO DA TEMPERATURA (NTC) ---
leituraNTC = analogRead(pinoNTC);
resistenciaNTC = RESISTOR_DIVISOR_NTC / ((1023.0 / leituraNTC) - 1.0);
temperaturaCelsius = resistenciaNTC / TERMISTOR_NOMINAL;
temperaturaCelsius = log(temperaturaCelsius);
temperaturaCelsius /= FATOR_BETA;
temperaturaCelsius += 1.0 / (TEMP_NOMINAL + 273.15);
temperaturaCelsius = 1.0 / temperaturaCelsius;
temperaturaCelsius -= 273.15;
}
void mostraRPM()
{
// Linha 0: RPM
lcd.setCursor(9, 0);
if (rpmExibir < 10)
{ lcd.print(" ");}
else if (rpmExibir < 100)
{ lcd.print(" ");}
else if (rpmExibir < 1000)
{ lcd.print(" ");}
else if (rpmExibir < 10000)
{ lcd.print(" ");}
lcd.print(rpmExibir);
}
void mostraBateria()
{
// Linha 1: Tensão da Bateria
lcd.setCursor(9, 1);
if (tensaoBateria < 10.0)
{ lcd.print(" ");}
lcd.print(tensaoBateria, 2);
}
void mostraTemp()
{
// Linha 2: Temperatura
lcd.setCursor(9, 2);
if (temperaturaCelsius < 0 || temperaturaCelsius >= 100)
{ lcd.setCursor(11, 2); }
else if (temperaturaCelsius < 10)
{ lcd.print(" ");}
else
{ lcd.print(" ");}
lcd.print(temperaturaCelsius, 1);
}