← До всіх проєктів
Сенсори Початковий

Датчик напруги 0–25 В: монітор 12-вольтового акумулятора на ESP32

Модуль «25 V» — це лише два резистори, 30 кОм і 7.5 кОм. Розбираємося, чому на ESP32 він міряє не 25, а лише 16.5 В, як калібрувати показ мультиметром, і як перевести напругу свинцевого акумулятора у відсотки заряду.

Складність
Початковий
Час
30 min
Категорія
Сенсори
Оновлено

Про проєкт

Щоб виміряти напругу, вищу за 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, він вимірює і те, і те.