Frage zu Strommessung

Hallo Experten
Könnte bitte mal jemand über diesen Sketch schauen?
Mich würde besonders interessieren ob die if abfrage so funktionieren kann.
Ich bekomme -0,00 angezeigt und das sollte eigentlich nicht sein.
Die Anzeige sollte bei +-10mA 0,00 anzeigen.
Ansonsten funktioniert alles.
Der Sensor ist ein ACS712-5A

int strom = A0;

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

void loop() {
  float average = 0;
  for (int i = 0; i < 1000; i++) {
    average = average + (.0264 * analogRead(A0) - 13.51) / 1000; 
    if (average == 0.01)average = 0.00;
    if (average == -0.01)average = 0.00;

    delay(1);
  }
  Serial.println(average);
}

Bin Anfänger und habe leider noch so meine Probleme :frowning:

Du wirst doch wohl nicht nur die beiden Werte messen und das auch noch exakt.

Vergleiche mit == auf float gehen meistens schief.
Du willst doch wohl eher sagen:

if (average  <= 0.1 && average >= -0.1) average =0.0;

Warum auch immer.

Gruß Tommy

Hallo,

ich weiß jetzt nicht wo die diversen Faktoren (0.0264 und 13.15) herkommen.
Aber wenn du eine Durchschnitt über x Messungen machen willst müsste es meiner Meinung nach so aussehen:

void loop() {
  float average = 0;
  for (int i = 0; i < 1000; i++) {
    average = average + (.0264 * analogRead(A0) - 13.51) ;    // erst mal 1000 Messuneg
}

    average = average / 1000;                                                // erst hier den Mittelwert bilden

    if (average == 0.01)average = 0.00;
    if (average == -0.01)average = 0.00;

Hallo Tommy
Danke
wenn ich das so schreibe habe ich eine Anzeige von 0.00 sowie es sein sollte.
Leider geht dann aber keine Strommessung mehr. Habe 500mA fließen lassen aber die Anzeige bleibt bei 0.00

@uk1408
Funktioniert leider auch nicht Anzeige bleibt auch bei 0.00

Bei meiner Version geht die Anzeige wenn Strom fließt aber die 0.00 funktioniert nicht.
Hintergrund ist, ich bekomme ohne die +-10mA die Anzeige nicht auf 0

Dann liegt der Fehler woanders.

Lies doch einfach erst mal analogRead ein und gib den Wert auf Serial aus.
Damit erst mal klar ist, dass überhaupt was gemessen wird.

1000 Messungen für einen Mittelwert halte ich auch für etwas sehr viel.

Schritt für Schritt vorwärts tasten, damit Du immer auf funktionierenden Stücken aufbauen kannst.

Gruß Tommy

Es funktioniert ja.
Auch die gemessenen 500mA stimmen mit meinem Messgerät etwa überein.
Es funktioniert aber nicht mehr wenn ich die Zeile Code von dir einfüge.
Noch mal wie ich es jetzt habe:

int strom = A0;

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

void loop() {
  float average = 0;
  for (int i = 0; i < 1000; i++) {
    average = average + (.0264 * analogRead(A0) - 13.51)/ 1000; 
    if (average  <= 0.01 && average >= -0.01) average =0.00;
  
    delay(1);
  }
  Serial.println(average);
}

Habe gerade noch mal gemessen. Wenn kein Strom fließt habe ich an A0 2,498V wenn ich 500mA fließen lasse habe ich 2,588V an A0 aber im SerialMonitor bekomme ich 0.00 angezeigt.

Ich weiß nicht, was Dein Code bewirken soll. Ich habe nur die beiden if sinnvoll zusammen gefasst.
Wenn das nicht geht, ist der restliche Ansatz evtl. schon falsch.
Bau die Schleife doch mal um:

int mess;
for (...) {
  mess = analogRead(A0);
  Serial.print("average alt: ") Serial.println(average);
  Serial.print("Messwert:    ") Serial.println(mess);
  average = average + (.0264 * analogRead(A0) - 13.51)/ 1000; 
  Serial.print("average neu: ") Serial.println(average);
  if (average  <= 0.01 && average >= -0.01) average =0.00;
  Serial.print("average korr: ") Serial.println(average);
  delay(1000);
}

Das Delay(1000) ist nur zum Mitlesen. Delay(1) bringt hier überhaupt nichts.

Ich habe Den Eindruck, dass Deine Formel nicht ok ist.

(0,264 * 1023 -13.51) wenn wir mal vom Maximum ausgehen ergibt -7.438 und das / 1000 ist immer-0,007438.
Das wie gesagt, beim Maximalwert von Analogread von 1023.

Da ist ein Denkfehler bei Dir drin.

Gruß Tommy

Nochmals hallo,

ich habe so was mit 25 Messungen für den Mittelwert, passt recht gut. Ich finde auch den 0-Wert recht stabil.
Mit der Abfrage
if (average <= 0.01 && average >= -0.01) average =0.00;
möchtest du wohl den 0-Wert stabil halten. Wenn ich das aber richtig sehe hast du mit <= 0.01 alles unter 0.01 unterdrückt, also auch - 1 oder -2 usw.
Und mit >= -0.01 (größer -0.01) geht es auch nicht, da ist ja praktisch alles positive drin. Irgendwie schließt sich da was aus.
Da müsstest nochmals ansetzen.

Evtl. mal probieren (ich habe es nicht getestet):

if (average<= 0.01) // alles kleine
{
{Serial.print(average)
}
elseif (average>= 0.01) // alles größere
{
{Serial.print(average)
}

@uk1408: Du solltest Dir mal den Sinn von && anschauen.

Gruß Tommy

Ich Danke Euch beiden erst mal.
Muss jetzt leider ins Bett da 04.00 Uhr der Wecker klingelt!
Melde mich morgen wieder.
Den Code und die Formel stammen von hier:
Link
Am Rest habe ich mich versucht.

Die Formel in Deinerm Sketch oder die Schaltungsumsetzung muss fehlerhaft sein, da der Maximalwert unterhalb der Messschwelle liegt.

Ich habe gerade Deinen Link angeschaut. Die dort angegebene (und bei Dir übernommene) Arduinoformel ist falsch. Das /1000 darf erst gemacht werden, nachdem 1000 Messwerte aufaddiert wurden und nicht schon bei jedem einzelnen Messwerrt.

Nimm den aktuellen Wert nach der dort angegebenen Formel als
messwert = 0,026 * analogRead(A0) - 13.51;

Und dann schau, was Du damit machen willst. Addiere 10 Werte auf, teile die Summe durch 10, um eijen Mittelwert zu haben oder so was.

Der Arduinocode auf dieser Seite ist ungünstig, weil er in den kleinen Werten operiert und damit die Ungenauigkeiten steigert.

In diesem Code kannst Du keine Werte ausblenden, da dann immer 0 raus kommt, höchstens nach den 1000 Werten.
Mein If kannst Du also höchstens nach der Schleife anwenden.

Es gibt aber sinnvollere Mittelwertbildungen.

Gruß Tommy

so geht es:

int strom = A0;

void setup() {
  pinMode(strom, INPUT);
  Serial.begin(9600);
}
void loop()
{
  float average = 0;
  for (int i = 0; i < 100; i++)                                                // 100 Messungen reichen
  {
    average = average + (.0264 * analogRead(A0) - 13.51); 
    delay(2);                                                                         // wegen A/D Wandlung
  }
  average = average / 100;                                     
          // Mittelwert rechnen
  if (average  <= 0.01 && average >= -0.01) average = 0.0;  // 0.01 sind wohl 10 mA ?

  Serial.println(average,3);                                                   // 3 Stellen nach dem Komma
}

Gute Nacht .....

Ja, so würde es gehen.

Gruß Tommy

... und noch was: Wegen der Genauigkeit solltest du mal die 5 V Spannung am Arduino (5 V-Pin am Board) nachmessen. Wenn die abweicht solltest du die Faktoren bei der Stromberechnung anpassen. Und wenn du den Arduino über USB mit Strom versorgt ist das auch nicht allzu genau. Dann eher mal ein externes Netzteil mit max. 12 V verwenden.
Ich habe einige ACS 712 mit 5A und 20A und einen ACS 758 für 200A hier am laufen und die sind recht genau und die Werte sind reproduzierbar.
Allerdings ist die Anzeige mit 3 Nachkommastellen am Ende meines letzten Beitrages nur damit man sieht wie alles reagiert, je nachdem was du tatsächlich messen willst solltest da im echten Betrieb weniger nehmen.

Hallo

Es funktioniert. Allerdings ist die Schaltung sehr anfällig. Habe die Schaltung auf dem Steckbrett aufgebaut.
Wenn ich mal ein Kabel berühre ist mein Null-Punkt weg. Das heißt ich bekomme immer mal einen Ausreiser mit rein oder einen Wert von z. B. 0,066 angezeigt. Ich habe jetzt einen 100K Widerstand von A0 nach Gnd eingefügt und jetzt scheint es zu funktionieren? Einen Defekt am Sensor schließe ich mal aus da mit dem Messgerät ein konstanter Wert angezeigt wird.
Nochmals Danke

Prima....
Der 100k Widerstand dürfte eigentlich nichts machen, A0 ist ja nicht offen sondern mit dem Sensor verbunden.
Evtl. liegt es am Steckbrett, da sind die Kontakte nicht immer 100% sicher und ich hatte da auch immer wieder Probleme.
Als alles sauber gelötet und mit richtigen Steckverbindern versehen war es stabil. Wie ist die Stromversorgung ? USB oder Netzteil? Gibt es Störimpulse "von außen" ? Was sind die 0,066 in Bezug auf den Vollausschlag, ist das im Rahmen der Toleranz ?

Der 100k Widerstand dürfte eigentlich nichts machen

Ja da hatte ich mich täuschen lassen. Die Anzeige lief korrekt und dann hat mein angeschlossenes Messgerät
"Auto" abgeschalten und die Anzeige wurde Nervös. Dann habe ich den 100k Widerstand eingebaut und es war wieder i.O. Bei einigen Tests, hat sich heute aber gezeigt des es wohl, wie du sagtest, am Steckbrett liegt.
Meine Stromversorgung ist:
USB, 9Volt Steckernetzteil und Separate einstellbare 5,00V für Sensor.
Die 0,066 war nur eine "Hausnummer" die ich angezeigt bekommen habe.

Welche "Sorte" Strom soll der ACS712-5A eigentlich messen?? AC oder DC??
Ich glaube hier geht jeder von DC aus.

Bei AC liefert der ACS712 auch eine AC Ausgangsspannung mit einem Offset von 2,5V DC.
Da kann man dann Mittelwerte bilden wie ein Weltmeister. Wenn der zu messende Strom ein sauberer Sinus ist, dann ist auch der Mittelwert am Ausgang immer 2,5V.

Gruß Peter

Hallo
Jetzt passt es recht gut! Habe die Anschlüsse am ACS712 nachgelötet, da diese nicht sehr schön waren.
Keine Ahnung ob es daran gelegen hat? Auf alle Fälle geht es jetzt.
@peter_de
Es soll DC in beide Richtungen gemessen werden. (Zur Kontrolle meiner Solarbatterie.)

Jetzt habe ich nur noch einen Schönheitsfehler auf der LCD-Anzeige.
Ich versuche es mal zu erklären.
Die Anzeige sieht nach dem Einschalten wenn kein Strom fließt so aus:
lcd.print(average, 2);
0,00
-0,30 //wenn 300mA fließen
0,000 //wenn ich den Verbraucher abschalte
Also bei der Anzeige bleiben nachdem ich im Minus-Bereich war drei Nachkomma Stellen.
Lässt sich das ändern?

Im einfachsten Fall immer ein Blank (Leerzeichen) nach der Zahl ausgeben, wenn Du Platz hast.

Gruß Tommy