ich versuche ein Ampere verbrauch zähler zu erstellen...
hier das sketch:
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?!
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
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??!!?
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 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
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();
}
}