Как считывать заряд акб на ESP32
- Войдите на сайт для отправки комментариев
Втр, 23/11/2021 - 16:46
У меня ESP wroom 32 dev kit1 ( http://developer.alexanderklimov.ru/arduino/esp32/ )
К пину 36 (VP) подключил 1н 18650 4,22В через делитель напряжения.
Показывает чушь: заряд 100% и заряд акб 1,1В.
Ок, поставил акб с зарядом 3,45В, все равно, показывает то же самое, как только не менял знячения, ничего не помогает. Пины тоже пробовал разные 33-36.
#include <driver/adc.h>
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.22; //maximum voltage of battery
const float battery_min = 3.0; //minimum voltage of battery before shutdown
float R1 = 50190.0; // resistance of R1 (100K)
float R2 = 16730.0; // resistance of R2 (10K)
for (int i = 0; i < 500; i++)
{
sum += adc1_get_voltage(ADC1_CHANNEL_0);
delayMicroseconds(1000);
}
// calculate the voltage
voltage = sum / (float)500;
voltage = (voltage * 1.1) / 4096.0; //for internal 1.1v reference
// use if added divider circuit
voltage = voltage / (R2/(R1+R2));
//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()
{
adc1_config_width(ADC_WIDTH_12Bit);
adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_0db); //set reference voltage to internal
Serial.begin(9600);
}
void loop()
{
Serial.print("Battery Level: ");
Serial.println(battery_read(), 2);
delay(1000);
}
Поправка: показывает 4.2 В при любом значении раряда акб на входе
а с чего ты решил, что это 33-36 пины?
А почему заряд вольтами то меряется? :-)
это не та схема
а с чего ты решил, что это 33-36 пины?
мой косяк) напряжение.
А почему заряд вольтами то меряется? :-)
а с чего ты решил, что это 33-36 пины?
Ну во первых - adc1_get_voltage is deprecated, use adc1_get_raw
Правда это скорее придирка, думаю, что вы подключаете не к той ноге. Покажите на рисунке , где ваша 36 нога ?
левый верхний 2, под перезагрузкой
Ну во первых - adc1_get_voltage is deprecated, use adc1_get_raw
Правда это скорее придирка, думаю, что вы подключаете не к той ноге. Покажите на рисунке , где ваша 36 нога ?
adc1_get_raw тоже пробовал
Да нет, на словах все правильно. Тестером можете измерить ? В общем тут в форуме мы ошибку не найдем. Ваши слова не соответствуют действительности, просто вы где то ошибаетесь. Но все же adc1_get_voltage поменяйте на adc1_get_raw , хрен его знает что у вас там за библиотека. Вы же варнинги при компиляции не читаете.
Это весь ваш код, или кусок. Может вы где то в не показном нам месте что то накосячили, ногу например отключили.
А вы правда батарейку 8.5 минут измеряете ? ;)
Код только этот, пока. при компиляции ошибок нет.
А делитель напряжения это большой секрет? Полную схему подключения можно увидеть?
Так то оно красиво, а резисторы какие?
Так то оно красиво, а резисторы какие?
12floatR1 = 50190.0;// resistance of R1 (100K)13floatR2 = 16730.0;// resistance of R2 (10K)Ну и что мы хотим? Делитель на 1/3. Даже от разряженного аккумулятора при 3.8 получим 1.27 вольта. Референс 1.1 вольта, это максимальное напряжение которое можно измерить. Конечно он всегда 4095 будет выдавать. Не надо подпрограмм. Просто аналогрид используйте и будет выдавать что то чуть меньше 2000.
Я бы в setup() на всякий случай явно обьявил подключенный GPIO как INPUT. И использовал бы GPI 34 который только на вход можно использовать. А куда идет VP на данной плате ХЗ
Ну и что мы хотим? Делитель на 1/3. Даже от разряженного аккумулятора при 3.8 получим 1.27 вольта. Референс 1.1 вольта, это максимальное напряжение которое можно измерить. Конечно он всегда 4095 будет выдавать. Не надо подпрограмм. Просто аналогрид используйте и будет выдавать что то чуть меньше 2000.
То есть надо делитель с потолком в 1.1в?
Я бы в setup() на всякий случай явно обьявил подключенный GPIO как INPUT. И использовал бы GPI 34 который только на вход можно использовать. А куда идет VP на данной плате ХЗ
input не назначал, но пин пробовал.
Да. Что бы при 4.2 вольта на выходе делителя было меньше 1.1 . У ESP32 АЦП откровенно хреновый. Кривой и не точный, особенно в области больших напряжений. Я бы ему при референсе 1.1 вольта измерять больше 1 вольта не доверил.
Так гляньте тогда в библиотеке, какой пин должен быть измерительным. Может вы вообще не туда вешаете выход с делителя. Из вашего кода вообще не видно этого пина. Обычно он либо назначается в скетче, либо жестко прописан в библиотеке.
Так гляньте тогда в библиотеке, какой пин должен быть измерительным. Может вы вообще не туда вешаете выход с делителя. Из вашего кода вообще не видно этого пина. Обычно он либо назначается в скетче, либо жестко прописан в библиотеке.
должно работать
http://forum.amperka.ru/threads/%D0%A5%D0%B0%D0%BE%D1%81-%D0%B2-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%D1%85-%D0%90%D0%A6%D0%9F-esp32.19985/
Решено. Нашел вариант который работает. добавил пару фильтров и готово. Значения прыгают в диапазоне 0,02В.
adc.attach(33); /// пин
#include "Arduino.h" #include <ESP32AnalogRead.h> ESP32AnalogRead adc; void setup() { adc.attach(33); Serial.begin(115200); } void loop() { delay(50); Serial.println("Voltage = "+String(adc.readVoltage())); }Решено. Нашел вариант который работает. добавил пару фильтров и готово. Значения прыгают в диапазоне 0,02В.
adc.attach(33); /// пин
#include "Arduino.h" #include <ESP32AnalogRead.h> ESP32AnalogRead adc; void setup() { adc.attach(33); Serial.begin(115200); } void loop() { delay(50); Serial.println("Voltage = "+String(adc.readVoltage())); }а на 36 пине?
тоже, но я на всякий поменял пин)
тут есть описание пинов https://github.com/madhephaestus/ESP32AnalogRead/blob/master/ESP32AnalogRead.cpp
Ну говори же, измерьте тестером на ноге.... Что делитель был вверх ногами включен ? :)))