ESP32-PaxCounter/include/power.h

97 lines
2.9 KiB
C
Raw Normal View History

2019-09-07 19:52:25 +02:00
#ifndef _POWER_H
#define _POWER_H
#include <Arduino.h>
2019-09-07 23:10:53 +02:00
#include <driver/adc.h>
#include <esp_adc_cal.h>
2020-03-29 18:08:52 +02:00
2019-10-16 21:14:34 +02:00
#include "i2c.h"
2019-10-20 20:47:03 +02:00
#include "reset.h"
#include "lorawan.h"
2019-09-07 19:52:25 +02:00
2019-09-07 23:10:53 +02:00
#define DEFAULT_VREF 1100 // tbd: use adc2_vref_to_gpio() for better estimate
#define NO_OF_SAMPLES 64 // we do some multisampling to get better values
2020-04-10 23:26:29 +02:00
#ifndef BAT_MAX_VOLTAGE
2020-04-12 22:12:13 +02:00
#define BAT_MAX_VOLTAGE 4200 // millivolts
2020-04-11 21:30:09 +02:00
#endif
#ifndef BAT_MIN_VOLTAGE
#define BAT_MIN_VOLTAGE 3100 // millivolts
2020-04-10 23:26:29 +02:00
#endif
typedef uint8_t (*mapFn_t)(uint16_t, uint16_t, uint16_t);
uint16_t read_voltage(void);
void calibrate_voltage(void);
bool batt_sufficient(void);
2019-09-07 19:52:25 +02:00
#ifdef HAS_PMU
2019-09-07 19:52:25 +02:00
#include <axp20x.h>
enum pmu_power_t { pmu_power_on, pmu_power_off, pmu_power_sleep };
2019-10-16 21:14:34 +02:00
void AXP192_powerevent_IRQ(void);
void AXP192_power(pmu_power_t powerlevel);
2019-09-07 19:52:25 +02:00
void AXP192_init(void);
void AXP192_showstatus(void);
#endif // HAS_PMU
// The following map functions were taken from
/*
Battery.h - Battery library
Copyright (c) 2014 Roberto Lo Giacco.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Symmetric sigmoidal approximation
* https://www.desmos.com/calculator/7m9lu26vpy
*
* c - c / (1 + k*x/v)^3
*/
static inline uint8_t sigmoidal(uint16_t voltage, uint16_t minVoltage, uint16_t maxVoltage) {
// slow
// uint8_t result = 110 - (110 / (1 + pow(1.468 * (voltage - minVoltage)/(maxVoltage - minVoltage), 6)));
// steep
// uint8_t result = 102 - (102 / (1 + pow(1.621 * (voltage - minVoltage)/(maxVoltage - minVoltage), 8.1)));
// normal
uint8_t result = 105 - (105 / (1 + pow(1.724 * (voltage - minVoltage)/(maxVoltage - minVoltage), 5.5)));
return result >= 100 ? 100 : result;
}
/**
* Asymmetric sigmoidal approximation
* https://www.desmos.com/calculator/oyhpsu8jnw
*
* c - c / [1 + (k*x/v)^4.5]^3
*/
static inline uint8_t asigmoidal(uint16_t voltage, uint16_t minVoltage, uint16_t maxVoltage) {
uint8_t result = 101 - (101 / pow(1 + pow(1.33 * (voltage - minVoltage)/(maxVoltage - minVoltage) ,4.5), 3));
return result >= 100 ? 100 : result;
}
/**
* Linear mapping
* https://www.desmos.com/calculator/sowyhttjta
*
* x * 100 / v
*/
static inline uint8_t linear(uint16_t voltage, uint16_t minVoltage, uint16_t maxVoltage) {
return (unsigned long)(voltage - minVoltage) * 100 / (maxVoltage - minVoltage);
}
uint8_t read_battlevel(mapFn_t mapFunction = &sigmoidal);
2019-09-07 19:52:25 +02:00
#endif