if you wish to modify your sketch to include this line for each input
Serial.print("cmd_1("); Serial.print(emontx.power1); Serial.println(")");
next input line at next ct
Serial.print("cmd_2("); Serial.print(emontx.power2); Serial.println(")");
then install this on your esp - there some extra code as the esp i use has rgb on it and i use the lights to tell me if there is an error condition
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
//int blue = 1;
//int red = 2;
//int grn = 4;
// Update these with values suitable for your network.
String command;
float input1b = 0;
float input2b = 0;
float input3b = 0;
int scan1;
int scan2;
int scan3;
const char* ssid = "IOT";
const char* password = "";
const char* mqtt_server = "192.168.168.150";
String clientName;
WiFiClient espClient;
PubSubClient client(mqtt_server,1883, espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
char msg2[50];
char msg3[50];
void callback(char* topic, byte* payload, unsigned int length) {
// handle message arrived
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
}
String macToStr(const uint8_t* mac)
{
String result;
for (int i = 0; i < 6; ++i) {
result += String(mac[i], 16);
if (i < 5)
result += ':';
}
return result;
}
void setup() {
Serial.begin(9600);
pinMode(BUILTIN_LED, OUTPUT);
// pinMode(red, OUTPUT);
//pinMode(blue, OUTPUT);
delay(10);
digitalWrite(BUILTIN_LED, HIGH);
setup_wifi();
// put your setup code here, to run once:
Serial.println("started");
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.hostname("GridMonitor");
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
clientName += "esp8266-";
uint8_t mac[6];
WiFi.macAddress(mac);
clientName += macToStr(mac);
clientName += "-";
clientName += String(micros() & 0xff, 16);
Serial.print("Connecting to ");
Serial.print(mqtt_server);
Serial.print(" as ");
Serial.println(clientName);
MQTT_Connect();
}
void MQTT_Connect(){
if (client.connect((char*) clientName.c_str())) {
Serial.println("Connected to MQTT broker");
digitalWrite(BUILTIN_LED, LOW);
}
else {
Serial.println("MQTT connect failed");
Serial.println("Will reset and try again...");
abort();
}
client.setCallback(callback);
}
void loop()
{
if(WiFi.status() != WL_CONNECTED){setup_wifi();}
if (!client.connected()) { MQTT_Connect(); }
client.loop();
if(Serial.available())
{
char c = Serial.read();
if (c == ')')
{
parseCommand(command);
command="";
}
else
{
command += c;
digitalWrite(BUILTIN_LED, HIGH);
}
}
}
void parseCommand(String com)
{
char test[5];
String part1;
String part2;
part1 = com.substring(6, com.indexOf("("));
Serial.println(part1);
part2 = com.substring(com.indexOf("(")+1);
Serial.println(part2);
if (part1 == "1")
{
scan1++;
Serial.println("recieved 1");
String raw_CMD;
float input1 = part2.toFloat();
input1b = input1b+ input1;
if (scan1==5){
scan1=0;
input1 = input1b/5;
input1b=0;
raw_CMD=input1;
if (client.connected()){
Serial.print("Sending payload: ");
Serial.println(raw_CMD);
if (client.publish("/invert", (char*) raw_CMD.c_str())) {
digitalWrite(BUILTIN_LED, LOW);
Serial.println("Publish ok");
// digitalWrite(BUILTIN_LED, HIGH);
}
else {
Serial.println("Publish failed");
}
}
}
}
if (part1== "2")
{
scan2++;
Serial.println("recieved 2");
String raw_CMD;
float input2 = part2.toFloat();
input2b = input2b+ input2;
if (scan2==5){
scan2=0;
input2 = input2b/5;
input2b=0;
raw_CMD=input2;
if (client.connected()){
Serial.print("Sending payload: ");
Serial.println(raw_CMD);
if (client.publish("/grid", (char*) raw_CMD.c_str())) {
digitalWrite(BUILTIN_LED, LOW);
Serial.println("Publish ok");
// digitalWrite(BUILTIN_LED, HIGH);
}
else {
Serial.println("Publish failed");
}
}
}
}
if (part1 == "3")
{
scan3++;
Serial.println("recieved 3");
String raw_CMD;
float input3 = part2.toFloat();
input3b = input3b+ input3;
if (scan3==5){
scan3=0;
input3 = input3b/5;
input3b=0;
raw_CMD=input3;
if (client.connected()){
Serial.print("Sending payload: ");
Serial.println(raw_CMD);
if (client.publish("/wind", (char*) raw_CMD.c_str())) {
// digitalWrite(BUILTIN_LED, HIGH);
Serial.println("Publish ok");
digitalWrite(BUILTIN_LED, LOW);
}
else {
Serial.println("Publish failed");
}
}
}
}
delay(100);
}
it will send to topics /invert , /grid and /wind ( you can change that to whatever topic you want ) I also only used 3 cts a I needed to use ct4 to be able to use lcd screen locally if you wish to use all 4 cts just add the 4th block
then you can use dolomitz to watch for mqtt inputs… it also collect 5 inputs from emontx shield and adds them together and divides to get an average - which is a mqtt send about every 2-3 seconds
I prefer to use the mega r3 then you just write cmd_1, cmd_2 …etc to serial port 2 to be read by built in esp then you can leave debug code in on mega
or you can use uno r3 but you can not leave in any debugging code…