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
intsensorPinStrom=A0;
4
intsensorPinSpannung=A1;
5
intsensorValue=0;
6
floatmessw=0;//****Programm******
7
8
voidsetup(){//Serielle Schnitstelle für Ausgabe öffnen
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.
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
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
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 !
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.
>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
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