#include "U8glib.h"
#include <Wire.h>
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
#define SENSOR_PIN 2
#define PULSES_PER_LITER 98
#define BATTERY_PIN A0 // Pino analógico para medir a bateria
// Valores de calibração - AJUSTE ESTES VALORES!
#define ADC_MAX 860 // Valor para 4.2V (bateria cheia)
#define ADC_MIN 675 // Valor para 3.3V (bateria vazia)
volatile unsigned long pulseCount = 0;
float flowRate = 0;
unsigned long lastTime = 0;
int batteryLevel = 0;
float batteryVoltage = 0;
void pulseCounter() {
pulseCount++;
}
float readBatteryVoltage() {
int sensorValue = analogRead(BATTERY_PIN);
// Converte leitura ADC para tensão (considerando divisor 1:1)
float voltage = (sensorValue * 5.0) / 1023.0;
return voltage;
}
int readBatteryLevel() {
int sensorValue = analogRead(BATTERY_PIN);
// Converte leitura analógica para porcentagem
int level = map(sensorValue, ADC_MIN, ADC_MAX, 0, 100);
return constrain(level, 0, 100);
}
void drawBattery(int level) {
// Desenha o ícone da bateria no canto superior direito
u8g.drawFrame(100, 2, 24, 12); // Corpo principal
u8g.drawBox(124, 5, 2, 6); // Pino positivo
// Preenche o nível da bateria
int fillWidth = map(level, 0, 100, 0, 20);
u8g.drawBox(102, 4, fillWidth, 8);
// Desenha porcentagem pequena
char batStr[6];
sprintf(batStr, "%d%%", level);
u8g.setFont(u8g_font_5x8);
// Alerta visual se bateria baixa
if (level < 20) {
u8g.drawStr(80, 11, "LOW");
} else {
u8g.drawStr(85, 11, batStr);
}
}
void setup() {
Serial.begin(9600);
pinMode(SENSOR_PIN, INPUT_PULLUP);
pinMode(BATTERY_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), pulseCounter, FALLING);
// Tela de inicialização
u8g.firstPage();
do {
u8g.setFont(u8g_font_9x18Br);
u8g.drawStr(30, 20, "CIDEPE");
u8g.setFont(u8g_font_6x12);
u8g.drawStr(15, 40, "SENSOR DE VASAO");
u8g.drawStr(30, 55, "Inicializando...");
} while ( u8g.nextPage() );
delay(2000);
}
void loop() {
if(millis() - lastTime >= 1000) {
noInterrupts();
flowRate = (float)pulseCount / 98.0;
pulseCount = 0;
lastTime = millis();
interrupts();
// Atualiza nível da bateria
batteryLevel = readBatteryLevel();
batteryVoltage = readBatteryVoltage();
// Debug no Serial (opcional)
Serial.print("Bateria: ");
Serial.print(batteryLevel);
Serial.print("%, Voltage: ");
Serial.println(batteryVoltage);
updateDisplay();
}
}
void updateDisplay() {
char flowStr[10];
dtostrf(flowRate, 4, 1, flowStr);
u8g.firstPage();
do {
// Medidor de bateria
drawBattery(batteryLevel);
// Título
u8g.setFont(u8g_font_7x14Br);
u8g.drawStr(40, 12, "L/min");
// Linha divisória
u8g.drawHLine(0, 16, 128);
// Vazão
u8g.setFont(u8g_font_fur35n);
int strWidth = u8g.getStrWidth(flowStr);
int xPos = (128 - strWidth) / 2;
u8g.drawStr(xPos, 55, flowStr);
} while ( u8g.nextPage() );
}