From 340dcb0ac4dddc9ba1d52699a5c6232b48aaa45c Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Fri, 3 Nov 2017 07:15:13 +0100 Subject: [PATCH] add ina226 sensor (#123) * add ina226 sensor #116 * add sensor into the CI --- OpenMQTTGateway.ino | 6 +++ User_config.h | 8 +++- ZsensorINA226.ino | 110 ++++++++++++++++++++++++++++++++++++++++++++ config_INA226.h | 34 ++++++++++++++ tests/Test_config.h | 4 ++ 5 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 ZsensorINA226.ino create mode 100644 config_INA226.h diff --git a/OpenMQTTGateway.ino b/OpenMQTTGateway.ino index 0a0008b..1210dc4 100644 --- a/OpenMQTTGateway.ino +++ b/OpenMQTTGateway.ino @@ -197,6 +197,9 @@ void setup() #ifdef ZgatewayRFM69 setupRFM69(); #endif + #ifdef ZsensorINA226 + setupINA226(); + #endif #ifdef ZsensorHCSR501 setupHCSR501(); #endif @@ -268,6 +271,9 @@ void loop() #ifdef ZsensorDHT MeasureTempAndHum(); //Addon to measure the temperature with a DHT #endif + #ifdef ZsensorINA226 + MeasureINA226(); //Addon to measure the temperature with a DHT + #endif #ifdef ZsensorHCSR501 MeasureHCSR501(); #endif diff --git a/User_config.h b/User_config.h index 7a5aa7a..310f0e1 100644 --- a/User_config.h +++ b/User_config.h @@ -74,6 +74,8 @@ const byte subnet[] = { 255, 255, 255, 0 }; //ip adress #include "config_IR.h" #define ZgatewayBT #include "config_BT.h" + //#define ZsensorINA226 + //#include "config_INA226.h" //#define ZsensorHCSR501 //#include "config_HCSR501.h" //#define ZsensorADC @@ -96,6 +98,8 @@ const byte subnet[] = { 255, 255, 255, 0 }; //ip adress #include "config_IR.h" #define ZgatewayBT #include "config_BT.h" + //#define ZsensorINA226 + //#include "config_INA226.h" //#define ZsensorDHT //#include "config_DHT.h" //#define ZsensorBH1750 @@ -107,7 +111,9 @@ const byte subnet[] = { 255, 255, 255, 0 }; //ip adress //#define ZsensorADC //#include "config_ADC.h" //#define ZgatewayRFM69 not tested - //#include "config_RFM69.h" + //#include "config_RFM69.h" + //#define ZsensorINA226 + //#include "config_INA226.h" #endif /*----------------------------OTHER PARAMETERS-----------------------------*/ /*-------------------CHANGING THEM IS NOT COMPULSORY-----------------------*/ diff --git a/ZsensorINA226.ino b/ZsensorINA226.ino new file mode 100644 index 0000000..c6207f6 --- /dev/null +++ b/ZsensorINA226.ino @@ -0,0 +1,110 @@ +/* + OpenMQTTGateway Addon - ESP8266 or Arduino program for home automation + + Act as a wifi or ethernet gateway between your 433mhz/infrared IR signal and a MQTT broker + Send and receiving command by MQTT + + INA226 reading Addon + + From the orgiginal work of Matthias Busse http://shelvin.de/ein-batteriemonitor-fuer-strom-und-spannung-mit-dem-ina226-und-dem-arduino-uno/ + MQTT add - 1technophile + + Contributors: + - 1technophile + + This file is part of OpenMQTTGateway. + + OpenMQTTGateway 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. + + OpenMQTTGateway 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 should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +// Pinout +// INA226 - Uno - Mega - NODEMCU +// SCL - A5 - 21 - D1 +// SDA - A4 - 20 - D2 +// + +#ifdef ZsensorINA226 +#include + +float rShunt=0.1; // Shunt Widerstand festlegen, hier 0.1 Ohm +const int INA226_ADDR = 0x40; // A0 und A1 auf GND > Adresse 40 Hex auf Seite 18 im Datenblatt + +//Time used to wait for an interval before resending temp and hum +unsigned long timeINA226 = 0; + +void setupINA226() { + Wire.begin(); + // Configuration Register Standard Einstellung 0x4127, hier aber 16 Werte Mitteln > 0x4427 + writeRegister(0x00, 0x4427); // 1.1ms Volt und Strom A/D-Wandlung, Shunt und VBus continous +} + +void MeasureINA226(){ + if (millis() > (timeINA226 + TimeBetweenReadingINA226)) {//retriving value of temperature and humidity of the box from DHT every xUL + timeINA226 = millis(); + // Topic on which we will send data + trc(F("Retrieving electrical data")); + // Bus Spannung, read-only, 16Bit, 0...40.96V max., LSB 1.25mV + trc(F(" Volt: ")); + float volt = readRegister(0x02) * 0.00125; + trc(String(volt)); + trc(F(" V, Current: ")); + // Seite 24: Shunt Spannung +- 81,92mV mit 16 Bit, LSB 2,5uV + int shuntvolt = readRegister(0x01); + if (shuntvolt && 0x8000) {// eine negative Zahl? Dann 2er Komplement bilden + shuntvolt = ~shuntvolt; // alle Bits invertieren + shuntvolt += 1; // 1 dazuzählen + shuntvolt *= -1 ; // negativ machen + } + float current = shuntvolt * 0.0000025 / rShunt; // * LSB / R + trc(String(current)); + trc(F(" A, Power: ")); + float power=abs(volt*current); + trc(String(power)); + trc(F(" W")); + + char volt_c[7]; + char current_c[7]; + char power_c[7]; + dtostrf(volt,6,3,volt_c); + dtostrf(current,6,3,current_c); + dtostrf(power,6,3,power_c); + + client.publish(subjectVolttoMQTT,volt_c); + client.publish(subjectCurrenttoMQTT,current_c); + client.publish(subjectPowertoMQTT,power_c); + + } +} + +static void writeRegister(byte reg, word value) { + Wire.beginTransmission(INA226_ADDR); + Wire.write(reg); + Wire.write((value >> 8) & 0xFF); + Wire.write(value & 0xFF); + Wire.endTransmission(); +} + +static word readRegister(byte reg) { + word res = 0x0000; + Wire.beginTransmission(INA226_ADDR); + Wire.write(reg); + if (Wire.endTransmission() == 0) { + if (Wire.requestFrom(INA226_ADDR, 2) >= 2) { + res = Wire.read() * 256; + res += Wire.read(); + } + } + return res; +} + +#endif diff --git a/config_INA226.h b/config_INA226.h new file mode 100644 index 0000000..a556419 --- /dev/null +++ b/config_INA226.h @@ -0,0 +1,34 @@ +/* + OpenMQTTGateway - ESP8266 or Arduino program for home automation + + Act as a wifi or ethernet gateway between your 433mhz/infrared IR signal and a MQTT broker + Send and receiving command by MQTT + + This files enables to set your parameter for the INA226 sensor + + Copyright: (c)Florian ROBERT + + This file is part of OpenMQTTGateway. + + OpenMQTTGateway 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. + + OpenMQTTGateway 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 should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/*----------------------------USER PARAMETERS-----------------------------*/ +/*-------------DEFINE YOUR MQTT PARAMETERS BELOW----------------*/ +#define subjectVolttoMQTT "home/INA226toMQTT/Volt" +#define subjectCurrenttoMQTT "home/INA226toMQTT/Current" +#define subjectPowertoMQTT "home/INA226toMQTT/Power" +#define TimeBetweenReadingINA226 30000 // time between 2 INA226 readings + + diff --git a/tests/Test_config.h b/tests/Test_config.h index 16cbba4..81208f7 100644 --- a/tests/Test_config.h +++ b/tests/Test_config.h @@ -74,6 +74,8 @@ const byte subnet[] = { 255, 255, 255, 0 }; //ip adress #include "config_IR.h" #define ZgatewayBT #include "config_BT.h" + #define ZsensorINA226 + #include "config_INA226.h" #define ZsensorHCSR501 #include "config_HCSR501.h" #define ZsensorADC @@ -96,6 +98,8 @@ const byte subnet[] = { 255, 255, 255, 0 }; //ip adress #include "config_IR.h" #define ZgatewayBT #include "config_BT.h" + //#define ZsensorINA226 + //#include "config_INA226.h" //#define ZsensorDHT //#include "config_DHT.h" //#define ZsensorBH1750