Как считывать заряд акб на 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 минут измеряете ? ;)
Код только этот, пока. при компиляции ошибок нет.
А делитель напряжения это большой секрет? Полную схему подключения можно увидеть?
Так то оно красиво, а резисторы какие?
Так то оно красиво, а резисторы какие?
12
float
R1 = 50190.0;
// resistance of R1 (100K)
13
float
R2 = 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); /// пин
Решено. Нашел вариант который работает. добавил пару фильтров и готово. Значения прыгают в диапазоне 0,02В.
adc.attach(33); /// пин
а на 36 пине?
тоже, но я на всякий поменял пин)
тут есть описание пинов https://github.com/madhephaestus/ESP32AnalogRead/blob/master/ESP32AnalogRead.cpp
Ну говори же, измерьте тестером на ноге.... Что делитель был вверх ногами включен ? :)))