#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ==== CONFIGURAÇÕES =====
const byte PINO_SENSOR = A0;
// Tensão de referência do ADC (use 5.00 se alimentado por USB/5V estáveis;
// meça com multímetro e ajuste para melhor precisão, ex.: 4.98)
const float VREF = 5.00;
// Faixa elétrica do sensor (1 a 5 V) que corresponde à faixa de pressão
const float SENSOR_V_MIN = 1.00; // V -> 0 psi
const float SENSOR_V_MAX = 5.00; // V -> 150 psi
// Faixa física
const float PSI_MIN = 0.0;
const float PSI_MAX = 150.0;
// Suavização (média das últimas N leituras)
const uint8_t N_SAMPLES = 20;
// Atualização da tela
const unsigned long UPDATE_MS = 200;
// Offset e ganho para calibração fina (ajuste após comparar com padrão)
float CAL_OFFSET_PSI = 0.0; // deslocamento em psi
float CAL_GAIN = 1.0; // ganho (1.0 = sem ajuste)
// ========================
LiquidCrystal_I2C lcd(0x27, 16, 2);
unsigned long lastUpdate = 0;
float lerVoltsSuavizado() {
// média simples de N_SAMPLES conversões
long soma = 0;
for (uint8_t i = 0; i < N_SAMPLES; i++) {
soma += analogRead(PINO_SENSOR);
delay(2); // pequeno intervalo para estabilidade
}
float mediaADC = soma / (float)N_SAMPLES;
float volts = mediaADC * (VREF / 1023.0);
return volts;
}
float mapearVoltsParaPsi(float volts) {
// Limita aos extremos elétricos
if (volts < SENSOR_V_MIN) volts = SENSOR_V_MIN;
if (volts > SENSOR_V_MAX) volts = SENSOR_V_MAX;
// Mapeamento linear:
// 1,00 V -> 0 psi
// 5,00 V -> 150 psi
float spanV = (SENSOR_V_MAX - SENSOR_V_MIN); // 4 V
float spanPSI = (PSI_MAX - PSI_MIN); // 150 psi
float psi = ((volts - SENSOR_V_MIN) * (spanPSI / spanV)) + PSI_MIN;
// Calibração fina
psi = (psi * CAL_GAIN) + CAL_OFFSET_PSI;
// Garante dentro da faixa
if (psi < PSI_MIN) psi = PSI_MIN;
if (psi > PSI_MAX) psi = PSI_MAX;
return psi;
}
void setup() {
// LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pressao (psi)");
lcd.setCursor(0, 1);
lcd.print("Iniciando...");
// Serial para debug/calibracao
Serial.begin(9600);
delay(500);
}
void loop() {
float volts = lerVoltsSuavizado();
float psi = mapearVoltsParaPsi(volts);
unsigned long now = millis();
if (now - lastUpdate >= UPDATE_MS) {
lastUpdate = now;
// Atualiza LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PSI: ");
lcd.print(psi, 1); // uma casa decimal
lcd.setCursor(0, 1);
lcd.print("V: ");
lcd.print(volts, 3); // tres casas para ver detalhe
}
// Envia no Serial para acompanhamento
Serial.print("Volts=");
Serial.print(volts, 4);
Serial.print(" PSI=");
Serial.println(psi, 2);
}