NEWS
Ströme im Schaltschrank induktiv messen und ESP an iobroker übergeben
-
Schönen guten Tag zusammen,
hier wollte ich mal mein nächstes Projekt vorstellen.
Und zwar habe ich schon immer eine Möglichkeit gesucht im Schaltschrank (Sicherungskasten), bzw. andere Leitungen strommässig, und somit auch leistungsmässig zu erfassen und zu loggen.
Erst dachte ich an einen ACS712, hierfür muss aber die Leitung aufgetrennt werden, da der ACS712 eher als Shunt fungiert.
Somit bin ich auf die induktiven Stromsensoren SCT013 gestoßen. Die werden wie eine Stromzange um die Leitung geklappt.
Die man aber hier AC hat, kann man das nicht einfach mit dem ADC Eingang des ESP messen, da zu langsam, sondern muss es öfters samplen und eben einen Wert daraus bilden.
Das schafft aber locker der Arduino.
Hier gibt es schon dafür einen fertige Doku:
http://www.homautomation.org/2013/09/17 … d-arduino/
Das Ding habe ich mit einem 15A Typ nachgebaut und hat erstaunlich gut und genau funktioniert.
Jetzt die Frage wie man das über den ESP an ioBroker übergibt.
Hier bietet sich I2C an.
Also alles verdrahtet, 2k2 PullUp an 3V3 des ESP gehängt und an den Arduino angeschlossen.
In EasyESP gibt es unter Devices "ProMiniExtender" mit dem man I2C Daten ausgeben kann.
Den Arduino Code habe ich wie folgt verändert:
#include "EmonLib.h" // Include Emon Library #include <wire.h>EnergyMonitor emon1; // Create an instance void setup() { Serial.begin(9600); Wire.begin(2); emon1.current(1, 15); // Current: input pin, calibration. } void loop() { int Irms = emon1.calcIrms(1480); // Calculate Irms only Serial.print(Irms*230.0); // Apparent power Serial.print(" "); Serial.println(Irms); // Irms Wire.beginTransmission(2);//Start des Master mit dem Sende an Adresse 2 Wire.write(Irms); Wire.endTransmission(); }</wire.h>
Leider kann man keine double Variable per I2C übergeben, aber dazu später.
Ein I2C Scan hat mit die Adresse 2 bestätigt, Daten müssten also ankommen, aber leider kann ich keinen Daten an dem Device ProMiniExtender sehen. Weiß jemand wie man den einstellt? Ist "Port" die I2C Adresse?
Wenn alles läuft würde ich auf den ADS1115 gehen, da dieser genauer misst. Aber dazu auch später.
-
So, hab's hinbekommen.
Für den PME (ProMiniExtender) muss man die Adresse 0x7F nehmen, dann erkennt EasyESP auch einen PME.
Ich habe mir von hier:
http://www.letscontrolit.com/forum/view … 0-%20p6463
..den Code genommen und entsprechend den Code für den CT implementiert und etwas abgespeckt, soweit ich den Code verstanden habe.
Dabei ist folgendes herausgekommen:
/********************************************************************************************************************\ * Arduino project "ESP Easy" Copyright www.esp8266.nu * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * You received a copy of the GNU General Public License along with this program in file 'License.txt'. * * IDE download : https://www.arduino.cc/en/Main/Software * ESP8266 Package : https://github.com/esp8266/Arduino * * Source Code : https://sourceforge.net/projects/espeasy/ * Support : http://www.esp8266.nu * Discussion : http://www.esp8266.nu/forum/ * * Additional information about licensing can be found at : http://www.gnu.org/licenses \******************************************************************************************************************/ // This file is to be loaded onto an Arduino Pro Mini so it will act as a simple IO extender to the ESP module. // Communication between ESP and Arduino is using the I2C bus, so only two wires needed. // It is possible to run the Pro Mini on 3V3, although the 16MHz versions do not officially support this at 16MHzl // By working on 3.3volt you can skip levelconverters on I2C, but no guarantee that it will work stable. // Arduino Mini Pro uses A4 and A5 for I2C bus. ESP I2C can be configured but they are on GPIO-4 and GPIO-5 by default. #include <wire.h>#include "EmonLib.h" #define I2C_MSG_IN_SIZE 4 #define I2C_MSG_OUT_SIZE 4 #define CMD_ANALOG_READ 4 volatile uint8_t sendBuffer[I2C_MSG_OUT_SIZE]; int ESPrms; // value to be sent over I2C to ESP EnergyMonitor emon1; // Create an instance void setup() { Serial.begin(9600); emon1.current(1, 15); // Current: input pin, calibration. Wire.begin(0x7f); Wire.onReceive(receiveEvent); Wire.onRequest(requestEvent); } // relative zero of the ACS712 for me 514 was best. 511 int valueRead; // value read on ADC void loop() { int Irms = emon1.calcIrms(1480)*1000; // Calculate Irms only Serial.print(Irms*230.0); // Apparent power Serial.print(" "); Serial.println(Irms); // Irms unsigned int count = 0; ESPrms = Irms; // conversion of float Ampere into integer milliAmpere needed for I2C communication } void receiveEvent(int count) { if (count == I2C_MSG_IN_SIZE) { byte cmd = Wire.read(); byte port = Wire.read(); int value = Wire.read(); value += Wire.read()*256; switch(cmd) { case CMD_ANALOG_READ: clearSendBuffer(); if (port <= 4) valueRead = ESPrms*230/1000; // port <=4 to read analog value A0,A1,A2,A3 - A4 & A5 are I2C if (port == 100) valueRead = ESPrms; // port is any number >4 up to 255 sendBuffer[0] = valueRead & 0xff; sendBuffer[1] = valueRead >> 8; break; } } } void clearSendBuffer() { for(byte x=0; x < sizeof(sendBuffer); x++) sendBuffer[x]=0; } void requestEvent() { Wire.write((const uint8_t*)sendBuffer,sizeof(sendBuffer)); }</wire.h>
Damit funktioniert es. Über den MQTT Adapter wird sauber der Datenpunkt von EasyESP eingetragen, ich habe nun auf meinem VIS einen Wert (Strom oder Leistung)
Jetzt habe ich erst einmal einen ADS1115 bestellt und auch weitere SCT und mache auch erst einmal die HW schön.
Ach ja, wer das nachbauen möchte. Aufpassen mit der I2C. Hier sollte man, wie schon geschrieben die PullUps an die 3V3 des ESP hängen.
Somit sollte auch ein Power Sequencing stattfinden. Arduino zuerste bzw. zusammen mit dem ESP. Nicht dass der ESP zuerst gepowert wird und dann den Arduino über die PullUps mit 3V3 versorgt.
Ich weißt nicht ob die Ports das aushalten.
Bei Fragen einfach melden.
Viele Grüße
-
Interessanter Ansatz, und sicher eine kostengünstigere Lösung als diverse Stromzähler
-
absolut, die frage kommt dan aber bei mir hoch ob man mehrere sensoren verbouwen kan oder dafuer von allem doppelte hardware braucht ?
-
Der Sensor hängt momentan an einem Arduino nano, der hat 8 analoge Inputs. Die I2C Schnittstelle ist allerdings auch an diesen Ports angeschlossen, wären also noch 6 übrig, wobei man I2C evtl. auch auf anderen Ports laufen lassen kann.
In der SW braucht man da nicht viel ändern, wenn man mehrere Sensoren ausließt
Später würde ich das Ganze an einen ADS1115 anschließen, der hat 4 ADCs. Hiervon kann man aber auch wiederum mehrere an den Arduino anschließen.
Kosten:
Sensor 7,- und in China 4-5,-
ADS1115 5-6,- und in China 2-3,-
-
Hast du die Version immer noch in Betrieb?
Lässt sich das auch mit 3 Phasen verwirklichen oder brauche ich dafür 3 solche Aufbauten?
-
Würde mich auch interessieren. Bräuchte so 10 Messstellen.
-
Hatte mir für meine 2 Stromzähler zwei IR Köpfe bestellt und diese per USB mit dem Pi verbunden. Hier sehe ich den genauen Stromverbrauch der Wärmepumpe und des Allgemeinstroms.
Zudem habe ich einen Wemos D1 mit einem Arduino und 4 verschiedene (5A/30A/10A/15A) Stromklemmen aufgebaut um einzelne Stränge zu messen, mehr geht wohl pro Arduino nicht.
Leider ist das Ganze nicht ganz genau, da hier eigentlich auch die Phase gemessen werden müsste wegen der Blindleistung.
Es gibt aber bestimmt auch dafür Lösungen im Netz.
Habe aber im Moment andere wichtigere Baustellen zumal mir diese Genauigkeit eigentlich reicht.
Wer wegen dem 4-fach Aufbau mehr Infos braucht kann mich ja gerne anschreiben oder ich poste das hier bei Interesse.