Тренування кислотного акумулятора абияк і своїми руками

Печаль. Здох акумулятор, незаслужено забутий взимку в гаражі. Я його витягнув з мотоцикла, то сигналізація зжерла всі, то чи не зарядився у минулі покатушки. Напряжометр показував 9В, що є кримінал.

Я приніс батарею додому, відігрів, підключив до заряднику. Зарядник через півгодини показав ОК. Брехав. Нічого там не ок. Лампочка ближнього світла горіла приблизно 10 хвилин і потім швидко перейшла в стан «слабо грію повітря». Акумулятор 6Ач, лампочка 55Вт.

Не купувати ж новий акумулятор? Зима, час є. Є ардуина навіть і коробка всяких чіпсів з Китаю. Дарма порошаться там чи що?

image

У далекій радянської армії 30 років тому я проходив курс догляду за акумуляторами. Основна відмінність його від інструкцій 21 століття було таким: батарея повинна проходити серію циклів заряду і розряду. Без цього, скільки її в заряднике не тримай, який би він не був розумний, вона здохне.

Теорія процесу нагугливается легко. Практично ж треба розрядити невеликим струмом в декілька ампер до 10.8, а потім зарядити до упору. І так кілька разів. Дивитися на лампочку швидко набридло і я намалював схему приладу.

image

Так як я не професійний реаніматор батарейок, я зібрав все абияк. Ну, як годиться любителю ардуины.

image

Так як я опинився в цій ситуації не один, я оформив проект на гітхабі, щоб інші теж могли користуватися, і навіть поклав туди красиву схему, намалювавши її в easyeda.com

image

Аналогові ноги зчитували напруга і струм, потенціометр ділив напруга акумулятора приблизно на три. При падінні напруги нижче 10.8 В включався заряд, при перевищенні 14.5 В розряд. І так три рази. Потім батарея заряджалася і розряд вже не включався.

#define POWERPIN 0
#define AMPERPIN 1
#define LIMIT 10.8 f
#define UPLIMIT 14.5 f

Запускався процес кнопкою миші або автоматично після повного заряду. Самий дохлий з акумуляторів заряджатися не хотів до упору і тільки даремно грівся. Я його бив кнопкою кілька разів, потім процес пішов.

Був у коробці амперметр, я застосував його для підрахунку ємності батареї при розряді. В процесі циклу в терміналі було видно:

  • Поточний заряд в Ач.
  • Поточний розряд в Ач.
  • Струм в А.
  • Напругу в Ст.
При перемиканні режиму, відповідно було видно кінцева величина Ач для попереднього процесу. Так само виводилося час, витрачений на цикл.

Власне программуля копіпастом з гитхаба
/*
** Реле на пін 2
** Кнопка на пін 3
** Міряємо напруга на аналоговому піне 0
** Амперметр на аралоговый порт 1
** Перемикаємо на заряд при напрузі 10.8 В
** Не хочемо працювати при напрузі менше 5В
** 
** При включенні працює зарядка. 
** Кнопка перемикає режим заряд/розряд.
** Розряд завершується при досягненні 10.8 B і починається заряд.
*/


/*
Todo:
Вважати час заряду і розряду.
Якщо лампа перегорає -- на зарядку.
*/


#define RELAYPIN 2
#define BUTTONPIN 3
#define POWERPIN 0
#define AMPERPIN 1
#define LIMIT 10.8 f
#define UPLIMIT 14.5 f
#define BADPOWER 5.0 f
#define CIRCLES 3

#define SWITCH_LAMP 0
#define SWITCH_CHARGER 1

// Секунд на висновок інфи
#define TICKS (60*5)

void setup() {
pinMode(RELAYPIN, OUTPUT);
pinMode(BUTTONPIN, INPUT_PULLUP);
digitalWrite(RELAYPIN, HIGH);
Serial.begin(9600);
Serial.println("Start...");
}

int mode = SWITCH_CHARGER;
int pressed = 0;
int tick = 0;
unsigned long start = 0;
int circle = 1;

float chargeAh = 0.0;
unsigned long chargeMs = 0;
float dischargeAh = 0.0;
unsigned long dischargeMs = 0;

void loop() {
// Закінчили
if (circle > CIRCLES) return;
// Перевіряємо напруга.
float v = analogRead(POWERPIN) / 1023.0 f * 3.0 f * 5.0 f;
// Вимірюємо струм
float a = ((analogRead(AMPERPIN) * (5.0 / 1024.0)) - 2.5) / 0.1;
// Заряджаємо, якщо щось не так з зарядкою.
if (v > BADPOWER) {
// Йде зарядка, очікуємо кнопку.
if (mode == SWITCH_CHARGER) {
chargeAh += a * (millis() - chargeMs) / 3600000.0;
chargeMs = millis();
if (digitalRead(BUTTONPIN) == LOW || v > UPLIMIT && circle <= CIRCLES) {
mode = SWITCH_LAMP;
digitalWrite(RELAYPIN, LOW); // Перемикаємо на лампочку.
dischargeMs = millis();
Serial.print("Try "); Serial.println(circle);
Serial.print("Charge was "); Serial.print(chargeAh); Serial.println("Ah");
dischargeAh = 0.0;
Serial.println("LETS LIGHT!");
delay(100);
pressed = 1;
circle++;
if (circle > CIRCLES) Serial.println("Thats enough!");
}
}
// Йде розряд, очікуємо падіння напруги.
if (mode == SWITCH_LAMP) {
dischargeAh += a * (millis() - dischargeMs) / 3600000.0;
dischargeMs = millis();
// Досягли дна по напрузі.
if (v < LIMIT) {
mode = SWITCH_CHARGER;
digitalWrite(RELAYPIN, HIGH); // Перемикаємо на зарядник.
start = millis();
Serial.println("TIME TO SUCK ELECTRICITY!");
unsigned long msec = millis() - start;
Serial.print("Discharge time ");
Serial.print(msec / 3600000); Serial.print("h ");
Serial.print((msec % 3600000) / 60000); Serial.print("m ");
Serial.print((msec % 60000) / 1000); Serial.print("s ");
Serial.println();
Serial.print("Appoximate capacity "); Serial.print(55 / 12);
Serial.println("Ah");
Serial.print("Disharge was "); Serial.print(dischargeAh); Serial.println("Ah");
chargeAh = 0.0;
}
// Переключити на зарядку примусово.
if (pressed == 0 && digitalRead(BUTTONPIN) == LOW) {
mode = SWITCH_CHARGER;
digitalWrite(RELAYPIN, HIGH); // Перемикаємо на зарядник.
chargeMs = millis();
Serial.println("SUCK THE ELECTRICITY!");
Serial.print("Disharge was "); Serial.print(-dischargeAh); Serial.println("Ah");
chargeAh = 0.0;
if (circle > CIRCLES) Serial.println("LAST CHARGING!");
delay(100);
}
}
} else {
Serial.println("BAD POWER!");
}
if (tick == 0) {
Serial.print(" Disharge = "); Serial.print(-dischargeAh);
Serial.print(" Charge = "); Serial.print(chargeAh);
Serial.print(" Current = "); Serial.print(a);
Serial.print(" Voltage = "); Serial.println(v);
}
pressed = 0;
tick = ++tick % TICKS;
delay(1000); // Не поспішаємо
}


Всякі дисплеї я не прикручували, спостерігав за процесом з терміналу через usb/serial.

В результаті, обидва акумулятора ожили і показали пристойні амперчаси приблизно відповідні своїм номіналах, що було навіть дивно для їх віку.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.