www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

izračun povprečen porabe pri E-avtu

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
malci
Član
Član



Pridružen-a: Sob 15 Sep 2007 21:05
Prispevkov: 792
Aktiv.: 3.92
Kraj: Polhov Gradec

PrispevekObjavljeno: Pon Jan 13, 2020 9:19 pm    Naslov sporočila:  izračun povprečen porabe pri E-avtu Odgovori s citatom

Pozdravljeni!

za svoj e-avto izdelujem ene vrste "board computer" kjer mi bo izpisovalo tudi povrečno porabo, povprečno prabo za zadnji km in povp. porabo za zadnjih 10km.
Zaenkrat sem naredil kot je v spodnji kodi, samo mi je kar požrešno z spominom. Ima kdo idejo, kako to kodo optimizirati?

lp Uroš


Koda:

long distanceMeters=0;         // celotna pot v metrih
float distanceKiloMeters=0;    // celotna pot v km
float SPEED=0;                 // hitrost v kmh
unsigned long previousMillisSpeed = 0;
int RangeKm = 0;               // doseg v km glede na povprečno celotno porabo
int RangeKm1 = 0;              // doseg glede na porabo v zadnjih 1 km
int distance1km=0;
float consumption1km=0;
int RangeKm10 = 0; // doseg glede na porabo v zadnjih 10 km
int distance10km=0;
float consumption10km=0;

int stateDistance[200], stateSOC[200], indState=0;

}

void loop() {
...
...
...
..,
}



void hitrost(){ //  ter razdalje ter koficienti

  .......
  .....
  ....
  distanceMeters=distanceMeters+distance;   // metri so se dodali že prevoženim metrom
  distanceKiloMeters= distanceMeters/1000;  // izračun prevoženih kilometrov

      int timeSpeed=millis() - previousMillisSpeed;   
          previousMillisSpeed=millis();
          SPEED=distance * 3600;                      // najprej se poveča, da ni preveč decimalk med računanjem
          SPEED=SPEED/float(timeSpeed);               //  dobljeno se deli z časom med meritvami

  if (distanceMeters > (indState * 100)){               // vsakih cca 100 metrov se..,
      stateDistance[indState]= distanceMeters;        // zabeleži stanje metrov...
      stateSOC[indState]=(socAh*100);                 // zabeleži stanje SOC
      distance1km=(stateDistance[indState] - stateDistance[indState-10]);   // razdalja1km je trenutan razdalja  - razdalj izpred 10 meritev
      consumption1km=(stateSOC[indState] - stateSOC[indState-10]);          //  poraba je trenutno stanej SOC - stanje SOC izpred 10 meritev

// podbno tudi za izračin povprečaj za 10km
     
        Serial.print(" index:" + String(indState) + " stateDistance:" + String(stateDistance[indState])+ " stateSOC:" + String(stateSOC[indState]));
        Serial.println(" distance1km: " + String(distance1km) + " consumption1km: " + String(consumption1km/100));
     indState++; // poveča index 
   if (indState >199) indState=0;  //če je več kot 100, se začne prepisovati...
  }

_________________
Elektronika za hobi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bostjang
Član
Član



Pridružen-a: Tor 03 Jan 2006 15:29
Prispevkov: 3170
Aktiv.: 14.24
Kraj: Postojna

PrispevekObjavljeno: Tor Jan 14, 2020 1:22 pm    Naslov sporočila:   Odgovori s citatom

Če beležiš razdaljo vsakih 100 metrov, potem te razdalje ni potrebno shraniti za vsako točko. Tako lahko privarčuješ 200 intov.
Če v 100 metrih ne moreš porabiti 2,55 Ah, bi lahko shranjeval razlikov SOC za kar bi uporabil 8 bitno spremenljivko (če je sedaj 16 bitna).

Zakaj pa shranuješ 200 podatkov, ko te pa zanima zadnji 10 km, ki je 100x100 m?
Podatki so shranjeni v krožnem pomnilniku, tega pri izpisu nimaš upoštevanega. indState je pri tebi lahko 0, indState-10 je potem negativen, kar ni OK za indeks!

Pri izpisu ustrezno poračunaš.

PS: Pod SOC se običajno razume relativno napolnjenost (v %). V kodi navedeno je bolj preostali naboj (Remaining Charge).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
malci
Član
Član



Pridružen-a: Sob 15 Sep 2007 21:05
Prispevkov: 792
Aktiv.: 3.92
Kraj: Polhov Gradec

PrispevekObjavljeno: Tor Jan 14, 2020 2:33 pm    Naslov sporočila:   Odgovori s citatom

200 vrednosti za to, ker sem prvotno (in verjetno tudi končno) uporabil povprečje 20km.

Sem pa včeraj opazil, da koda deluje ok samo za prvi cikel, ob resetiranju indexa je pa težava, tudi z negativnim indexom, predvsem pa s

Koda:
if (distanceMeters > (indState * 100)){               // vsakih cca 100 metrov se..,

ker je razdalja vedno večjo kot 10 km.
Se bom pa zvečer "igral" dalje, kako najti drugo varianto.

lp

_________________
Elektronika za hobi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.06

PrispevekObjavljeno: Tor Jan 14, 2020 5:39 pm    Naslov sporočila:   Odgovori s citatom

Napisal bom tako, kakor da zajameš impulz ob vsakem vrtljaju kolesa, pri čemer kolo prevozi fiksno razdaljo enega obsega.
Ob tem se sproži prekinitev in v krožni pomnilnik porabljenCas[index] se shrani Čas med dvema zaporednima meritvama.
Če je ta čas daljši od nekega maksimalnega
if(porabljenCas > porabljenCasMax),
naj postane enak 0 ali 255, hitrost pa je takrat enaka 0.

Indeks je najlažje izvesti z 256 mesti, ko je lahko navadna 8-bitna byte spremenljivka in ni nobenega kompliciranja.
Če je velik 200 mest, se uporabi pomožni indeks, ki je od originalnega manjši za npr. 10, a se mu z if stavkom prišteje 190, če je originalni manjši od 10.
if (original < 10) kopija = original + 190;
else kopija = original - 10;

Ob vsaki prekinitvi se skupnemu času odšteje porabljenČas[kopija], doda pa se mu porabljenČas[original].

Vsota se lahko sešteje samo enkrat.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
malci
Član
Član



Pridružen-a: Sob 15 Sep 2007 21:05
Prispevkov: 792
Aktiv.: 3.92
Kraj: Polhov Gradec

PrispevekObjavljeno: Pon Feb 24, 2020 10:28 pm    Naslov sporočila:   Odgovori s citatom

Ta, zgoraj opisan problem sem nekako zadovoljivo rešil. V realnosti je povprečej 20km prveliko, moram zmanjšati na 5km.

Imam pa drugo težavo, ki bi jo rad izboljšal.

V spodnji kodi ima za trenutno porabo narejeno, da se osvežuje vsakih 100m ( prvi If). Predvidevam, da bi se dalo iz hitrosti (npr Km/h) in toka (A) izračunati tudi Ah/km, a z mojo poklicno matematiko izpred 20 let mi to ne gre. Je to mogoče? Kakšna je enačba?

Koda:
if (flag3){             // true je, če je bilo več kot 389 impulzov - to je 100m
   flag3=false;
     stateSOC[indState]=(socAh*100);  // zabeleži stanje SOC  (*100, da ni decimalk)
       if (indState < 1){
            consumption=(stateSOC[indState] - stateSOC[indState+199]);
          }else{
            consumption=(stateSOC[indState] - stateSOC[indState-1]);
          }               
         
       if (indState < 10){
            consumption1km=(stateSOC[indState] - stateSOC[indState+191]);
          }else{
            consumption1km=(stateSOC[indState] - stateSOC[indState-10]);
          }
       if (indState == 200){
            consumption20km=(stateSOC[indState] - stateSOC[indState -200]);
          }else{
            consumption20km=(stateSOC[indState] - stateSOC[indState+1]);
          }
                indState++; // poveča index 
                if (indState > 200) indState=0;  //če je več kot 100, se začne prepisovati..
             
             Serial.println( "consumption1km:" + String(consumption1km/100) + " consumption20km:" + String(consumption20km/100) + " soc:" + String(soc) + " SocAh:" + String(socAh));         
             Serial.println(" poraba/km: " + String(consumption/10)); // deljeno s 100 da dobim Ah/100m x 10 da so kilometri, kar je isto kot deljeno z 10
          }



lp
Uroš

_________________
Elektronika za hobi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
grega09
Član
Član



Pridružen-a: Pet 24 Okt 2014 11:17
Prispevkov: 392
Aktiv.: 3.40

PrispevekObjavljeno: Pon Feb 24, 2020 11:42 pm    Naslov sporočila:   Odgovori s citatom

A že imaš kaj podatkov kakšna je povprečna poraba nekega tipa avtomobila?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1366
Aktiv.: 7.36
Kraj: Lj.

PrispevekObjavljeno: Tor Feb 25, 2020 9:02 am    Naslov sporočila:   Odgovori s citatom

Za podatek Ah/km bi bil postopek lahko (mogoče je kak drug bolj primeren):
-A -podatek o toku v nekem določenem času
-h -čas merjenja toka in poti (v bistvu periodičen interval, naprimer kak interupt na 1min ali pač kaj poljubnega)
-km -koliko km je bilo prevoženih v časovnem intervalu.

Primer za časovni interval 1min:
Meriš tok na 1s (lahko je tudi povprečen tok v tej 1s) to izvajaš 60x kar ustreza 1min.
Podatek o toku z vsako meritvijo sešteješ:
I = Iread + I
Podatek nato zdeliš z 60 s tem dobiš podatek o povprečnem toku v 1min.

Iz tega lahko izračunaš (cca) Ah: Povprečen tok v 1min pomnožiš z 60 (ker ima h 60 min). S tem si dobil podatek Ah. v tem primeru bi si lahko prišparal deljenje s 60 (ampak to ni tako pomembno).

Da izračunaš Ah na km moraš pa vedt koliko km si prevozil v istem časovnem intervalu. pazi da bo dobljeni podatek v km! In to številko moraš deliti/množiti z Ah.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bostjang
Član
Član



Pridružen-a: Tor 03 Jan 2006 15:29
Prispevkov: 3170
Aktiv.: 14.24
Kraj: Postojna

PrispevekObjavljeno: Sre Feb 26, 2020 9:52 am    Naslov sporočila:   Odgovori s citatom

malci je napisal/a:
Predvidevam, da bi se dalo iz hitrosti (npr Km/h) in toka (A) izračunati tudi Ah/km, a z mojo poklicno matematiko izpred 20 let mi to ne gre. Je to mogoče? Kakšna je enačba?

Samo enote, ki si jih omenil poglej, pa boš videl, da moraš deliti, da boš dobil Ah/km.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
malci
Član
Član



Pridružen-a: Sob 15 Sep 2007 21:05
Prispevkov: 792
Aktiv.: 3.92
Kraj: Polhov Gradec

PrispevekObjavljeno: Sre Feb 26, 2020 11:31 am    Naslov sporočila:   Odgovori s citatom

Brick wall .

Hvala Boštjan, da si mi odprl oči.Saj se mi je zdelo, da se da, ker ni bilo nobene nove enote, a sem kompliciral okrog in okrog


lp

_________________
Elektronika za hobi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 66 dni


Powered by phpBB © 2001, 2005 phpBB Group