Как считывать заряд акб на ESP32

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

 У меня 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);
}

 

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

Поправка: показывает 4.2 В при любом значении раряда акб на входе

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а с чего ты решил, что это 33-36 пины?

lilik
Offline
Зарегистрирован: 19.10.2017

А почему заряд вольтами то меряется? :-)

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

это не та схема

ua6em пишет:

а с чего ты решил, что это 33-36 пины?

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

мой косяк) напряжение.

lilik пишет:

А почему заряд вольтами то меряется? :-)

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

ua6em пишет:

а с чего ты решил, что это 33-36 пины?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну во первых -  adc1_get_voltage is deprecated, use adc1_get_raw

Правда это скорее придирка, думаю, что вы подключаете не к той ноге. Покажите на рисунке , где ваша 36 нога ?

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

левый верхний 2, под перезагрузкой

brokly пишет:

Ну во первых -  adc1_get_voltage is deprecated, use adc1_get_raw

Правда это скорее придирка, думаю, что вы подключаете не к той ноге. Покажите на рисунке , где ваша 36 нога ?

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

 adc1_get_raw тоже пробовал

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Да нет, на словах все правильно. Тестером можете измерить ? В общем тут в форуме мы ошибку не найдем. Ваши слова не соответствуют действительности, просто вы где то ошибаетесь. Но все же adc1_get_voltage поменяйте на adc1_get_raw , хрен его знает что у вас там за библиотека. Вы же варнинги при компиляции не читаете.

Это весь ваш код, или кусок. Может вы где то в не показном нам месте что то накосячили, ногу например отключили. 

А вы  правда батарейку 8.5 минут измеряете ? ;)

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

Код только этот, пока. при компиляции ошибок нет. 

nik182
Offline
Зарегистрирован: 04.05.2015

А делитель напряжения это большой секрет? Полную схему подключения можно увидеть? 

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

nik182
Offline
Зарегистрирован: 04.05.2015

Так то оно красиво, а резисторы какие? 

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

nik182 пишет:

Так то оно красиво, а резисторы какие? 

12     float R1 = 50190.0; // resistance of R1 (100K)
13     float R2 = 16730.0;  // resistance of R2 (10K)

 

nik182
Offline
Зарегистрирован: 04.05.2015

Ну и что мы хотим? Делитель на 1/3. Даже от разряженного аккумулятора при 3.8 получим 1.27 вольта. Референс 1.1 вольта, это максимальное напряжение которое можно измерить. Конечно он всегда 4095 будет выдавать. Не надо подпрограмм. Просто аналогрид используйте и будет выдавать что то чуть меньше 2000. 

SAB
Offline
Зарегистрирован: 27.12.2016

Я бы в setup() на всякий случай явно обьявил подключенный GPIO как INPUT. И использовал бы GPI 34 который только на вход можно использовать. А куда идет VP  на данной плате ХЗ

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

nik182 пишет:

Ну и что мы хотим? Делитель на 1/3. Даже от разряженного аккумулятора при 3.8 получим 1.27 вольта. Референс 1.1 вольта, это максимальное напряжение которое можно измерить. Конечно он всегда 4095 будет выдавать. Не надо подпрограмм. Просто аналогрид используйте и будет выдавать что то чуть меньше 2000. 

То есть надо делитель с потолком в 1.1в?

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

SAB пишет:

Я бы в setup() на всякий случай явно обьявил подключенный GPIO как INPUT. И использовал бы GPI 34 который только на вход можно использовать. А куда идет VP  на данной плате ХЗ

input не назначал, но пин пробовал. 

nik182
Offline
Зарегистрирован: 04.05.2015

Да. Что бы при 4.2 вольта на выходе делителя было меньше 1.1 . У ESP32 АЦП откровенно хреновый. Кривой и не точный, особенно в области больших напряжений. Я бы ему при референсе 1.1 вольта измерять больше 1 вольта не доверил. 

SAB
Offline
Зарегистрирован: 27.12.2016

Так гляньте тогда в библиотеке, какой пин должен быть измерительным. Может вы вообще не туда вешаете выход с делителя. Из вашего кода вообще не видно этого пина. Обычно он либо назначается в скетче, либо жестко прописан в библиотеке.

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

SAB пишет:

Так гляньте тогда в библиотеке, какой пин должен быть измерительным. Может вы вообще не туда вешаете выход с делителя. Из вашего кода вообще не видно этого пина. Обычно он либо назначается в скетче, либо жестко прописан в библиотеке.

должно работать

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/

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

Решено. Нашел вариант который работает. добавил пару фильтров и готово. Значения прыгают в диапазоне 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()));
 }

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

BigBlackOwl пишет:

Решено. Нашел вариант который работает. добавил пару фильтров и готово. Значения прыгают в диапазоне 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 пине?

BigBlackOwl
Offline
Зарегистрирован: 01.11.2021

тоже, но я на всякий поменял пин)

тут есть описание пинов  https://github.com/madhephaestus/ESP32AnalogRead/blob/master/ESP32AnalogRead.cpp

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну говори же, измерьте тестером на ноге.... Что делитель был вверх ногами включен ? :)))