weatherstation/firmware/sensor_battery.ino
Florian Eitel 01d6737d60
Use NaN to signal no sensor values
The InfluxDB client will filter NaNs
2019-08-04 13:21:16 +02:00

49 lines
1.6 KiB
C++

float _sensor_battery_saveMode = nan("no battery");
uint16_t energySavingIterations = 0;
// Copied from https://arduinodiy.wordpress.com/2016/12/25/monitoring-lipo-battery-voltage-with-wemos-d1-minibattery-shield-and-thingspeak/
float battery_voltage() {
// ESP8266 ADC pin input voltage range ist 0V .. 1V
// The Wemos D1 mini does already contain a voltage divider circuit: A0(Wemos PCB) -- [220kOhm] -- ADC (ESP8266)-- [100kOhm] -- GND
// The (+) pole of the battery is connected to the A0 pin of the Wemos board through a additional 100kOhm resistance.
// The battery voltage of 4.2V max is measured as 1.0V on ESP8266 ADC pin.
uint16_t raw = analogRead(A0);
float volt = raw / 1023.0;
return volt * 4.2;
}
float battery_charging() {
if (LOW == digitalRead(BAT_CHARGING_PIN)) {
return BAT_CHARGE_STATE_CHARGING;
} else if (LOW == digitalRead(BAT_CHARGED_PIN)) {
return BAT_CHARGE_STATE_CHARGED;
}
return BAT_CHARGE_STATE_NOTCHARGING;
}
int energySavingMode() {
// Give the solar panel some time to load the cell to prevent
// flapping.
if (energySavingIterations > 0) {
energySavingIterations--;
_sensor_battery_saveMode = ENERGY_SAVE_MODE_ENABLED;
return 1;
}
// Is the battery low?
if (currentSensorData[SENSOR_BAT_VOLTAGE] <= BAT_LOW_VOLTAGE) {
// Entering energy saving
energySavingIterations = ENERGY_SAVING_ITERATIONS;
_sensor_battery_saveMode = ENERGY_SAVE_MODE_ENABLED;
return 1;
}
_sensor_battery_saveMode = ENERGY_SAVE_MODE_DISABLED;
return 0;
}
float isEnergySavingMode() {
return _sensor_battery_saveMode;
}