Forum: Compiler & IDEs Strommessung mit Arduino UNO


von Patrick Q. (patrickqu)


Lesenswert?

Hallo Community!

Ich arbeite gerade daran, eine Strommessung mit Hilfe des Arduino UNO zu 
realisieren. Da ich aber relativ wenig Ahnung von Programmieren habe, 
hätte ich einige Fragen dazu.
Ziel ist es mit Hilfe des ACS714 Breakout Board den Strom zu messen. Ich 
habe im Internet dazu Informationen gesucht und bin da auf einen Code 
gestossen, welcher mir dazu am geeignetsten scheint.

CODE:
1
#include "floatToString.h" 
2
3
int sensorPinStrom = A0; 
4
int sensorPinSpannung = A1; 
5
int sensorValue = 0; 
6
float messw=0; //****Programm****** 
7
8
void setup() { //Serielle Schnitstelle für Ausgabe öffnen 
9
10
Serial.begin(9600); 
11
Serial.println("Get Strom & Spannung"); } 
12
13
void loop() { //******STROM***** 
14
15
sensorValue = analogRead(sensorPinStrom); //Hole Wert //510=0A 
16
sensorValue = sensorValue -510;//510=0A 0=-75A 1023=75A //springen um 0 reduzieren 
17
18
if(sensorValue==1)
19
20
sensorValue=0; 
21
22
if(sensorValue==-1)
23
24
sensorValue=0; //Umwandeln um einen Wert zuwischen -75 und +75 zu erhalten 
25
26
messw=(float)75/512*sensorValue; //über Serielle Schnitstelle ausgeben 
27
28
Serial.print(floatToString(buffer,messw,2)); 
29
Serial.print("A"); 
30
Serial.print("\t");

So das hier ist der besagte Code, jedoch bin ich mir nicht sicher, wie 
kompatibel der mit meinem ACS714 ist, da er für das ACS709 ausgelegt 
ist.
Auch "verstehe ich einige Abschnitte des Codes nicht so ganz oder weiß 
nicht was in denen gemacht wird.
1
sensorValue = analogRead(sensorPinStrom); //Hole Wert //510=0A 
2
sensorValue = sensorValue -510;//510=0A 0=-75A 1023=75A //springen um 0 reduzieren
Hier in diesem Abschnitt wird, wenn ich das richtig interpretiere, die 
Varialbe "sensoValue" mit dem Wert von "sensorPinStrom" gleichgesetzt. 
Kann sein das ich mich irre, wie gesagt, ich habe nahezu keine Ahnung 
von Programmieren.
Aber was genau der Sinn und Zweck der Zweiten Zeile bzw. was dort 
überhaupt passiert versteh ich ehrlich gesagt nicht. Deshalb hätte ich 
dazu, falls möglich gerne eine "anfängertaugliche" Erklärung.
1
if(sensorValue==1)
2
3
sensorValue=0; 
4
5
if(sensorValue==-1)
6
7
sensorValue=0; //Umwandeln um einen Wert zuwischen -75 und +75 zu erhalten 
8
9
messw=(float)75/512*sensorValue; //über Serielle Schnitstelle ausgeben
Auch hier versteh ich nicht ganz, wozu die if-Schleifen hier sind. Was 
is der Sinn dahinter, dass die Variable "sensorValue" hier beide Male 
auf 0 gesetzt wird?

Und die Berechnung des "messw" versteh ich leider auch nichtt gant, 
woher die Werte 75 und 512 kommen.

Ehrlich gesagt hab ich sehr wenig Ahnung von dem Code, deshalb bin ich 
über jede Hilfe sehr froh und entschuldige mich an dieser Stelle für 
meine möglicherweise dummen Fragen, jedoch wäre es wirklich von großer 
Wichtigkeit wenn mir hier jemand helfen könnte.

MFG

patrickqu

: Bearbeitet durch User
von Uwe (de0508)


Lesenswert?

Hallo Patrik,

mit kopierten Code, den man nicht versteht kommst Du nicht weiter!

Erst einmal schaut man in's Datenblatt des ACS714 bei 
www.allegromicro.com.

Dann identifiziert man die genaue Chipbezeichnung:

Seite 2, 1. Abbildung.

ACS714ELCTR-05B-T
ACS714ELCTR-20A-T
ACS714ELCTR-30A-T
usw.

Mit diesen Konstanten: Optimized Range und Sensitivity, kann man dann 
ein einfaches Programm anfangen selbst zu schreiben !

von Karl H. (kbuchegg)


Lesenswert?

Patrick Quehenberger schrieb:

> Hier in diesem Abschnitt wird, wenn ich das richtig interpretiere, die
> Varialbe "sensoValue" mit dem Wert von "sensorPinStrom" gleichgesetzt.
> Kann sein das ich mich irre, wie gesagt, ich habe nahezu keine Ahnung
> von Programmieren.

Warum musst du dann ein Programm schreiben?

> Aber was genau der Sinn und Zweck der Zweiten Zeile bzw. was dort
> überhaupt passiert versteh ich ehrlich gesagt nicht.

Weißt du, was eine Variable ist?
Wenn nein, dann such dir ein Einsteigertutorial! So hat das keinen Sinn, 
wenn man bei Adam und Eva anfangen muss, dir die Dinge zu erklären.


> Auch hier versteh ich nicht ganz, wozu die if-Schleifen hier sind.

Es gibt keine if- Schleifen
Eine Schleife ist per Definition ein Konstrukt, in dem irgendwelcher 
Code wiederholt wird (und sei es nur möglicherweise wiederholt). In eine 
if-Abfrage wird aber nichts wiederholt. Ein if realisiert die Abfrage 
einer Bedingung und abhägig davon die Auswahl von (maximal) 2 
verschiedenen Code Pfaden. Abhängig von der Bedingung: entweder etwas 
passiert, oder etwas anders passiert (oder nichts passiert).
Wiederholt wird da genau gar nichts - daher ist das auch keine Schleife.

> Was
> is der Sinn dahinter, dass die Variable "sensorValue" hier beide Male
> auf 0 gesetzt wird?

rechne zurück bzw. verfolg den Code zurück: wie und wo bekommt 
sensorValue seinen Wert. Wenn also an dieser Stelle im Code der Wert +1 
bzw. -1 speziell behandelt wird, was bedeutet das dann an der Stelle, an 
der der Wert ursprünglich entstanden ist?

> Und die Berechnung des "messw" versteh ich leider auch nichtt gant,
> woher die Werte 75 und 512 kommen.

Eine derartige Berechnung

    y = a / b * x

schreit förmlich danach, dass es sich um die Implementierung eines 
3-Satzes handelt.
1
   512 Äpfel    kosten    75 Euro
2
     x Äpfel    kosten    wieviele Euro
3
  -----------------------------------------
4
                       x * 75
5
    wieviele Euro = ------------
6
                         512


> meine möglicherweise dummen Fragen, jedoch wäre es wirklich von großer
> Wichtigkeit wenn mir hier jemand helfen könnte.

Nope. Es hilft nichts. Du wirst die Dinge von der Pieke auf lernen 
müssen. Wenn es von großer Wichtigkeit ist, dass du deine 
Schlafzimmereinrichtung in Eiche massiv selber bauen kannst, dann wirst 
du nicht umhin kommen, zumindest die Grundbegriffe der Tischlerei zu 
erlernen und etwas praktische Erfahrung zu sammeln. Entweder das oder du 
bezahlst einen Tischler, der ein paar Jahre seines Lebens dafür geopfert 
hat, das zu lernen, was dir fehlt.
Hier ist das nicht anders. Woher kommt nur immer diese Idee, man könne 
programmieren in einem halben Nachmittag lernen und das auch nur, wenn 
das Wetter nicht danach ist, an den See zu fahren.


Hinweis: von analogRead bekommst du einen Wert, der dir das Verhältnis 
der am Pin anliegenden Spannung in Relation zur Referenzspannung (beim 
Arduino wohl 5V) angibt. Im Prinzip also ein Prozentwert, nur das der 
Wertebereich nich 0 bis 100% ist, sondern 0 bis 1023. Das sind 1024 
Werte. Und 512 ist genau die Hälfte von 1024. Hmmmmmm

Und die 75. Schon mal ins Datenblatt vom ACS709 geschaut und ganz 
einfach mal gesucht, wo da 75 vorkommen?

Und dann die 4 Zutaten zusammenbringen:
* der Wert vom ADC ist im Bereich 0 bis 1023
* davon werden 510 abgezogen (was für sich alleine interessant ist, da 
müsste man die benutzte Schaltung ausmessen warum das 510 und nicht 512 
sind)
* der Messbereich das ACS ...
* .... und warum dieser zum Abzug der 510 (512?) führt
* und der Dreisatz, mit dem offenbar ein Wert in einen anderen Wert 
umgerechnet wird.

: Bearbeitet durch User
von Jürgen S. (jurs)


Lesenswert?

Patrick Quehenberger schrieb:
> Auch "verstehe ich einige Abschnitte des Codes nicht so ganz oder weiß
> nicht was in denen gemacht wird.
>
1
> sensorValue = analogRead(sensorPinStrom); //Hole Wert //510=0A
2
> sensorValue = sensorValue -510;//510=0A 0=-75A 1023=75A //springen um 0 
3
> reduzieren
4
>
> Hier in diesem Abschnitt wird, wenn ich das richtig interpretiere, die
> Varialbe "sensoValue" mit dem Wert von "sensorPinStrom" gleichgesetzt.

Falsch.

Der Arduino macht per "analogRead" eine ADC-Messung am Pin mit der 
Nummer "sensorPinStrom", und das Ergebnis der Messung wird an die 
Variable "sensoValue" zugewiesen.

> Kann sein das ich mich irre, wie gesagt, ich habe nahezu keine Ahnung
> von Programmieren.
> Aber was genau der Sinn und Zweck der Zweiten Zeile bzw. was dort
> überhaupt passiert versteh ich ehrlich gesagt nicht. Deshalb hätte ich
> dazu, falls möglich gerne eine "anfängertaugliche" Erklärung.

Dein Sensor ist ein Stromsensor, der Wechselstrom messen kann, also 
Strom, der entweder in die eine Richtung fließt. Oder in die andere 
Richtung. Die eine der beiden Stromrichtungen bekommt dabei 
überlicherweise ein Minuszeichen, die andere ein Pluszeichen. Wenn Dein 
Sensor also einen Meßbereich von -75A bis +75A hat, dann bedeutet das, 
dass der Strom mit 75A in die eine oder in die andere Richtung fließen 
kann.

Per "analogRead" kannst Du am Arduino aber nur Werte messen, die 
zwischen 0 und 1023 liegen, es handelt sich um 10-Bit ADC Messungen. Der 
Sensor ist nun so konstruiert, dass sein Nullpunkt in der Mitte liegt, 
also z.B. "Null Strom" bedeutet ADC-Messwert 511 (oder 510 oder 512, die 
Sensoren rauschen immer ein bisschen, genau wie die Messwerte).

Die Zeile:
sensorValue = sensorValue -510;
zieht nun vom Messwert 510 ab, so dass die Variable nun nicht mehr von 
0..1023 geht wie bei der Messung, sondern von -510..513. Dadurch wurde 
der Offset der Messung verschoben, und nun bedeuten:
- negative Werte: Strom in die eine Richtung
- Nullwert: Kein Strom fließt
- positive Werte: Strom in die andere Richtung

>
1
> if(sensorValue==1) sensorValue=0;
2
> if(sensorValue==-1)sensorValue=0;
3
>
Damit wird der "Nullpunkt breitgeklopft".
D.h. ein Messwert von -1 wird zu 0 Strom und ein Messwert von +1 
ebenfalls.

Ob es eine gute Idee ist, "kleine Messwerte zu Nullwerten" zu machen, 
hängt vom Anwendungsfall ab. Und ob der Nullpunkt des Sensors wirklich 
bei 510 liegt und nicht vielleicht doch bei 511 oder 512, würde ich 
lieber mal überprüfen, bevor ich mich auf die Werte verlasse.

Im übrigen wirst Du auch als Arduino-Programmierer nicht umhin kommen, 
ein wenig Programmieren in C/C++ zu lernen.

Und auch Datenblätter von Sensoren wirst Du lesen lernen müssen, wenn Du 
die Sensoren in einem Programm verwenden möchtest.

Google Suchebegriffe: acs714 datasheet

von Patrick Q. (patrickqu)


Lesenswert?

Danke schonmal an alle.

Ja klar muss ich mich damit jetzt beschäftigen und werde das jetzt auch 
tun, aber eure Antoworten haben mir auf jeden Fall schonmal 
weitergeholfen und auch großes Dankeschön, dass es so schnell ging.

MFG

Patrick

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.