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:
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.
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)
#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.