Arduino – Miernik pojemności akumulatora

Z racji tego, że ostatnio zamawialiśmy w firmie sporą pakę z akumulatorami i panowie z Hongkongu „zapomnieli” opisać jaką pojemność mają ogniwa trzeba było je pomierzyć. Zaraz ktoś się doczepi, że można było prościej, tak można było jednak przy tej mnogości wersji ( 60 różnych ) tak jest wygodniej. Mogłem oczywiście mniej więcej określić ich pojemność  znając pobór prądu oraz  czas działania akumulatora jednak jest to metoda mniej więcej dokładna. Najprościej było by zakup gotowego miernika pojemności, jednak potrzeba szybkiego ogarnięcia sprawy wymusiła produkcję miernika samemu. Cały miernik został wykonany z elementów które miałem pod ręką.

Jak działa układ ?

Cała zasada opiera się o badanie spadku napięcia na pierwszym rezystorze 1Ω. Jeżeli znamy jego rezystancję jesteśmy w stanie określić prąd w oczku. Na wyświetlaczu podczas pomiaru możemy obserwować bieżące napięcie akumulatora i prąd płynący w obwodzie oraz bieżącą pojemność.  Jeżeli napięcie spadnie poniżej 2.8V układ kończy pomiar, MOSFET  rozłącza obwód pomiarowy oraz na wyświetlaczu pojawia się wartość końcowa pojemności. Średni błąd pomiarowy układu waha się między 80-120mA, dla mnie jest to wystarczające, gdyż pod „młotek” trafiały akumulatory od 4000mAh w górę.

Do wykonania będą nam potrzebne następujące elementy:

– Arduino np. Arduino nano,
– Tranzystor MOSFET IRFZ44N lub zamiennik
– Rezystor 1Ω / 5W (zalecany radiator)
– Rezystor 3,9-4,2Ω/ 5W (zalecany radiator)
– Wyświetlacz 16×2 wraz z modułem I2C
– Wentylatorek na 5V jako opcja (ja musiałem założyć gdyż układ pracuje prawie bez przestoju)

Schemat ideowy połączeń z Arduino:

miernik akumlatorow arduino

Kod programu:

// Copyright © by swistak
// www.tranzystor.pl
// I2C piny
//VCC – > 5V
//GND – GND
//SCL -> A5
//SDA -> A4

#define mosfet 13
#define highPin A1
#define lowPin A0
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu układu na 0x27

boolean koniec = false;
int interwal = 5000;  //Interval (ms) between measurements

float mAh = 0.0;
float rezystancja = 1.0;
float napRef = 4.58; // wartość napięcia zasilającego sprawdz pin 5V
float prad = 0.0;
float battVolt = 0.0;
float shuntVolt = 0.0;
float battLow = 2.8;

unsigned long previousMillis = 0;
unsigned long millisPassed = 0;

void setup() {

pinMode(mosfet, OUTPUT);
digitalWrite(mosfet, LOW);
lcd.begin(16,2);
lcd.home();
lcd.print(„Test ogniwa”);
lcd.setCursor(0,1);
lcd.print(„Tranzystor.pl”);
delay(2000);
lcd.clear();
}

void loop() {

battVolt = analogRead(highPin) * napRef / 1024.0;
shuntVolt = analogRead(lowPin) * napRef / 1024.0;

if(battVolt >= battLow && koniec == false)
{
digitalWrite(mosfet, HIGH);
millisPassed = millis() – previousMillis;
prad = (battVolt – shuntVolt) / rezystancja;
mAh = mAh + (prad * 1000.0) * (millisPassed / 3600000.0);
previousMillis = millis();
lcd.clear();
lcd.home();
lcd.print(„U:”);
lcd.print(battVolt);
lcd.print(„V”);
lcd.setCursor(9,0);
lcd.print(„I:”);
lcd.print(prad);
lcd.print(„A”);
lcd.setCursor(0,1);
lcd.print(mAh);
lcd.print(„mAh”);
delay(interwal);
}
if(battVolt < battLow)
{
digitalWrite(mosfet, LOW);
koniec = true;
lcd.clear();
lcd.home();
lcd.print(„Koniec pomiaru”);
lcd.setCursor(0,1);
lcd.print(mAh);
lcd.print(„mAh „);
delay(interwal * 2);
}
}

Wygląd zmontowanego układu:

Gotowy miernik akumulatorów

Post Author: swistak

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Potwierdz, że nie jesteś botem. *