🛒
0 товар.
0 руб.
Логотип

Интернет-магазин «Неглупый Дом»

☰
ИИ-консультант Wildberries OZON Яндекс Маркет
Поиск по сайту
Гугл таблица с ассортиментом

🔋 Проект: тестер ёмкости аккумулятора на ACS712 в мА·ч

Датчик ACS712 и память EEPROM

ACS712 измеряет ток разряда через нагрузку, Arduino интегрирует по времени, ёмкость сохраняется в EEPROM.

Как это работает

ACS712 на эффекте Холла выдаёт напряжение, пропорциональное протекающему через него току: в покое это примерно половина питания (около 2.5В), а отклонение от этой точки переводится в амперы через коэффициент чувствительности датчика (0.066 В/А у варианта на 30А, 0.100 — на 20А, 0.185 — на 5А; точное значение смотрите на маркировке своей платы).

Ток умножается на время между измерениями и накапливается — это и есть классическое интегрирование мгновенного тока по времени, которое в итоге даёт суммарную разряженную ёмкость в мА·ч. Как только ток падает почти до нуля (аккумулятор разряжен до отсечки), результат записывается в энергонезависимую EEPROM, чтобы не потерять его при отключении питания.

Пошаговая сборка

Так как реализации модуля бывают разные, если контактов как в примере нет на вашей плате — сориентируйтесь по надписям на своей.

  1. ACS712: OUT → A0, нагрузочный резистор и аккумулятор подключаются последовательно через токовые клеммы датчика.
  2. Память AT24C256: SDA → A4, SCL → A5 (стандартная шина I2C Arduino Uno/Nano).
  3. Уточните реальный коэффициент чувствительности вашей платы ACS712 (5А/20А/30А) и подставьте в формулу вместо примерного значения.
  4. Запустите разряд через нагрузочный резистор и дождитесь падения тока почти до нуля — результат должен записаться в EEPROM.

Скетч

// ВНИМАНИЕ: отладьте через монитор порта — я языковая модель, а не
// специализированный кодер, основу накидал, проверьте под свою схему.

#include <Wire.h>

const int sensorPin = A0;
const int EEPROM_ADDR = 0x50;
// 0.066 В/А — чувствительность варианта ACS712-30A, уточните для своей платы
const float sensitivity = 0.066;
float totalMah = 0;
unsigned long lastSample = 0;

void saveResult(int mah) {
  Wire.beginTransmission(EEPROM_ADDR);
  Wire.write(0); Wire.write(0);
  Wire.write(mah >> 8);
  Wire.write(mah & 0xFF);
  Wire.endTransmission();
  delay(5);
}

void setup() {
  Wire.begin();
  lastSample = millis();
}

void loop() {
  int raw = analogRead(sensorPin);
  float voltage = (raw / 1023.0) * 5.0;
  float current = abs(voltage - 2.5) / sensitivity;

  unsigned long now = millis();
  float hoursElapsed = (now - lastSample) / 3600000.0;
  totalMah += current * 1000 * hoursElapsed; // интегрирование тока по времени
  lastSample = now;

  if (current < 0.02) {
    saveResult((int)totalMah);
  }
  delay(1000);
}
                

Интегрирование на каждой итерации накапливает мА·ч — точность растёт с частотой измерений.

Частые проблемы

Как улучшить проект

Товары по теме

Ещё модули для Arduino: Электронные модули.

← 🛑 автоотключение нагрузки при пе…📊 веб-страница истории измерений… →

🎁 Купить весь комплект со скидкой 10%

Все 2 товара сразу: 235 ₽ 212 ₽ (экономия 23 ₽)

Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.

Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.

Корзина

Поиск


Пример: понижающий или DC-DC или mini360 или aw-023 или арт. OZ/WB/YA