Ovdje pročitajte kako se registrirati na forum.

Mjerač kapaciteta akumulatora

Tvoj projekt je upravo dovršen? Podijeli s nama što si napravio u ovom podforumu! Upute drugima kako napraviti isti projekt su uvijek dobrodošle!
Odgovorite
Avatar
marvin.da.sp#2296
Novak
Novak
Postovi: 4
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Križevci

Mjerač kapaciteta akumulatora

Post Postao/la marvin.da.sp#2296 » sub stu 23, 2019 9:39 pm

Ideja projekta
Punjivi Ni-MH akumulatori su racionalnije i praktičnije rješenje od običnih (ne-punjivih – cink-ugljik ili alkalnih) baterija, tako da sam s vremenom nakupio veću količinu ovakvih akumulatora, uglavnom formata AA ili AAA. Budući da akumulatori imaju svoj vijek trajanja (točnije, broj ciklusa punjenje/pražnjenje), stvarni kapacitet prilikom korištenja često jako odstupa od deklariranog kapaciteta, ovisno o njihovoj starosti, proizvođaču, kao i režimu pražnjenja (nije svejedno napaja li akumulator npr. zidni sat čija se potrošnja mjeri u mikroamperima, ili RC model automobila čija potrošnja na trenutke doseže ampere). Stoga bi mi bilo korisno imati uređaj koji će mi za određeni primjerak akumulatorske baterije točno izmjeriti s kolikim kapacitetom i kakvim ponašanjem mogu računati u određenom potrošaču (ili tu bateriju treba jednostavno odložiti u najbližu trgovinu koja prima baterijski otpad).
Stoga sam izradio uređaj zasnovan na Croduino platformi za mjerenje kapaciteta baterija. Pri tome sam želio dobiti sljedeća svojstva ili mogućnosti:
  • Mogućnost mjerenja kapaciteta za baterije nominalnoga napona 1,2-1,5 V, formata AA ili AAA;
  • Mogućnost mjerenja do dvije baterije istovremeno, ali neovisno jedno o drugoj (znači mogu mjeriti samo jednu ili dvije baterije istovremeno, pri čemu trenutak početka ili završetka mjerenja jedne baterije ne smije utjecati na proces mjerenja, tj. pražnjenja druge baterije);
  • Mogućnost mjerenja u različitim režimima opterećenja
  • Osim kapaciteta, želim dobiti informaciju i o drugim svojstvima baterije, konkretno naponu praznog hoda (napon koji daje neopterećena baterija) te unutarnjem otporu. Ove veličine se mijenjaju s razinom napunjenosti baterije, dakle zanima me kako se ove veličine mijenjaju tijekom procesa pražnjenja baterije;
  • Mjerač treba tijekom mjerenja pokazivati trenutačne vrijednosti mjerenih veličina, odnosno konačno izmjerene veličine u trenutku završetka procesa pražnjenja. Iste veličine treba periodički slati na serijski (tj. USB) priključak. To omogućava izradu statistika i vođenje baze podataka na računalu o baterijama i ponašanju njihovih parametara tijekom eksploatacijskog vijeka, uz pretpostavku da je na drugom kraju USB kabla računalo s odgovarajućim programom, a ne običan ispravljač.
Proces mjerenja
Sama ideja je jednostavna: bateriju spojiti na radno trošilo (otpornik odgovarajućega otpora i snage) i pratiti napon baterije te mjeriti vrijeme. Iz poznatoga opteretnog otpora Rt i izmjerenog napona Ubat možemo izračunati struju pražnjenja Ipr:
Ipr = Ubat / Rt
Iz jakosti struje i protekloga vremena dobivamo ispražnjenu količinu naboja, odnosno kapacitet C (u mAh):

C = Ipr * t

Jasno, napon se baterije mijenja tijekom procesa pražnjenja, pa time i struja pražnjenja. Stoga se napon baterije uzastopno mjeri tijekom određenog vremenskog intervala (pola sekunde), uzima se srednja vrijednost tih mjerenja iz koje se onda izračunava struja i količina naboja ispražnjenog tijekom tog intervala, i ta količina naboja se pribraja ukupno izmjerenoj količini ispražnjenog naboja; zatim se postupak ponavlja.
Pražnjenje se u pravilnim razmacima (svakih 30 s) nakratko prekida, kako bi se izmjerio napon praznog hoda baterije Uph. Konačno, iz napona praznog hoda i struje pražnjenja Ipr te opteretnog otpora Rt možemo izračunati (efektivni) trenutačni unutarnji otpor baterije Ru:
Ru = Uph / Ipr - Rt

Proces mjerenja kapaciteta automatski započinje kad uređaj izmjeri na priključnicama ležišta za akumulator napon viši od određenog graničnog napona (1,1 V) uzastopno tijekom razdoblja od dvije sekunde (znači da je umetnuta napunjena baterija), a prekida se kad napon praznog hoda padne ispod određene granice (0,9 V).
Tijekom procesa mjerenja se trenutačno izmjerene vrijednosti šalju na serijski port, tako da ih vanjsko računalo, ako je priključeno, može dalje prikupljati, obrađivati i pohranjivati.

Elektronički sklop
Shema sklopa prikazana je na slici:

slika

Sklop se sastoji od dvije identične grane, za svaku bateriju po jedna. Baterije se prazne preko opteretnog otpora R3 ili R5 (odnosno R4 ili R6), pri čemu se preklopnikom S1 (radi se o dvostrukom preklopniku) bira opteretni otpor preko kojeg se baterija prazni, tj. režim mjerenja (veća ili manja struja). Budući da se na tim otporima oslobađa energija iz akumulatora u obliku topline, trebaju biti dimenzionirani za odgovarajuću snagu (na otporu od 1 Ω bi se uz napon baterije od 1,5 V oslobađala snaga od 2,25 W), a kod konstrukcije pločice treba ostaviti dovoljno slobodnog prostora oko otpornika od 1Ω, kako ne bi zagrijavao okolne elemente. Mikrokontroler mjeri napone na sva četiri opteretna otpora pa na taj način može detektirati kad je napunjena baterija umetnuta u ležište i preko kojeg otpora se prazni.
U svim ležištima koja prihvaćaju više baterija (dvije u ovom slučaju) su baterije spojene serijski. Na ležištu je trebalo još izvući srednji priključak (između dvije baterije), pa ulazi A0 i A2 zapravo mjere napon cijele serije, a napon na Acc1 se računa kao razlika napona ukupne serije i napona na Acc2 (ulazi A3 i A5).
Paralelno baterijama spojeni su otpornici R1 i R2 od 10kΩ. Struje kroz njih, tj. njihov utjecaj na točnost mjerenja zanemarive su, ali osiguravaju točnost mjerenja kad baterija nije umetnuta - u suprotnom bi mjerni ulazi u određenim trenucima bili „u zraku“ i mjerili napone smetnji.
Procesom pražnjenja upravlja se preko dva releja (Re1 i Re2) koje mikrokontroler uključuje preko klasične tranzistorske sklopke ostvarene pomoću tranzistora Q1 i otpora R7 (odnosno Q2/R8). Tu su u bazni krug ubačene i LED za indikaciju pražnjenja. D1 i D2 štite tranzistore od samoinduktivnog naponskog udara prilikom isključivanja releja. Ovaj dio se može jednostavnije izvesti tako da se umjesto releja i tranzistora upotrijebi gotovi dvokanalni modul s relejom, no ja sam iskoristio dijelove koje sam već imao na zalihi.

Izvedba uređaja
Gotov uređaj izgleda ovako:

slika

Vide se dvostruka ležišta za akumulatore (formata AA i AAA, spojeni paralelno), LED za indikaciju kad je pražnjenje uključeno (releji zatvoreni) i preklopnik kojim se mijenja otpor opterećenja. Na donjoj strani je otvor za priključivanje USB kabla. Kao kućište je upotrijebljena kutija od VHS kasete (tko ih se sjeća :D ) – prikladne je veličine, dobro i jednostavno se otvara/zatvara i besplatna je.
Uređaj tijekom pražnjenja akumulatora na LCD ekranu naizmjence prikazuje u trajanju od dvije sekunde vrijednosti ovih veličina:
  • Proteklo vrijeme pražnjenja
  • Trenutačni napon praznog hoda
  • Trenutačna struja pražnjenja
  • Trenutačni unutarnji otpor baterije
  • Do sada ispražnjena količina naboja
Po završetku procesa pražnjenja se na isti način naizmjence prikazuju ukupno vrijeme pražnjenja, napon praznog hoda, struja pražnjenja i unutarnji otpor baterije na kraju procesa pražnjenja, te ukupni ispražnjeni naboj (kapacitet), sve dok se ne akumulator ne izvadi i ne umetne novi, kad proces kreće od početka. Kako ekran ima dva retka, u prvom se prikazuju veličine za prvi akumulator (točnije, prvo ležište), a u drugom redu za drugi, kako i upućuju oznake 'Acc1' i 'Acc2' lijevo od ekrana.

Pogled u unutrašnjost:

slika

U lijevom donjem kutu vide se keramički otpornici od 1 Ω/5 W, montirani iz rub pločice tako da budu malo odmaknuti od ostalih elemenata. Mogu se primijetiti i rupe za hlađenje izbušene na bočnim stranicama kutije.
Uz desni rub pločice su priključnice za spajanje ležišta za baterije. Ispod njih je priključnica koja je ubačena u krug srednjeg priključka ležišta i u nju je postavljen kratkospojnik od debele bakrene žice – prilikom baždarenja uređaja tu se umjesto kratkospojnika priključuje ampermetar. Budući da vrijednost otpora ima određenu toleranciju i nije potpuno točna, u ovoj točki se mjeri stvarna struja pražnjenja akumulatora i prema njoj se određuju točne vrijednosti opteretnih otpora koje ulaze u izračun kapaciteta (konstante Rp1 i Rp10 u liniji 65 – vidi kod dolje).
Ako je nekome od informatičara starog kova nekako poznat plosnati kabel kojim je spojen LCD ekran, nije slučajno. Radi se o kablu za spajanje disketnog pogona iz starog računala :D ; razmak rupica na konektoru na kraju kabla točno odgovara razmaku pinova na headeru.

Programski kod
Programski kod je ovdje:

Kod: Označite sve

#include <FastIO.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_SR.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>


#include <string.h>

//pinovi
#define ulAcc1_1om A2         //napon prvoga akumulatora na otporniku od 1 om
#define ulAcc1_10om A0        //napon prvoga akumulatora na otporniku od 10 oma
#define ulAcc2_1om A5         //napon drugoga akumulatora na otporniku od 1 om
#define ulAcc2_10om A3        //napon drugoga akumulatora na otporniku od 10 oma
#define izlRel1 6             //upravljanje relejem prvoga akumulatora
#define izlRel2 8             //upravljanje relejem drugoga akumulatora
#define   KONTRAST_PIN    9   // Pin na kojemu nam je spojen Vo pin LCDa
#define   POZOSVJETLJENJE 7   // anoda(+) LEDice pozadinskog osvjetljenja. Sada
                              // mozemo upravljati pozadinskim osvjetljenjem.
#define   KONTRAST     130    // ovo je varijabla za kontrast(0-255)

#define koefUAcc 4.8828       //koeficijent za preračunavanje izmjerenog napona u mV

#define Acc1 0                //indeks prvog akumulatora
#define Acc2 1                //indeks drugog akumulatora

#define U_GORNJA_GRANICA 1100   //napon [mV] praznog hoda akumulatora iznad kojeg se inicira proces pražnjenja
#define U_DONJA_GRANICA 900     //napon [mV] praznog hoda akumulatora ispod kojeg se prekida proces pražnjenja
#define U_PRAZNO 200            //napon [mV] ispod kojeg se smatra da akumulator nije umetnut
#define U_ZANEMARENJE 100        //granica [mV] ispod koje se izmjereni napon zanemaruje (smetnja)

#define T_MJERENJE 500        //trajanje mjerenja ulaznih napona u ms
#define T_CEKANJE 2000        //vrijeme (u ms)koliko napon akumulatora mora uzastopno biti iznad 
                              //U_GORNJA_GRANICA da bi se inicirao proces pražnjenja
#define T_OPTERECENJE 29500   //trajanje razdoblja opterećenja [ms]
#define T_PRAZNI_HOD 300      //trajanje razdoblja praznog hoda [ms]
#define T_PRIKAZ 3000         //učestalost prikaza [ms]

#define T_ms millis()

//kodovi stanja
enum STANJA {
  CEKANJE_POCETAK,
  CEKANJE_MJERENJE,
  PRAZNJENJE_INICIJALIZACIJA,
  PRAZNJENJE_OPTERECENJE_INIT,
  PRAZNJENJE_OPTERECENJE,
  PRAZNJENJE_PRAZNI_HOD_INIT,
  PRAZNJENJE_PRAZNI_HOD,
  PRAZNJENJE_PRAZNI_HOD_KRAJ,
  PRAZNJENJE_KRAJ,
  STOP_INIT,
  STOP_MJERENJE
};


//GLOBALNE VARIJABLE
byte stanje[2] = {CEKANJE_POCETAK, CEKANJE_POCETAK};      //stanja konačnih automata
float AccNaboj[2];                                        //količina izbijene struje [mAh]
float Rp[2], Up[2], Ip[2];                                //otpor trenutačno aktivnog opteretnog otpora [om] i napon [mV]i struja [mA] na njemu
unsigned long t0[2], t1[2], t_pr[2], t_start;             //t0 - vrijeme početka pražnjenja [ms], t1 - vrijeme početka trenutnog ciklusa [ms], t_pr - ukupno trajanje procesa pražnjenja [s]
const float Rp1[2] = {1.16, 1.0555}, Rp10[2] = {10.394, 10.28};          //vrijednosti opteretnih otpora - točne vrijednosti utvrditi mjerenjem!
float Upr_h[2], Ipr[2], Ru[2];                            //trenutačne vrijednosti: napon praznog hoda [mV], struja pražnjenja [mA], unutarnji otpor [om]

// funkcija iz librarya koja kreira LCD objekt
LiquidCrystal lcd(12, 11, 5, 4, 3, 2, POZOSVJETLJENJE, POSITIVE );

void setup() {
  // put your setup code here, to run once:
  t_start = T_ms;
  pinMode(ulAcc1_1om, INPUT);
  pinMode(ulAcc1_10om, INPUT);
  pinMode(ulAcc2_1om, INPUT);
  pinMode(ulAcc2_10om, INPUT);
  pinMode(izlRel1, OUTPUT);
  pinMode(izlRel2, OUTPUT);

  Serial.begin(115200);
  analogReference(DEFAULT);
  digitalWrite(izlRel1, LOW);
  digitalWrite(izlRel2, LOW);

  pinMode(KONTRAST_PIN, OUTPUT);
  analogWrite (KONTRAST_PIN, KONTRAST);
  lcd.begin(16, 2);              // potrebno da bismo mogli koristiti LCD.
  // 16,2 oznacava dimenziju LCDa
  lcd.backlight();             // uključi backlight
  lcd.clear();
  lcd.print("MJERENJE KAPAC. ");
  lcd.setCursor(0, 1);
  lcd.print("NiMH AKUMULATORA");
  delay(2000);
}

void loop() {
  // put your main code here, to run repeatedly:

  IzmjeriNapon();
  KonacniAutomat(Acc1);
  KonacniAutomat(Acc2);
  OsvjeziPrikaz(Acc1);
  OsvjeziPrikaz(Acc2);
}

void PostaviRelej(byte Acc, byte Status) {
  //postavlja relej u određeno stanje

  if (Acc == Acc1)
    digitalWrite(izlRel1, Status);
  else
    digitalWrite(izlRel2, Status);
  delay(15);
}

void IzmjeriNapon() {
  // Mjeri napon na ulazima A0-A3.
  // U razdoblju od T_MJERENJE se uzastopno mjere naponi i pohranjuju srednje vrijednosti u globalne varijable Uul_*

  unsigned long t;
  long U1_1 = 0, U1_10 = 0, U2_1 = 0, U2_10 = 0, U1, U10, U2;
  int n = 0;

  for (t = T_ms; T_ms - t < T_MJERENJE; n++) {
    U1 = analogRead(ulAcc2_1om);
    U10 = analogRead(ulAcc2_10om);
    U2_1 += U1;
    U2_10 += U10;
    U2 = U1 > U10 ? U1 : U10;
    U1_1 += (analogRead(ulAcc1_1om) - U2);
    U1_10 += (analogRead(ulAcc1_10om) - U2);
    delay(5);
  }

  U1_1 = koefUAcc * U1_1 / n;
  U1_10 = koefUAcc * U1_10 / n;
  U2_1 = koefUAcc * U2_1 / n;
  U2_10 = koefUAcc * U2_10 / n;

  if (U1_1 > U1_10) {
    Up[Acc1] = U1_1;
    if(digitalRead(izlRel1) == HIGH)
      Rp[Acc1] = Rp1[Acc1];
  } else {
    Up[Acc1] = U1_10;
    if(digitalRead(izlRel1) == HIGH)
      Rp[Acc1] = Rp10[Acc1];
  }
  if (U2_1 > U2_10) {
    Up[Acc2] = U2_1;
    if(digitalRead(izlRel2) == HIGH)
      Rp[Acc2] = Rp1[Acc2];
  } else {
    Up[Acc2] = U2_10;
    if(digitalRead(izlRel2) == HIGH)
      Rp[Acc2] = Rp10[Acc2];
  }

  if (Up[Acc1] < U_ZANEMARENJE)
    Up[Acc1] = 0;
  if (Up[Acc2] < U_ZANEMARENJE)
    Up[Acc2] = 0;

  Ip[Acc1] = (digitalRead(izlRel1) == HIGH) ? Up[Acc1] / Rp[Acc1] : 0;
  Ip[Acc2] = (digitalRead(izlRel2) == HIGH) ? Up[Acc2] / Rp[Acc2] : 0;
}


void KonacniAutomat(byte Acc) {
  //logika konačnog automata za upravljanje procesom i mjerenje veličina

  static float VelicinaSum[2];
  static unsigned long t_KA[2];       //vrijeme prethodnog izlaza iz funkcije
  unsigned long t;

  t = T_ms;
  switch (stanje[Acc]) {
    case CEKANJE_POCETAK:
      SlanjePodatakaSerial(Acc, "CEKANJE");
      t0[Acc] = t;
      stanje[Acc] = CEKANJE_MJERENJE;
      break;
    case CEKANJE_MJERENJE:
      if (Up[Acc] < U_GORNJA_GRANICA)
        stanje[Acc] = CEKANJE_POCETAK;
      else if (t - t0[Acc] >= T_CEKANJE)
        stanje[Acc] = PRAZNJENJE_INICIJALIZACIJA;
      break;
    case PRAZNJENJE_INICIJALIZACIJA:
      SlanjePodatakaSerial(Acc, "PRAZNJENJE-INIT");
      t0[Acc] = t;
      AccNaboj[Acc] = 0;
    case PRAZNJENJE_OPTERECENJE_INIT:
      PostaviRelej(Acc, HIGH);
      t = t1[Acc] = T_ms;
      VelicinaSum[Acc] = 0;
      stanje[Acc] = PRAZNJENJE_OPTERECENJE;
      break;
    case PRAZNJENJE_OPTERECENJE:
      VelicinaSum[Acc] += Ip[Acc] * (t - t_KA[Acc]);     //ovo je u miliampermilisekundama!
      if (t - t1[Acc] > T_OPTERECENJE)
        stanje[Acc] = PRAZNJENJE_PRAZNI_HOD_INIT;
      break;
    case PRAZNJENJE_PRAZNI_HOD_INIT:
      PostaviRelej(Acc, LOW);
      VelicinaSum[Acc] += Ip[Acc] * (t - t_KA[Acc]);
      Ipr[Acc] = VelicinaSum[Acc] / (t - t1[Acc]);
      AccNaboj[Acc] += VelicinaSum[Acc] / 3600000;    //miliampermilisekunde preračunati u mAh!
      VelicinaSum[Acc] = 0;
      t = t1[Acc] = T_ms;
      stanje[Acc] = PRAZNJENJE_PRAZNI_HOD;
      break;
    case PRAZNJENJE_PRAZNI_HOD:
      VelicinaSum[Acc] += Up[Acc] * (t - t_KA[Acc]);
      if (t - t1[Acc] > T_PRAZNI_HOD)
        stanje[Acc] = PRAZNJENJE_PRAZNI_HOD_KRAJ;
      break;
    case PRAZNJENJE_PRAZNI_HOD_KRAJ:
      VelicinaSum[Acc] += Up[Acc] * (t - t_KA[Acc]);
      Upr_h[Acc] = VelicinaSum[Acc] / (t - t1[Acc]);
      Ru[Acc] = Upr_h[Acc] / Ipr[Acc] - Rp[Acc];
      t_pr[Acc] = (t - t0[Acc]) / 1000;
      SlanjePodatakaSerial(Acc, "PRAZNJENJE");
      stanje[Acc] = Upr_h[Acc] >= U_DONJA_GRANICA ? PRAZNJENJE_OPTERECENJE_INIT : PRAZNJENJE_KRAJ;
      break;
    case PRAZNJENJE_KRAJ:
      t_pr[Acc] = (t - t0[Acc]) / 1000;
      SlanjePodatakaSerial(Acc, "GOTOVO");
      stanje[Acc] = STOP_INIT;
      break;
    case STOP_INIT:
      SlanjePodatakaSerial(Acc, "STOP");
      t0[Acc] = t;
      stanje[Acc] = STOP_MJERENJE;
      break;
    case STOP_MJERENJE:
      if (Up[Acc] > U_PRAZNO)
        stanje[Acc] = STOP_INIT;
      else if (t - t0[Acc] > T_CEKANJE)
        stanje[Acc] = CEKANJE_POCETAK;
  }
  t_KA[Acc] = t;
}

void FormatiranjeVremena(char *IzlazniNiz, char *VodeciNiz, unsigned long t) {
  //formatira vrijeme t u sekundama u niz formata HHH:MM i ispisuje ga u niz IzlazniNIz
  int m, h;

  m = t / 60;
  h = m / 60;
  m = m % 60;
  sprintf(IzlazniNiz, "%s%3d:%02d          ", VodeciNiz, h, m);
}

char *DecimalniIspis(float a) {
  //vraća decimalni broj kao niz formatiran na tri decimalna mjesta
  static char buf[10];
  int cijeli, decim;
  
  cijeli = a;
  decim = 1000 * (a - cijeli + 0.0005);
  sprintf(buf, "%d.%d", cijeli, decim);
  return buf;  
}

void SlanjePodatakaSerial(byte Acc, const char *Identifikator) {
  //šalje set podataka serijskom vezom, tako da se na PC mogu pohranjivati i analizirati
  Serial.print(Identifikator);                        //identifikator sloga
  Serial.print(";");
  Serial.print(Acc + 1);                               //oznaka akumulatora
  Serial.print(";");
  Serial.print(t_pr[Acc]);                            //dosadašnje trajanje pražnjenja
  Serial.print(";");
  Serial.print(Upr_h[Acc]);                           //trenutni napon praznog hoda [mV]
  Serial.print(";");
  Serial.print(Ipr[Acc]);                             //trenutna struja pražnjenja [mA]
  Serial.print(";");
  Serial.print(Ru[Acc]);                              //Trenutni unutarnji otpor [Om]
  Serial.print(";");
  Serial.print(Rp[Acc]);                              //Trenutni otpor tereta [Om]
  Serial.print(";");
  Serial.println(AccNaboj[Acc]);                      //trenutno ispražnjenja količina struje [mAh]
}

void OsvjeziPrikaz(byte Acc) {
  //Osvježavanje odgovarajućeg retka na prikazniku
  unsigned long korak, t;
  char ispis[30];

  korak = (T_ms - t_start) / T_PRIKAZ;
  if (stanje[Acc] <= CEKANJE_MJERENJE)
    switch(korak % 2) {
      case 0:
        sprintf(ispis, Up[Acc] > U_PRAZNO && Up[Acc] < U_GORNJA_GRANICA ? "AKUM. NIJE PUN!             " : "CEKANJE NA AKUM.          ");
        break;
      case 1:
        sprintf(ispis, "U_ph=%4d mV          ", (int)Up[Acc]);
        break;
    }
  else if (stanje[Acc] <= PRAZNJENJE_KRAJ) {
    switch (korak % 6) {
      case 0:
        sprintf(ispis, "PRAZNJENJE...          ");
        break;
      case 1:
        FormatiranjeVremena(ispis, "T_pr=", (T_ms - t0[Acc]) / 1000);
        break;
      case 2:
        sprintf(ispis, "U_ph=%4d mV          ", (int)Upr_h[Acc]);
        break;
      case 3:
        sprintf(ispis, "I_pr=%4d mA          ", (int)Ip[Acc]);
        break;
      case 4:
        sprintf(ispis, "R_u=%s Om          ", DecimalniIspis(Ru[Acc]));
        break;
      case 5:
        sprintf(ispis, "Q=%5d mAh          ", (int)AccNaboj[Acc]);
    }
  } else {
    switch (korak % 5) {
      case 0:
        sprintf(ispis, "AKUM. ISPRAZNJEN          ");
        break;
      case 1:
        FormatiranjeVremena(ispis, "T_pr=", t_pr[Acc]);
        break;
      case 2:
        sprintf(ispis, "I_pr=%4d mA          ", (int)(3600 * AccNaboj[Acc] / t_pr[Acc] + 0.5));
        break;
      case 3:
        sprintf(ispis, "R_u=%s Om          ", DecimalniIspis(Ru[Acc]));
        break;
      case 4:
        sprintf(ispis, "Q=%5d mAh          ", (int)AccNaboj[Acc]);
    }
  }
  lcd.setCursor(0, Acc);
  lcd.print(ispis);
}
Prvi dio koda (funkcije IzmjeriNapon i KonacniAutomat) se bave samim mjerenjem, dok ostatak koda služi prikazu podataka na ekranu odnosno slanju serijskom vezom.

Obrada prikupljenih podataka
Prikupljanje, pohranu i analizu podataka koji se šalju serijskom vezom riješio sam u Excelu s VBA skriptama. Tijekom mjerenja se prikazuju trenutačne vrijednosti istih veličina koje pokazuje i uređaj:

slika

Jasno, podrazumijeva se da je svaka akumulatorska jedinica jedinstveno označena kako bi ih se moglo razlikovati. Sva mjerenja se spremaju u pozadinsku bazu podataka i kasnije se mogu pregledavati i uspoređivati:

slika

Biramo iz liste akumulatorsku jedinicu, zatim za izabranu jedinicu jedno od mjerenja, tj. vremena kad je izvršeno mjerenje (možemo imati više različitih mjerenja za istu jedinicu) i dobivamo grafički prikaz kako su se kretali napon praznog hoda, struja pražnjenja i unutarnji otpor tijekom izabranih mjerenja.

Pozdrav!
Zadnja izmjena: marvin.da.sp#2296, dana/u ned stu 24, 2019 11:47 am, ukupno mijenjano 2 puta.
domagoj#5180
Elektroničar
Elektroničar
Postovi: 194
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Zagreb

Re: Mjerač kapaciteta akumulatora

Post Postao/la domagoj#5180 » sub stu 23, 2019 10:34 pm

Samo 4 riječi: ovo stvarno izgleda impresivno. Kako projekt, tako i njegova prezentacija.
Sve pohvale. :clap:
Pozdrav, Domagoj
Avatar
marvin.da.sp#2296
Novak
Novak
Postovi: 4
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Križevci

Re: Mjerač kapaciteta akumulatora

Post Postao/la marvin.da.sp#2296 » ned stu 24, 2019 9:59 am

domagoj#5259 je napisao/la:
sub stu 23, 2019 10:34 pm
Samo 4 riječi: ovo stvarno izgleda impresivno. Kako projekt, tako i njegova prezentacija.
Sve pohvale. :clap:
Pozdrav, Domagoj
Hvala! :D
ivan.fadiga#3322
e-radionica.com team
e-radionica.com team
Postovi: 40
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek

Re: Mjerač kapaciteta akumulatora

Post Postao/la ivan.fadiga#3322 » ned stu 24, 2019 1:47 pm

Projekt je stvarno zanimljiv i odlično odrađen, ali prezentacija na forumu je još bolja( barem meni--svaki dio je objašnjen).
Svaka čast na ovakvom projektu,( kutija je posebno zanimljiva)
LP,
Ivan
Avatar
marvin.da.sp#2296
Novak
Novak
Postovi: 4
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Križevci

Re: Mjerač kapaciteta akumulatora

Post Postao/la marvin.da.sp#2296 » ned stu 24, 2019 2:33 pm

ivan.fadiga#1685 je napisao/la:
ned stu 24, 2019 1:47 pm
Projekt je stvarno zanimljiv i odlično odrađen, ali prezentacija na forumu je još bolja( barem meni--svaki dio je objašnjen).
Svaka čast na ovakvom projektu,( kutija je posebno zanimljiva)
LP,
Ivan
Drago mi je da vam se sviđa.
Avatar
david.zovko#6185
e-radionica.com team
e-radionica.com team
Postovi: 339
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek, Croatia
Kontakt:

Re: Mjerač kapaciteta akumulatora

Post Postao/la david.zovko#6185 » pon stu 25, 2019 10:22 am

Pohvale i od ostatke ekipe e-radionica.com! Volimo projekte sa pravom praktičnom primjenom, a ovaj je i odlično prezentiran.

Prošejrat ćemo i po našim društvenim mrežama :)
Avatar
marvin.da.sp#2296
Novak
Novak
Postovi: 4
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Križevci

Re: Mjerač kapaciteta akumulatora

Post Postao/la marvin.da.sp#2296 » pon stu 25, 2019 3:36 pm

david.zovko#8688 je napisao/la:
pon stu 25, 2019 10:22 am
Pohvale i od ostatke ekipe e-radionica.com! Volimo projekte sa pravom praktičnom primjenom, a ovaj je i odlično prezentiran.

Prošejrat ćemo i po našim društvenim mrežama :)
:D
Odgovorite