Pages: [1]   Go Down
Author Topic: Smartmeter: Hager EHZ 361 Stromzähler LED auslesen - der Anfang ist gemacht  (Read 2357 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Zusammen,

hab mich mal mit dem Thema "Stromzähler auslesen per Blink-LED" beschäftigt.

Meine Zähler sind die Hager EHZ361... diese haben eine blinkende LED - 10.000x blinken = 1 KW/h....

Meine Idee war nun, mit einem Arduino Uno, die Impulse per Phototransistor zu zählen..... da die LED "gelb" blinkt, habe ich nach einem Sensor mit breitem Spektrum gesucht (möglichst im Bereich 560-580nm).

Bei Conrad habe ich den Taos TSL250R für 5,22 € gefunden.

Pin1 an GND
Pin2 an 5V+
Pin3 an Analog1

Code auf Basis des Beispiel "AnalogInput" geladen und ergänzt: siehe unten

Es funktioniert.....

Was noch zu tun ist:

- Es gibt wohl eine Abweichung von 5-10% - Arduino zeigt eine zu hohe Leistung an. Das kann ich mir bisher nicht erkären
- Integration Ethernet Webserver
- Integration SD-Karte
- Integration Bluetooth

Hat jemand Erfahrungen mit anderen Sensoren?
 
Quote
#include <LiquidCrystal.h>  

int sensorPin = A1;    // ANALOG Sensor 1 (zweites Loch ;-)
int ledPin = 13;      // Kontroll LED auf dem Uno
int sensorValue = 0;  // Sensorwert
int sec = 0;          // Zeit zwischen den Blinks
int millisalt;        // Zeit des letzten Blinks
int count;            // Zähler der Blinks
int fehler = 0;       // Fehlersuche = 1 -> mehr Ausgaben
int watt = 0;         // aktuelle Leistung in Watt

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // evtl an eigenes Display anpassen

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(ledPin, OUTPUT);  
}

void loop() {
  sensorValue = analogRead(sensorPin);   // Lese Sensor
   if (fehler == 1)   Serial.println (sensorValue);
                           // if Schleife wenn der Sensor schneller als die LED ist, Wert 700 evtl anpassen an den Maximalwert Sensor
  if (sensorValue > 700)
        {
        sec = (millis()- millisalt);
        if (sec > 70)
        {
        digitalWrite(ledPin, HIGH);  //LED an wenn Zähler LED an ist
        count ++;
        
        Serial.print ("Zeit: ");
        Serial.print (millis()); // Zeit seit Start
        
        Serial.print(" Blinks:");
        Serial.print (count); // Blinks seit Start
        
        Serial.print (" Zeit zw Blinks:");
        Serial.print (sec); // Zeit zwischen den Blinks
        Serial.print (" Sensorwert:");
        Serial.print (sensorValue); // Sensorwert

        watt = (360000/sec); // Umrechnung Zeit zwischen Blinks in Watt 10000 Blinks = 1KW/h

        Serial.print (" Leistung:");
        Serial.println (watt);
        
        
        lcd.setCursor(0, 0);
        lcd.print ("    ");
        lcd.setCursor(0, 0);
        lcd.print(watt);
        lcd.setCursor(5, 0);
        lcd.print(" Watt");
        lcd.setCursor(0, 1);
        if (fehler == 1)  lcd.print ("Sensor: ");
        if (fehler == 1)  lcd.print(sensorValue);
        if (fehler == 1)  lcd.print(" ");
        lcd.print("W: ");
        lcd.print((count/10));
        lcd.print (" Min: ");
        lcd.print((millis()/1000/60));
        }
        millisalt = millis(); //speichere alten Zeitwert
        }
        
   else  
   {  
   digitalWrite(ledPin, LOW); //LED aus wenn Zähler LED aus ist
   }
            
}





* Hager.jpg (61.09 KB, 800x600 - viewed 148 times.)
« Last Edit: October 31, 2012, 09:37:47 am by licht2002 » Logged

Germany
Offline Offline
Edison Member
*
Karma: 48
Posts: 2338
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Schönes Projekt! Gibt es einen besonderen Grund, warum du einen (teuren) Licht-Spannungswandler nimmst? Einen Spannungsteiler aus einem Festwiderstand und einem LDR zu bauen sollte etwas günstiger sein.
Von Programmierung her hast du ein paar Dinge nicht bedacht, bspw. wird dir unweigerlich die count-Variable überlaufen. Das geht schon ganz schnell, wenn man sich den möglichen Wertebereich einer Integer-Variablen ansieht. Ansonsten grüble ich noch etwas über den Sinn der Variable sec.
Ansonsten noch eine kurze Anmerkung zu deinen Einheiten: Es sind tatsächlich kWh, nicht kW je h.
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1148
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also meiner Erfahrung nach ist ein LDR zu langsam für die saubere erkennung der Puls mit einem Fototransistor bist du auf der Richtigen Seite, der ist schnell genug.
Gruß
Der Dani
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Von Programmierung her hast du ein paar Dinge nicht bedacht, bspw. wird dir unweigerlich die count-Variable überlaufen. Das geht schon ganz schnell, wenn man sich den möglichen Wertebereich einer Integer-Variablen ansieht. Ansonsten grüble ich noch etwas über den Sinn der Variable sec.

Hallo - danke für den Hinweis!

Das ist erst mein zweiter Sketch.... also kam ich noch nie an die Grenze der Count-Variable....

sec ist die Zeit zwischen den Impulsen. Ich hatte in der ersten Version das Problem, dass der Sensor die LED mehrmals gemeldet hat (er misst halt schneller als die LED blinkt). Mit den 70 ms bekomme ich nur einen Impuls.

Kannst Du mir einen Tip geben, wie ich den Count-Overflow vermeiden kann?

Danke!

VG Tom


Logged

Germany
Offline Offline
Edison Member
*
Karma: 48
Posts: 2338
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Also meiner Erfahrung nach ist ein LDR zu langsam für die saubere erkennung der Puls mit einem Fototransistor bist du auf der Richtigen Seite, der ist schnell genug.
Okay, akzeptiere ich als Grund. smiley-wink Danke für den Hinweis! Nehmen wir eben einen npn-Fototransistor wie den LPT80 (auch nicht teuer), damit bekommen wir gleich ein digitales Signal. Ausreichend schnell und empfindlich müsste er ebenso sein.

Eine Integer-Variable läuft von -32.768 bis  32.767. Wenn du also bei jeder Kilowattstunde 10.000mal das Blinken registrierst, ist nach knapp 3,3 kWh die Varaible übergelaufen, bei einem Jahresstromverbrauch von schätzungsweise 2.000 kWh (Schätzung für kleinen Haushalt) passiert das 1,7 mal am Tag. Genug der Zahlenspielerei, du könntest beispielsweise den Wertebereich vergrößern, indem du aus dem int count; ein unsigned int; count machst, was die Zeitspanne bis zum Überlauf vorerst verdoppelt. Ein unsigned long count; hat dann den Wertebereich 0 bis 4.294.967.295, damit kommt man schon ein ganzes Stück weiter.
Wesentlich praktikabler finde ich es jedoch, den Verbrauch (und damit die Blinks) tagesweise zu zählen und zur Auswertung abzuspeichern, wie du es in der Erweiterung deines Projektes auch vorhast (SD-Karte). Nach einem Tag setzt du die Variable einfach wieder auf 0 und zählst wieder neu hoch.
Für dieses Vorgehen sollte man aber die aktuelle Zeit und das Datum parat halten, bspw. durch eine RTC (Real Time Clock).
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21887
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Als Sensor tuts jeder Fototransistor. Er muß nicht an der LEDfarbe angepasst sein. Wichtiger sehe ich die Abschirmung gegenüber Umgebunglicht, die etwas sorgsamer gemacht werden sollte damit der Fototransistor nicht das Treppenlicht (Anfangsblitze der Leuchstofflampe beim Start) zählt.

Ein Fotowiderstand ist definitiv zu langsam um ein kurzes Blinken zu erfassen.

Grüße Uwe
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3072
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Nach einem Tag setzt du die Variable einfach wieder auf 0 und zählst wieder neu hoch.

Oder du bildest immer die Differenz zum vorigen Wert, speicherst diese Differenz auf der SD Karte und merkst den Wert für's nächste Mal als neuer "voriger Wert". Dann macht der Überlauf gar nichts, solange die Differenz weniger als einen Umlauf groß ist.

Und was count heisst, sollte auch als unsigned definiert sein, auch wenn das ein verdammt mühsam zu tippendes Wort ist.
Das macht zwar nichts bei der Differenz-Bildung, erleichtert aber das Verständnis.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21887
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Und was count heisst, sollte auch als unsigned definiert sein, auch wenn das ein verdammt mühsam zu tippendes Wort ist.
JA, verdammt schwierig zu tippen.  smiley-wink smiley-wink smiley-wink
Logged

Pages: [1]   Go Up
Jump to: