Датчик напруги 0–25 В: монітор 12-вольтового акумулятора на ESP32
Модуль «25 V» — це лише два резистори, 30 кОм і 7.5 кОм. Розбираємося, чому на ESP32 він міряє не 25, а лише 16.5 В, як калібрувати показ мультиметром, і як перевести напругу свинцевого акумулятора у відсотки заряду.
Про проєкт
Щоб виміряти напругу, вищу за 3.3 В, її треба зменшити дільником. Модуль «Voltage Sensor 0–25 V» — готовий дільник 30 кОм / 7.5 кОм з клемником і штирями. Він ділить напругу на 5: 25 В на вході дають 5 В на виході — рівно діапазон Arduino Uno. З таким модулем легко стежити за акумулятором сигналізації, сонячної станції чи машини.
Що потрібно
- ESP32 DevKit (або Arduino Uno)
- Модуль датчика напруги 0–25 В
- Джерело 12 В: акумулятор або блок живлення
- Мультиметр для калібрування
Схема
| Модуль | Під'єднати до |
|---|---|
| Клема VCC | «+» акумулятора |
| Клема GND | «−» акумулятора |
| S | GPIO34 (ADC1) |
| + | нікуди: на більшості модулів цей штир ні з чим не з'єднаний |
| − | GND ESP32 |
«Мінус» акумулятора і GND плати обов'язково мають бути спільними, інакше вимірювати немає відносно чого.
Головна пастка — 3.3 В
Модуль розрахований на 5-вольтові Arduino. На вході ESP32 допустимо до 3.3 В, тож із дільником 5:1 максимум — 16.5 В. Для 12-вольтового акумулятора (до 14.4 В під час заряджання) цього вистачає, а от 24-вольтову систему вже не можна: 25 В дадуть 5 В на виводі і зіпсують його. Для більших напруг візьміть свій дільник, наприклад 100 кОм / 10 кОм (11:1).
Крім того, АЦП ESP32 нелінійний біля верхньої межі, тому ми читаємо analogReadMilliVolts() з заводською калібровкою і усереднюємо 32 виміри.
Код
// Монітор 12-вольтового акумулятора: датчик напруги 0–25 В (дільник 30k / 7.5k)
const int SENSE_PIN = 34;
const float DIVIDER = (30000.0 + 7500.0) / 7500.0; // = 5
const float CALIBRATION = 1.00; // підберіть, порівнявши з мультиметром
float batteryVolts() {
uint32_t mv = 0;
for (int i = 0; i < 32; i++) mv += analogReadMilliVolts(SENSE_PIN);
return mv / 32.0 / 1000.0 * DIVIDER * CALIBRATION;
}
int percentLeadAcid(float v) { // свинцевий 12 В у спокої: 11.8 В ≈ 0 %, 12.7 В ≈ 100 %
return constrain((int)((v - 11.8) / (12.7 - 11.8) * 100), 0, 100);
}
void setup() {
Serial.begin(115200);
}
void loop() {
float v = batteryVolts();
Serial.printf("Акумулятор %.2f В ~%d %%%s\n", v, percentLeadAcid(v), v < 11.9 ? " РОЗРЯДЖЕНИЙ!" : "");
delay(1000);
}
У симуляторі міняйте напругу блока живлення. Поставте 20 В — симулятор нагадає, що для ESP32 це вже забагато.
Калібрування
Резистори мають допуск 1–5 %, а опорна напруга АЦП теж плаває, тож похибка в 0.1–0.3 В звичайна. Поміряйте напругу мультиметром, порівняйте з показом у моніторі порту і задайте CALIBRATION = мультиметр / показ. Наприклад, мультиметр — 12.46 В, скетч — 12.31 В: CALIBRATION = 1.012.
Відсотки заряду
Напруга свинцевого акумулятора точно показує заряд лише у спокої, через годину після заряджання чи навантаження. Під навантаженням вона просідає, а під час заряджання — завищена. Для літієвих акумуляторів таблиця інша: 1S Li-ion — від 3.0 В (0 %) до 4.2 В (100 %), причому залежність сильно нелінійна.
Що далі
- Повідомлення в Telegram, коли напруга падає нижче 11.9 В.
- Графік за добу на веб-сторінці ESP32: видно, як сонячна панель заряджає акумулятор удень.
- Струм і потужність — додайте INA219, він вимірює і те, і те.