mirror of
https://github.com/wled/WLED.git
synced 2025-07-20 01:06:32 +00:00
Fix previous bug again 🐛, Add Type Dropdown to config page
This commit is contained in:
parent
85d59945a0
commit
3759071449
@ -12,12 +12,12 @@ class Battery
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
float minVoltage = USERMOD_BATTERY_MIN_VOLTAGE;
|
float minVoltage;
|
||||||
float maxVoltage = USERMOD_BATTERY_MAX_VOLTAGE;
|
float maxVoltage;
|
||||||
unsigned int capacity = USERMOD_BATTERY_TOTAL_CAPACITY; // current capacity
|
unsigned int capacity;
|
||||||
float voltage = this->maxVoltage; // current voltage
|
float voltage;
|
||||||
int8_t level = 100; // current level
|
int8_t level = 100;
|
||||||
float calibration = USERMOD_BATTERY_CALIBRATION; // offset or calibration value to fine tune the calculated voltage
|
float calibration; // offset or calibration value to fine tune the calculated voltage
|
||||||
|
|
||||||
float linearMapping(float v, float min, float max, float oMin = 0.0f, float oMax = 100.0f)
|
float linearMapping(float v, float min, float max, float oMin = 0.0f, float oMax = 100.0f)
|
||||||
{
|
{
|
||||||
@ -30,6 +30,15 @@ class Battery
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void update(batteryConfig cfg)
|
||||||
|
{
|
||||||
|
if(cfg.minVoltage) this->setMinVoltage(cfg.minVoltage);
|
||||||
|
if(cfg.maxVoltage) this->setMaxVoltage(cfg.maxVoltage);
|
||||||
|
if(cfg.calibration) this->setCapacity(cfg.calibration);
|
||||||
|
if(cfg.level) this->setLevel(cfg.level);
|
||||||
|
if(cfg.calibration) this->setCalibration(cfg.calibration);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Corresponding battery curves
|
* Corresponding battery curves
|
||||||
* calculates the capacity in % (0-100) with given voltage and possible voltage range
|
* calculates the capacity in % (0-100) with given voltage and possible voltage range
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
#ifndef UMBDefaults_h
|
||||||
|
#define UMBDefaults_h
|
||||||
|
|
||||||
// pin defaults
|
// pin defaults
|
||||||
// for the esp32 it is best to use the ADC1: GPIO32 - GPIO39
|
// for the esp32 it is best to use the ADC1: GPIO32 - GPIO39
|
||||||
// https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/adc.html
|
// https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/adc.html
|
||||||
@ -16,38 +19,70 @@
|
|||||||
|
|
||||||
|
|
||||||
/* Default Battery Type
|
/* Default Battery Type
|
||||||
|
* 0 = unkown
|
||||||
* 1 = Lipo
|
* 1 = Lipo
|
||||||
* 2 = Lion
|
* 2 = Lion
|
||||||
*/
|
*/
|
||||||
#ifndef USERMOB_BATTERY_DEFAULT_TYPE
|
#ifndef USERMOD_BATTERY_DEFAULT_TYPE
|
||||||
#define USERMOB_BATTERY_DEFAULT_TYPE 1
|
#define USERMOD_BATTERY_DEFAULT_TYPE 0
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Unkown 'Battery' defaults
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef USERMOD_BATTERY_UNKOWN_MIN_VOLTAGE
|
||||||
|
#define USERMOD_BATTERY_UNKOWN_MIN_VOLTAGE 3.3f
|
||||||
|
#endif
|
||||||
|
#ifndef USERMOD_BATTERY_UNKOWN_MAX_VOLTAGE
|
||||||
|
#define USERMOD_BATTERY_UNKOWN_MAX_VOLTAGE 4.2f
|
||||||
|
#endif
|
||||||
|
#ifndef USERMOD_BATTERY_UNKOWN_CAPACITY
|
||||||
|
#define USERMOD_BATTERY_UNKOWN_CAPACITY 2500
|
||||||
|
#endif
|
||||||
|
#ifndef USERMOD_BATTERY_UNKOWN_CALIBRATION
|
||||||
|
// offset or calibration value to fine tune the calculated voltage
|
||||||
|
#define USERMOD_BATTERY_UNKOWN_CALIBRATION 0
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Lithium polymer (Li-Po) defaults
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef USERMOD_BATTERY_LIPO_MIN_VOLTAGE
|
||||||
|
// LiPo "1S" Batteries should not be dischared below 3V !!
|
||||||
|
#define USERMOD_BATTERY_LIPO_MIN_VOLTAGE 3.2f
|
||||||
|
#endif
|
||||||
|
#ifndef USERMOD_BATTERY_LIPO_MAX_VOLTAGE
|
||||||
|
#define USERMOD_BATTERY_LIPO_MAX_VOLTAGE 4.2f
|
||||||
|
#endif
|
||||||
|
#ifndef USERMOD_BATTERY_LIPO_CAPACITY
|
||||||
|
#define USERMOD_BATTERY_LIPO_CAPACITY 5000
|
||||||
|
#endif
|
||||||
|
#ifndef USERMOD_BATTERY_LIPO_CALIBRATION
|
||||||
|
#define USERMOD_BATTERY_LIPO_CALIBRATION 0
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Lithium-ion (Li-Ion) defaults
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef USERMOD_BATTERY_LION_MIN_VOLTAGE
|
||||||
|
// default for 18650 battery
|
||||||
|
#define USERMOD_BATTERY_LION_MIN_VOLTAGE 2.6f
|
||||||
|
#endif
|
||||||
|
#ifndef USERMOD_BATTERY_LION_MAX_VOLTAGE
|
||||||
|
#define USERMOD_BATTERY_LION_MAX_VOLTAGE 4.2f
|
||||||
|
#endif
|
||||||
|
#ifndef USERMOD_BATTERY_LION_CAPACITY
|
||||||
|
// a common capacity for single 18650 battery cells is between 2500 and 3600 mAh
|
||||||
|
#define USERMOD_BATTERY_LION_CAPACITY 3100
|
||||||
|
#endif
|
||||||
|
#ifndef USERMOD_BATTERY_LION_CALIBRATION
|
||||||
|
// offset or calibration value to fine tune the calculated voltage
|
||||||
|
#define USERMOD_BATTERY_LION_CALIBRATION 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// default for 18650 battery
|
|
||||||
// https://batterybro.com/blogs/18650-wholesale-battery-reviews/18852515-when-to-recycle-18650-batteries-and-how-to-start-a-collection-center-in-your-vape-shop
|
|
||||||
// Discharge voltage: 2.5 volt + .1 for personal safety
|
|
||||||
#ifndef USERMOD_BATTERY_MIN_VOLTAGE
|
|
||||||
#if USERMOB_BATTERY_DEFAULT_TYPE == 1
|
|
||||||
// LiPo "1S" Batteries should not be dischared below 3V !!
|
|
||||||
#define USERMOD_BATTERY_MIN_VOLTAGE 3.2f
|
|
||||||
#else
|
|
||||||
#define USERMOD_BATTERY_MIN_VOLTAGE 2.6f
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef USERMOD_BATTERY_MAX_VOLTAGE
|
|
||||||
#define USERMOD_BATTERY_MAX_VOLTAGE 4.2f
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// a common capacity for single 18650 battery cells is between 2500 and 3600 mAh
|
|
||||||
#ifndef USERMOD_BATTERY_TOTAL_CAPACITY
|
|
||||||
#define USERMOD_BATTERY_TOTAL_CAPACITY 3100
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// offset or calibration value to fine tune the calculated voltage
|
|
||||||
#ifndef USERMOD_BATTERY_CALIBRATION
|
|
||||||
#define USERMOD_BATTERY_CALIBRATION 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// auto-off feature
|
// auto-off feature
|
||||||
#ifndef USERMOD_BATTERY_AUTO_OFF_ENABLED
|
#ifndef USERMOD_BATTERY_AUTO_OFF_ENABLED
|
||||||
@ -74,3 +109,25 @@
|
|||||||
#ifndef USERMOD_BATTERY_LOW_POWER_INDICATOR_DURATION
|
#ifndef USERMOD_BATTERY_LOW_POWER_INDICATOR_DURATION
|
||||||
#define USERMOD_BATTERY_LOW_POWER_INDICATOR_DURATION 5
|
#define USERMOD_BATTERY_LOW_POWER_INDICATOR_DURATION 5
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
unknown=0,
|
||||||
|
lipo=1,
|
||||||
|
lion=2
|
||||||
|
} batteryType;
|
||||||
|
|
||||||
|
// used for initial configuration after boot
|
||||||
|
typedef struct bconfig_t
|
||||||
|
{
|
||||||
|
batteryType type;
|
||||||
|
float minVoltage;
|
||||||
|
float maxVoltage;
|
||||||
|
unsigned int capacity; // current capacity
|
||||||
|
float voltage; // current voltage
|
||||||
|
int8_t level; // current level
|
||||||
|
float calibration; // offset or calibration value to fine tune the calculated voltage
|
||||||
|
} batteryConfig;
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -13,9 +13,13 @@ class Lion : public Battery
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Lion() : Battery()
|
Lion()
|
||||||
{
|
{
|
||||||
|
this->setMinVoltage(USERMOD_BATTERY_LION_MIN_VOLTAGE);
|
||||||
|
this->setMaxVoltage(USERMOD_BATTERY_LION_MAX_VOLTAGE);
|
||||||
|
this->setCapacity(USERMOD_BATTERY_LION_CAPACITY);
|
||||||
|
this->setVoltage(this->getVoltage());
|
||||||
|
this->setCalibration(USERMOD_BATTERY_LION_CALIBRATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
float mapVoltage(float v, float min, float max) override
|
float mapVoltage(float v, float min, float max) override
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include "battery.h"
|
#include "battery.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lipo Battery
|
* Lipo Battery
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class Lipo : public Battery
|
class Lipo : public Battery
|
||||||
@ -13,9 +13,13 @@ class Lipo : public Battery
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Lipo() : Battery()
|
Lipo()
|
||||||
{
|
{
|
||||||
|
this->setMinVoltage(USERMOD_BATTERY_LIPO_MIN_VOLTAGE);
|
||||||
|
this->setMaxVoltage(USERMOD_BATTERY_LIPO_MAX_VOLTAGE);
|
||||||
|
this->setCapacity(USERMOD_BATTERY_LIPO_CAPACITY);
|
||||||
|
this->setVoltage(this->getVoltage());
|
||||||
|
this->setCalibration(USERMOD_BATTERY_LIPO_CALIBRATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
36
usermods/Battery/unkown.h
Normal file
36
usermods/Battery/unkown.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#ifndef UMBUnkown_h
|
||||||
|
#define UMBUnkown_h
|
||||||
|
|
||||||
|
#include "battery_defaults.h"
|
||||||
|
#include "battery.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lion Battery
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class Unkown : public Battery
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
public:
|
||||||
|
Unkown()
|
||||||
|
{
|
||||||
|
this->setMinVoltage(USERMOD_BATTERY_UNKOWN_MIN_VOLTAGE);
|
||||||
|
this->setMaxVoltage(USERMOD_BATTERY_UNKOWN_MAX_VOLTAGE);
|
||||||
|
this->setCapacity(USERMOD_BATTERY_UNKOWN_CAPACITY);
|
||||||
|
this->setVoltage(this->getVoltage());
|
||||||
|
this->setCalibration(USERMOD_BATTERY_UNKOWN_CALIBRATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
float mapVoltage(float v, float min, float max) override
|
||||||
|
{
|
||||||
|
return this->linearMapping(v, min, max); // basic mapping
|
||||||
|
};
|
||||||
|
|
||||||
|
void calculateAndSetLevel(float voltage) override
|
||||||
|
{
|
||||||
|
this->setLevel(this->mapVoltage(voltage, this->getMinVoltage(), this->getMaxVoltage()));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -3,6 +3,7 @@
|
|||||||
#include "wled.h"
|
#include "wled.h"
|
||||||
#include "battery_defaults.h"
|
#include "battery_defaults.h"
|
||||||
#include "battery.h"
|
#include "battery.h"
|
||||||
|
#include "unkown.h"
|
||||||
#include "lion.h"
|
#include "lion.h"
|
||||||
#include "lipo.h"
|
#include "lipo.h"
|
||||||
|
|
||||||
@ -19,15 +20,8 @@ class UsermodBattery : public Usermod
|
|||||||
// battery pin can be defined in my_config.h
|
// battery pin can be defined in my_config.h
|
||||||
int8_t batteryPin = USERMOD_BATTERY_MEASUREMENT_PIN;
|
int8_t batteryPin = USERMOD_BATTERY_MEASUREMENT_PIN;
|
||||||
|
|
||||||
int8_t batteryType = USERMOB_BATTERY_DEFAULT_TYPE;
|
|
||||||
|
|
||||||
float minVoltage = USERMOD_BATTERY_MIN_VOLTAGE;
|
|
||||||
float maxVoltage = USERMOD_BATTERY_MAX_VOLTAGE;
|
|
||||||
unsigned int capacity = USERMOD_BATTERY_TOTAL_CAPACITY; // current capacity
|
|
||||||
float voltage = this->maxVoltage; // current voltage
|
|
||||||
int8_t level = 100; // current level
|
|
||||||
float calibration = USERMOD_BATTERY_CALIBRATION; // offset or calibration value to fine tune the calculated voltage
|
|
||||||
Battery* bat = nullptr;
|
Battery* bat = nullptr;
|
||||||
|
batteryConfig bcfg;
|
||||||
|
|
||||||
// how often to read the battery voltage
|
// how often to read the battery voltage
|
||||||
unsigned long readingInterval = USERMOD_BATTERY_MEASUREMENT_INTERVAL;
|
unsigned long readingInterval = USERMOD_BATTERY_MEASUREMENT_INTERVAL;
|
||||||
@ -127,16 +121,17 @@ class UsermodBattery : public Usermod
|
|||||||
pinMode(batteryPin, INPUT);
|
pinMode(batteryPin, INPUT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//this could also be handled with a factory class but for only 2 types it should be sufficient for now
|
//this could also be handled with a factory class but for only 2 types it should be sufficient for now
|
||||||
if(batteryType == 1) {
|
if(bcfg.type == (batteryType)lipo) {
|
||||||
bat = new Lipo();
|
bat = new Lipo();
|
||||||
} else
|
} else
|
||||||
if(batteryType == 2) {
|
if(bcfg.type == (batteryType)lion) {
|
||||||
bat = new Lion();
|
bat = new Lion();
|
||||||
} else {
|
} else {
|
||||||
bat = new Lipo(); // in the future one could create a nullObject
|
bat = new Unkown(); // nullObject
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bat->update(bcfg);
|
||||||
nextReadTime = millis() + readingInterval;
|
nextReadTime = millis() + readingInterval;
|
||||||
lastReadTime = millis();
|
lastReadTime = millis();
|
||||||
|
|
||||||
@ -321,12 +316,11 @@ class UsermodBattery : public Usermod
|
|||||||
battery[F("pin")] = batteryPin;
|
battery[F("pin")] = batteryPin;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(bat) {
|
battery[F("type")] = (String)bcfg.type;
|
||||||
battery[F("min-voltage")] = bat->getMinVoltage();
|
battery[F("min-voltage")] = bat->getMinVoltage();
|
||||||
battery[F("max-voltage")] = bat->getMaxVoltage();
|
battery[F("max-voltage")] = bat->getMaxVoltage();
|
||||||
battery[F("capacity")] = bat->getCapacity();
|
battery[F("capacity")] = bat->getCapacity();
|
||||||
battery[F("calibration")] = bat->getCalibration();
|
battery[F("calibration")] = bat->getCalibration();
|
||||||
}
|
|
||||||
battery[FPSTR(_readInterval)] = readingInterval;
|
battery[FPSTR(_readInterval)] = readingInterval;
|
||||||
|
|
||||||
JsonObject ao = battery.createNestedObject(F("auto-off")); // auto off section
|
JsonObject ao = battery.createNestedObject(F("auto-off")); // auto off section
|
||||||
@ -344,6 +338,11 @@ class UsermodBattery : public Usermod
|
|||||||
|
|
||||||
void appendConfigData()
|
void appendConfigData()
|
||||||
{
|
{
|
||||||
|
oappend(SET_F("td=addDropdown('Battery', 'type');"));
|
||||||
|
oappend(SET_F("addOption(td, 'Unkown', '0');"));
|
||||||
|
oappend(SET_F("addOption(td, 'LiPo', '1');"));
|
||||||
|
oappend(SET_F("addOption(td, 'LiOn', '2');"));
|
||||||
|
oappend(SET_F("addInfo('Battery:type',1,'<small style=\"color:orange\">requires reboot</small>');"));
|
||||||
oappend(SET_F("addInfo('Battery:min-voltage', 1, 'v');"));
|
oappend(SET_F("addInfo('Battery:min-voltage', 1, 'v');"));
|
||||||
oappend(SET_F("addInfo('Battery:max-voltage', 1, 'v');"));
|
oappend(SET_F("addInfo('Battery:max-voltage', 1, 'v');"));
|
||||||
oappend(SET_F("addInfo('Battery:capacity', 1, 'mAh');"));
|
oappend(SET_F("addInfo('Battery:capacity', 1, 'mAh');"));
|
||||||
@ -399,16 +398,15 @@ class UsermodBattery : public Usermod
|
|||||||
newBatteryPin = battery[F("pin")] | newBatteryPin;
|
newBatteryPin = battery[F("pin")] | newBatteryPin;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(bat) {
|
getJsonValue(battery[F("type")], bcfg.type);
|
||||||
bat->setMinVoltage(battery[F("min-voltage")] | bat->getMinVoltage());
|
getJsonValue(battery[F("min-voltage")], bcfg.minVoltage);
|
||||||
bat->setMaxVoltage(battery[F("max-voltage")] | bat->getMaxVoltage());
|
getJsonValue(battery[F("max-voltage")], bcfg.maxVoltage);
|
||||||
bat->setCapacity(battery[F("capacity")] | bat->getCapacity());
|
getJsonValue(battery[F("capacity")], bcfg.capacity);
|
||||||
bat->setCalibration(battery[F("calibration")] | bat->getCalibration());
|
getJsonValue(battery[F("calibration")], bcfg.calibration);
|
||||||
}
|
|
||||||
setReadingInterval(battery[FPSTR(_readInterval)] | readingInterval);
|
setReadingInterval(battery[FPSTR(_readInterval)] | readingInterval);
|
||||||
|
|
||||||
// JsonArray type = battery[F("Type")];
|
// JsonArray type = battery[F("Type")];
|
||||||
// batteryType = type["bt"] | batteryType;
|
// batteryType = type["bt"] | btype;
|
||||||
|
|
||||||
JsonObject ao = battery[F("auto-off")];
|
JsonObject ao = battery[F("auto-off")];
|
||||||
setAutoOffEnabled(ao[FPSTR(_enabled)] | autoOffEnabled);
|
setAutoOffEnabled(ao[FPSTR(_enabled)] | autoOffEnabled);
|
||||||
@ -446,7 +444,7 @@ class UsermodBattery : public Usermod
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return !battery[FPSTR(_readInterval)].isNull();
|
return !battery[F("min-voltage")].isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user