Impressum DatenschutzerklärungDiese Seite per HTTPS ansehen.


Strom und Spannung mit Arduino UNO messen geschrieben am 19.11.2011

Um den Ertrag einer Solaranlage mitzuloggen habe ich hier mal eine Beispielschaltung mit einem Arduino Uno und dem Stromsensor ACS709 entworfen:

Arduino Uno und dem Stromsensor ACS709

Hardware

Die Gleichspannung wir über eine Spannungssteiler (im Bild rot) mit Hilfe von zwei Widerstände (390OHM, 100OHM) gemessen. Bei dieser gibt dann eine Spannnug von 0 bis 5V aus die am Port A1 gemessen wird.

Schaltplan Strom und Spannung messen
Der Strom wird mit dem Stromsensor ACS709 (im Bild grün) an Port A0 gemessen.

Im Serial-Monitor sieht es dann so aus:

Hier habe ich mein Notebook angeschlossen. Der 75A-Sendsor ist etwas hoch gegriffen (Auflösung 0.19A pro Bit) - da gibt es im Niedrigen Bereich kaum genaue Werte. Deshalb werde ich den gegen einem 5A-Sensor (ACS714 Auflösung 0.009A pro Bit) austauschen. Mehr als 5A kommt im späteren System eh nicht zum Einsatz, der ACS709 landet dann erst mal in der Bastelkiste.

Quellcode

#include "floatToString.h" int sensorPinStrom = A0; int sensorPinSpannung = A1; int sensorValue = 0; float messw=0; //****Programm****** void setup() { //Serielle Schnitstelle für Ausgabe öffnen Serial.begin(9600); Serial.println("Get Strom & Spannung"); } void loop() { //******STROM***** sensorValue = analogRead(sensorPinStrom); //Hole Wert //510=0A sensorValue = sensorValue -510;//510=0A 0=-75A 1023=75A //springen um 0 reduzieren if(sensorValue==1)sensorValue=0; if(sensorValue==-1)sensorValue=0; //Umwandeln um einen Wert zuwischen -75 und +75 zu erhalten messw=(float)75/512*sensorValue; //über Serielle Schnitstelle ausgeben Serial.print(floatToString(buffer,messw,2)); Serial.print("A"); Serial.print("\t"); //******SPANNUNG***** sensorValue = analogRead(sensorPinSpannung); //Hole Wert //Wert umwandeln für Anzeige 0..24.0 Volt messw=(float)24/1023*sensorValue; //über Serielle Schnitstelle ausgeben Serial.print(floatToString(buffer,messw,2)); Serial.println("V"); //\n delay(1000); //1 -Sekunde warten }

für die Formatierung des String habe ich die floatToString Funktion von Tim Hirzel benutzt.

Diese musste im Header aber noch etwas angepasst werden:

#include <stdio.h> #include <stdlib.h> char buffer[25]; // floatToString.h

Im Web/downloads

Das Projekt kann unter fritzing.org/projects/strom-und-spannung-messen geladen werden.

oder auch hier gibt es den download:
FrizingFiles.zip 39.52kb (Frizing Projekt- und Bauteildatei)
quellcode.zip 1.82kb (Quellcode inkl. floatToString.h)

Kommentare:


#1 Thomas schrieb am 17.03.2013 um 15:22
Das stimmt so nicht ganz:
sensorValue = sensorValue -510;//510=0A 0=-75A 1023=75A

Der Regelbereich liegt zwischen 0,5 und 4,5V. Zumindest ist das bei meinem -30 bis 30A Sensor so.
Ich habe folgende Lösung gewählt, die mit meinem Messgerät auf ein zehntel Ampere übereinstimmt:

int mess2 = analogRead(1);
float Strom = map(mess2, 102, 921, -300, 300)/10.00;

0,5V entspricht 102 und 4,5V 921, das ganze wird dann umgerechnet in zehntelampere und dann wieder durch 10 geteilt.

#2 Andreas schrieb am 17.03.2013 um 17:20
danke für den Hinweis, ich hab das nicht messtechnisch überprüft.

#3 ElektroMatze schrieb am 06.12.2013 um 09:36
Kommentare:
#1 Thomas schrieb am 17.03.2013 um 15:22
...

Hierzu hätte ich gerne einen kompletten Scetch....

#4 hairul schrieb am 04.04.2014 um 09:52
ich habe ein mini Projekt mit einem Arduino Due füer die Messung und Aufzeichnung der Spannung des Stromes und der Temperatur eines Fahrzeugakkus zu ermöghlichen,

und in Verbindungen mit dem Arduino Due Board soll ich die folgende Anforderung erfüllen:

Spannungsmessung :
-Messbereich: 0v.. 20v
-Genauigkeit 0.1%
-Auflösung 12 bit

Strommessung:
Messbereich 1: /- 40A, Genauigkeit 0,1%
Messbereich 2 /- 10A, Genauigkeit 0,1%

Umgebungsbedingngen:
-Temperaturen -20°C...70°C

bitte um die Hilfe, wie ich voran arbeiten muss, vielen Dank im Voraus

#5 patrickqu schrieb am 16.06.2014 um 07:57
Da ich zurzeit ein ähnliches Projekt mit dem ACS714 versuche zu realisieren, hätte ich die Frage inwiefern sich am Code etwas ändert. Ich hab leider nur wenig Ahnung von der Arduino-Programmierung, deshalb diese Frage.

#6 Andreas schrieb am 16.06.2014 um 18:47
patrickqu: in Prinzip nicht viel
nur Dein Messbereich ist anders:
>messw=(float)5/512*sensorValue; //510=0A 0=-5A 1023=5A

#7 Leon schrieb am 09.01.2015 um 08:53
Ich habe einen ACS712 20A, wie muss ich da die Werte verändern?

#8 Andreas schrieb am 09.01.2015 um 18:33
die 75 durch 20 ersetzen:
> messw=(float)20/512*sensorValue;

#9 Andre schrieb am 01.03.2015 um 07:55
Hallo zusammen,
Ich will für einen Freund, ein Auswanderer in Nepal seine Kühlanlage optimieren, und wollte wissen, ob ich den obigen Aufbau verwenden kann um zwei Batterien(gespeißt von Solaranlage u. Netz) zu messen(24V haben die zwei)

#10 Andre schrieb am 01.03.2015 um 08:12
Weitere Frage: wenn du Batterie(24V) geladen wird, wirkt doch die Ladespannung auch auf mein System, nur von der anderen Seite:Was tun ? Sperrdiode ?

#11 Toni schrieb am 03.08.2015 um 09:27
Wie sieht das aus wenn ich 230 Volt messen muss? Gibt es da auch einen Sensor? Zu erwartender Strom etwa 63A. Gibt es da auch eine "preiswerte" Lösung, außer die überteuerten Wandler?
Genauigkeit reicht - 0,5A.

Grüße toni

#12 Andreas schrieb am 05.08.2015 um 16:38
bei https://www.mikrocontroller.net/topic/224739 gibt es Thread dazu. Oder http://www.seeedstudio.com/depot/noninvasive-ac-current-sensor-30a-max-p-519.html?cPath=61_70 (http://forum.arduino.cc/index.php?topic=29763.0)

#13 Mido schrieb am 22.09.2015 um 14:43
Hallo Zusammen,

ich versuche gerade den Strom durch einer Spule zu messen. Dabei habe ich alles bis auf die Code von Arduino..

also ich will den Strom messen, wenn der pwm duty cycle "HIGH" ist. Und ich kann das leider nich realisieren :(
ich kenne mich leider nicht so gut mit Arduino aus und brauche eure Hilfe.

hier ist mein Code:

#include <stdio.h>

int Strom = A0;
int StromValue = 0;

int i = 171;
int f = 2000;


void setup() {
pinMode(6, OUTPUT);
analogWrite(6,i);
PWMC_ConfigureClocks(f * PWM_MAX_DUTY_CYCLE , 0, VARIANT_MCK);

Serial.begin(9600);
Serial.print("n");
Serial.println(" Storm durch Spule ");

}
void loop() {

StromValue = analogRead(Strom);

Serial.print((float)StromValue);
Serial.print("A ");
Serial.print("n");
}


vielen Dank im Voraus

Mido



Inhalt zur freien Verwendung gibs es beim Thema Downloads.
nach oben springen
mehr auf: Instagram, github, thingiverse