-
-
Save ItKindaWorks/ab4d85bc1ea77c1ff20a46b5dc2a2746 to your computer and use it in GitHub Desktop.
/* | |
powerMonitorArd.ino | |
Copyright (c) 2017 ItKindaWorks All right reserved. | |
github.com/ItKindaWorks | |
powerMonitorArd.ino 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. | |
powerMonitorArd.ino 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 powerMonitorArd.ino. If not, see <http://www.gnu.org/licenses/>. | |
*/ | |
#include "EmonLib.h" | |
#define SAMPLE_COUNT 5 | |
#define VOLT_CAL 148.7 //voltage calibration | |
#define CURRENT_CAL1 62.6 //sensor 1 calibration | |
#define CURRENT_CAL2 62.8 //sensor 2 calibration | |
//create 2 instances of the energy monitor lib | |
EnergyMonitor emon1; | |
EnergyMonitor emon2; | |
//arrays to hold the sample data | |
double volts1[SAMPLE_COUNT]; | |
double amps1[SAMPLE_COUNT]; | |
double watts1[SAMPLE_COUNT]; | |
double volts2[SAMPLE_COUNT]; | |
double amps2[SAMPLE_COUNT]; | |
double watts2[SAMPLE_COUNT]; | |
const int currentPin1 = 2; | |
const int currentPin2 = 1; | |
const int voltagePin = 3; | |
//counter to keep track of the current sample location | |
int counter = 0; | |
void setup() | |
{ | |
Serial.begin(115200); | |
Serial1.begin(115200); | |
emon1.voltage(voltagePin, VOLT_CAL, 1.7); // Voltage: input pin, calibration, phase_shift | |
emon1.current(currentPin1, CURRENT_CAL1); // Current: input pin, calibration. | |
emon2.voltage(voltagePin, VOLT_CAL, 1.7); // Voltage: input pin, calibration, phase_shift | |
emon2.current(currentPin2, CURRENT_CAL2); // Current: input pin, calibration. | |
} | |
void loop() | |
{ | |
//reset the var that keeps track of the number of samples taken | |
//(loop back around to 0 on the array for our running total) | |
if(counter >= SAMPLE_COUNT){ | |
counter = 0; | |
} | |
//calculate the most recent readings | |
emon1.calcVI(20,5000); | |
emon2.calcVI(20,5000); | |
//save the voltage, current, watts to the array for later averaging | |
amps1[counter] = emon1.Irms; | |
volts1[counter] = emon1.Vrms; | |
watts1[counter] = emon1.Vrms * emon1.Irms; | |
amps2[counter] = emon2.Irms; | |
volts2[counter] = emon2.Vrms; | |
watts2[counter] = emon2.Vrms * emon2.Irms; | |
counter++; | |
//setup the vars to be averaged | |
double wattAvg1 = 0; | |
double voltAvg1 = 0; | |
double ampAvg1 = 0; | |
double wattAvg2 = 0; | |
double voltAvg2 = 0; | |
double ampAvg2 = 0; | |
//add em up for averaging | |
for(int i = 0; i < SAMPLE_COUNT; i++){ | |
wattAvg1 += watts1[i]; | |
voltAvg1 += volts1[i]; | |
ampAvg1 += amps1[i]; | |
wattAvg2 += watts2[i]; | |
voltAvg2 += volts2[i]; | |
ampAvg2 += amps2[i]; | |
} | |
//get the final average by dividing by the # of samples | |
wattAvg1 /= SAMPLE_COUNT; | |
ampAvg1 /= SAMPLE_COUNT; | |
voltAvg1 /= SAMPLE_COUNT; | |
wattAvg2 /= SAMPLE_COUNT; | |
ampAvg2 /= SAMPLE_COUNT; | |
voltAvg2 /= SAMPLE_COUNT; | |
//calculate the total amps and watts | |
double totalAmp = ampAvg1 + ampAvg2; | |
double totalWatt = wattAvg1 + wattAvg2; | |
//send the power info to the ESP module through Serial1 | |
sendPowerInfo (voltAvg1, totalAmp, totalWatt); | |
} | |
//send the power info to the ESP module through Serial1 (comma separated and starting with *) | |
void sendPowerInfo(double Volts, double Amps, double Watts){ | |
Serial1.print("*"); | |
Serial1.print(Volts); | |
Serial1.print(","); | |
Serial1.print(Amps); | |
Serial1.print(","); | |
Serial1.println(Watts); | |
} |
/* | |
powerMonitorESP.ino | |
Copyright (c) 2017 ItKindaWorks All right reserved. | |
github.com/ItKindaWorks | |
powerMonitorESP.ino 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. | |
powerMonitorESP.ino 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 powerMonitorESP.ino. If not, see <http://www.gnu.org/licenses/>. | |
*/ | |
#include "ESPHelper.h" | |
#include <Metro.h> | |
#define AVG_COUNT 50 | |
const char* voltTopic = "/yourTopic/volt"; | |
const char* ampTopic = "/yourTopic/amp"; | |
const char* wattTopic = "/yourTopic/watt"; | |
const char* hostnameStr = "PWR-Node"; | |
const char* otaPass = "Your OTA Password"; | |
netInfo homeNet = { .mqttHost = "YOUR MQTT-IP", //can be blank if not using MQTT | |
.mqttUser = "YOUR MQTT USERNAME", //can be blank | |
.mqttPass = "YOUR MQTT PASSWORD", //can be blank | |
.mqttPort = 1883, //default port for MQTT is 1883 - only chance if needed. | |
.ssid = "YOUR SSID", | |
.pass = "YOUR NETWORK PASS"}; | |
ESPHelper myESP(&homeNet); | |
Metro powerMetro = Metro(30000); | |
void setup() { | |
Serial.begin(115200); | |
myESP.OTA_enable(); | |
myESP.OTA_setPassword(otaPass); | |
myESP.OTA_setHostnameWithVersion(hostnameStr); | |
myESP.setHopping(false); | |
myESP.begin(); | |
} | |
void loop(){ | |
int count = 0; | |
//where to store the data to be averaged | |
double watts[AVG_COUNT]; | |
double volts[AVG_COUNT]; | |
double amps[AVG_COUNT]; | |
//vars to maintain averages for all data points | |
double wattAvg = 0; | |
double voltAvg = 0; | |
double ampAvg = 0; | |
//the serial buffer of 64 bytes | |
char serialBuf[64]; | |
while(1){ | |
//reset the count when we hit the max. The average acts and a rolling average | |
if(count >= AVG_COUNT){ | |
count = 0; | |
} | |
//get data from serial line | |
while(Serial.available()){ | |
// '*' marks the beginning of a transmission | |
bool start = Serial.find('*'); | |
//parse out the floats | |
if(start){ | |
volts[count] = Serial.parseFloat(); | |
amps[count] = Serial.parseFloat(); | |
watts[count++] = Serial.parseFloat(); | |
break; | |
} | |
delay(1); | |
} | |
//calculate averages | |
wattAvg = 0; | |
ampAvg = 0; | |
voltAvg = 0; | |
for(int i = 0; i < AVG_COUNT; i++){ | |
wattAvg += watts[i]; | |
voltAvg += volts[i]; | |
ampAvg += amps[i]; | |
} | |
wattAvg /= AVG_COUNT; | |
ampAvg /= AVG_COUNT; | |
voltAvg /= AVG_COUNT; | |
//only send the data every so often (set by the metro timer) and only when connected to WiFi and MQTT | |
if(myESP.loop() == FULL_CONNECTION && powerMetro.check()){ | |
//post just watts | |
char wattStr[10]; | |
dtostrf(wattAvg,4,1,wattStr); | |
myESP.publish(wattTopic,wattStr, true); | |
delay(5); | |
//post just volts | |
char voltStr[10]; | |
dtostrf(voltAvg,4,1,voltStr); | |
myESP.publish(voltTopic,voltStr, true); | |
delay(5); | |
//post just amps | |
char ampStr[10]; | |
dtostrf(ampAvg,4,1,ampStr); | |
myESP.publish(ampTopic,ampStr, true); | |
delay(5); | |
} | |
yield(); | |
} | |
} | |
void callback(char* topic, uint8_t* payload, unsigned int length) { | |
} | |
I have problem how to connect to Thingsboard, There is no option to enter a token. Can u help me pls with code?
Hi vladkru, I have forked the current gist, and made some changes to the code.
You can find it here.
https://gist.github.com/BullsEye34/99c4d94ccfc6d9e9644ab20b4620b049
Hope you find it helpful
Thx but still no telemetry... I change token and my wifi ssid and pass. Serial monitor print data but thingsboard not receive...
Thx but still no telemetry... I change token and my wifi ssid and pass. Serial monitor print data but thingsboard not receive...
I have made some changes to the code.... Please check it out.
The data which I send had to be converted to a JSON and sent.
Check the whole code, the bottom part
Hey Guys, I am unable to use ESPHelper.h and Metro.h libraries for my esp32 and esp8266, please can you help me to figure out this problem...
I have one esp32 (Wroom-32) and esp8266MOD (Powered by Model vendor).
I have problem how to connect to Thingsboard, There is no option to enter a token. Can u help me pls with code?