Go Down

Topic: Wert aus if in else übertragen (Read 886 times) previous topic - next topic

DraycD

Oct 23, 2012, 12:40 am Last Edit: Oct 23, 2012, 12:59 am by uwefed Reason: 1
hihi,

ich versuche ein Ampere verbrauch zähler zu erstellen...

hier das sketch:
Code: [Select]

int GesamtErgebnis = 0;
int GesamtZahl = 0;
int AmpereStunde = 0;
int AmpereMinute = 0;
int AmpereZahl = 0;
int MessPin1 = 13;
int Sek = 0;
int Ergebnis = 0;
int Messung = 0;
//int test =0;

void setup () {
Serial.begin (9600);
}

void loop () {
Serial.println (AmpereStunde);
Serial.println (AmpereMinute);
//Serial.println (test);
//Serial.println (Messung);
if (Sek <=60)
  {
    Sek = Sek + 1;
    Messung = analogRead (MessPin1);
    AmpereMinute = AmpereMinute + Messung;
           //test = AmpereMinute / Sek;
    delay (1000);
  }
  else
  {
    AmpereMinute = Ergebnis / 60;
    AmpereZahl = AmpereZahl + 1;
    AmpereStunde = (AmpereStunde + AmpereMinute) / AmpereZahl;
    GesamtZahl = GesamtZahl + 1;
    int zE = 0;
    zE = AmpereStunde / GesamtZahl;
    GesamtErgebnis = GesamtErgebnis + zE;
    Sek = 0;
    Ergebnis = 0;
  }
}


das problem ist das wenn Sek auf 60 an kommt und der else befehl ausgefürt wird, löscht es alle werte...
was mach ich falsch?
dachte das oben die variablen global sind... ich versteh das net.. hilfe?!
2 X Mega2560
1 X LCD Shield 2x16
1 X Ethernet Shield
+ Keinen Plan

uwefed

Ganz einfach:
Du rechnest mit der Variablen "Ergebnis" aber diese Variable ist immer null weil sie nie mit einem anderen Wert geladen wird.

Ich verstehe auch nicht wieso Du diese Division machst.
Code: [Select]

AmpereStunde = (AmpereStunde + AmpereMinute) / AmpereZahl;


Grüße Uwe


DraycD

Was is dan richtig? Steh grad voll auf dem schlauch..

Edit:
Oohhhhh bin ich dumm..... (Und blind) danke ;)
2 X Mega2560
1 X LCD Shield 2x16
1 X Ethernet Shield
+ Keinen Plan

uwefed

#3
Oct 23, 2012, 01:12 am Last Edit: Oct 23, 2012, 03:28 am by uwefed Reason: 1
Manchmal nutzt eine Pause um ein "unsichtbares" Problem zu sehen.
Wenn man bei einem Problem stecken bleibt ist es besser aufzuhören und am nächsten Tag weiterzumachen. Meist findet man dann den Fehler sofort.
Grüße Uwe

DraycD

#4
Oct 23, 2012, 01:21 am Last Edit: Oct 23, 2012, 02:08 am by DraycD Reason: 1
Danke dir =)

sketch jetzt...

Code: [Select]
int GesamtErgebnis = 0;
int GesamtZahl = 0;
int AmpereStunde = 0;
int AmpereMinute = 0;
int AmpereZahl = 0;
int MessPin1 = 13;
int Sek = 0;
int Messung = 0;
//int test =0;


void setup () {
Serial.begin (9600);
}


void loop () {
Serial.print ("Verbrauch Gesamt:" );  
Serial.println (AmpereStunde);
//Serial.print ("Verbrauch Gesamt:" );
//Serial.println (AmpereMinute);
Serial.print ("Sekunden:" );
Serial.println (Sek);
//Serial.println (Messung);
if (Sek <=60){
Sek = Sek + 1;
Messung = analogRead (MessPin1);
AmpereMinute = AmpereMinute + Messung;
delay (1000);
}



else {
AmpereMinute = AmpereMinute / 60;
AmpereZahl = AmpereZahl + 1;
AmpereStunde = (AmpereStunde + AmpereMinute) / AmpereZahl;

GesamtZahl = GesamtZahl + 1;



int zE = 0;
zE = AmpereStunde / GesamtZahl;
GesamtErgebnis = GesamtErgebnis + zE;



Sek = 0;
AmpereMinute = 0;
}

}


Edit:
Denk ich zu kompliziert?

Geht das auch?:
Pin13 liest jede sekunde einen messwert...
Jeder wert wird duch 3600 geteilt (60x60), das ergebnis daraus wird immer wieder addiert?!
So erhalte ich doch Ah oder? Oder denk ich jetzt zu leicht??!!?
2 X Mega2560
1 X LCD Shield 2x16
1 X Ethernet Shield
+ Keinen Plan

uwefed

Wenn Du eine int-Zahl durch etwas teilst gibt es keine Kommastellen sondern nur ganze Zahlen.
Rechne intern mit Amperesekunden und einer Variablen vom Typ unsigned long. und wandle diese nur für die Darstellung in Ah um.
also einfach jede Sekunde
Ampersekunde += analogRead (MessPin1);

Du mußt auch die Umrechnung machen um vom gelesenen Wert am Analogeingang die Ampere zu erhalten. Das kannst Du besser bei der Darstellung machen und nicht bei der Messung.

also:
Code: [Select]

unsigned long Amperesekunde =0;
int sek =0;
...
void loop () {
Amperesekunde += analogRead (MessPin1);
sek++;
delay (1000);

AmpereStunde=Amperesekunde/Umrechnungfaktor/3600
Serial.print ("Verbrauch Gesamt:" ); 
Serial.println (AmpereStunde);
Serial.print ("Sekunden:" );
Serial.println (Sek);
}


Grüße Uwe

volvodani

Also Uwe  :~  Du lässt in einem Programm delay drin?
Ich denke man sollte das lesen des Analogwertes es in eine "Blink without delay" Funktion kapseln. Damit der Controller nicht Zeit mit warten verbringt. Er will bestimmt später auch noch andere Sachen machen.
Ich würde den Analogread jede Sekunde 1mal ausführen lassen und die Display aktualisierung evtl alle 250ms. So kannst du noch andere Sachen erweitern ohne das das Programm immer 1 sekunde wartet
Code: [Select]

unsigned long lmillis1;
unsigned long lmillis2;
unsigned long akmillis;
int inter1=1000;
int inter2=250;
unsigned long Amperesekunde =0;
int sek =0;
long AmpereStunde=0;
Umrechnungfaktor=1000;
#define MessPin1 1


void setup(){
pinMode(MessPin1,INPUT);
Serial.begin(9600);
}

void loop () {
  akmillis=millis();
  if (akmillis-lmillis1>=inter1){                  // Hier läuft er nur 1mal in der Sekunde rein
    Amperesekunde += analogRead (MessPin1);
    sek++;
    lmillis1=millis();
  }

if (akmillis-lmillis2>=inter2){                 // Hier läuft er nur 4mal in der Sekunde rein
  AmpereStunde=Amperesekunde/Umrechnungfaktor/3600;
  Serial.print ("Verbrauch Gesamt:" ); 
  Serial.println (AmpereStunde);
  Serial.print ("Sekunden:" );
  Serial.println (sek);
  lmillis2=millis();
}
}

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Go Up