Я знаю, что разряд батареи на литий-ионном аккумуляторе 4,15 В не является линейным, поэтому я хотел бы иметь какое-то уравнение, которое я могу применить в своем коде, чтобы показать правильный процент заряда батареи.
Я не могу найти хороших ресурсов для этого в Arduino IDE. (Помогите со ссылкой, если у вас есть)





Я работаю с этой таблицей:
4.2 volts 100%
4.1 about 90%
4.0 about 80%
3.9 about 60%
3.8 about 40%
3.7 about 20%
3.6 empty for practical purposes.
Это означает, что если бы эта ячейка упала до 60% емкости, напряжение упало бы ниже 3,9 вольт.
Таблица взята с немецкого сайта, поэтому я думаю, что ссылка не поможет.
Редактировать: Я нашел эту английскую ссылку: Заряд батареи
На самом деле, вы ничего не можете сделать с нелинейным поведением, вам просто нужно измерить максимальное и минимальное напряжения и рассчитать процент заряда батареи на основе этого. Ниже я создал функцию, которая возвращает процент заряда батареи. Не забудьте отредактировать battery_max и battery_min в зависимости от уровня напряжения батареи.
Кроме того, я рекомендую вам создать схему резисторного делителя, чтобы снизить уровень напряжения, потому что, если ваш входной источник питания падает, Arduino будет питаться напрямую от аналогового входа, что нежелательно.
int battery_pin = A3;
float battery_read()
{
//read battery voltage per %
long sum = 0; // sum of samples taken
float voltage = 0.0; // calculated voltage
float output = 0.0; //output value
const float battery_max = 4.20; //maximum voltage of battery
const float battery_min = 3.0; //minimum voltage of battery before shutdown
for (int i = 0; i < 500; i++)
{
sum += analogRead(battery_pin);
delayMicroseconds(1000);
}
// calculate the voltage
voltage = sum / (float)500;
// voltage = (voltage * 5.0) / 1023.0; //for default reference voltage
voltage = (voltage * 1.1) / 1023.0; //for internal 1.1v reference
//round value by two precision
voltage = roundf(voltage * 100) / 100;
Serial.print("voltage: ");
Serial.println(voltage, 2);
output = ((voltage - battery_min) / (battery_max - battery_min)) * 100;
if (output < 100)
return output;
else
return 100.0f;
}
void setup()
{
analogReference(INTERNAL); //set reference voltage to internal
Serial.begin(9600);
}
void loop()
{
Serial.print("Battery Level: ");
Serial.println(battery_read(), 2);
delay(1000);
}