diff --git a/arduino/main/main.ino b/arduino/main/main.ino index 2ea7c88..f994052 100644 --- a/arduino/main/main.ino +++ b/arduino/main/main.ino @@ -1,35 +1,19 @@ -// Vehicle Voltage Monitor -// Reads 12V-14.4V battery via voltage divider on A0 -// Outputs to Serial for PC monitoring +// Smart Serow - Main +// Motorcycle telemetry hub -// Pin definitions -const int PIN_VBAT = A0; // Vehicle voltage input (via divider) - -// Voltage divider constants -// Divider: 100k upper (to Vin), 47k lower (to GND) -// Vout = Vin * (47k / (100k + 47k)) = Vin * 0.3197 -// So Vin = Vout / 0.3197 -// At 12V: ADC sees 3.84V | At 14.4V: ADC sees 4.60V -const float DIVIDER_RATIO = 47.0 / (100.0 + 47.0); // ~0.3197 -const float ADC_REF = 5.0; -const int ADC_MAX = 1023; +#include "voltage.h" void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); + + voltage_init(); } void loop() { - // Read and calculate voltage - int rawAdc = analogRead(PIN_VBAT); - float vDivider = (rawAdc / (float)ADC_MAX) * ADC_REF; - float vBattery = vDivider / DIVIDER_RATIO; - - // Output to serial - Serial.print("ADC: "); - Serial.print(rawAdc); - Serial.print(" | V_bat: "); - Serial.print(vBattery, 2); + // Report battery voltage + Serial.print("V_bat: "); + Serial.print(voltage_read(), 2); Serial.println("V"); // Heartbeat blink diff --git a/arduino/main/voltage.cpp b/arduino/main/voltage.cpp new file mode 100644 index 0000000..8dbea2d --- /dev/null +++ b/arduino/main/voltage.cpp @@ -0,0 +1,27 @@ +#include "voltage.h" + +// Pin definitions +static const int PIN_VBAT = A0; + +// Voltage divider constants +// Divider: 100k upper (to Vin), 47k lower (to GND) +// Vout = Vin * (47k / (100k + 47k)) = Vin * 0.3197 +// At 12V: ADC sees 3.84V | At 14.4V: ADC sees 4.60V +static const float DIVIDER_RATIO = 47.0 / (100.0 + 47.0); // ~0.3197 +static const float ADC_REF = 5.0; +static const int ADC_MAX = 1023; + +void voltage_init() { + // analogRead doesn't need explicit pinMode, but here for future config + // e.g., could switch to internal 1.1V reference for different range +} + +int voltage_read_raw() { + return analogRead(PIN_VBAT); +} + +float voltage_read() { + int raw = voltage_read_raw(); + float vDivider = (raw / (float)ADC_MAX) * ADC_REF; + return vDivider / DIVIDER_RATIO; +} diff --git a/arduino/main/voltage.h b/arduino/main/voltage.h new file mode 100644 index 0000000..65c6d8a --- /dev/null +++ b/arduino/main/voltage.h @@ -0,0 +1,15 @@ +#ifndef VOLTAGE_H +#define VOLTAGE_H + +#include + +// Initialize voltage monitoring (call in setup) +void voltage_init(); + +// Read battery voltage, returns volts (e.g., 12.5) +float voltage_read(); + +// Read raw ADC value (0-1023) +int voltage_read_raw(); + +#endif