Emonlib with MQTT

I have an ESP32, a DHT11 and a ZMP101B. I’m trying to use the EmonLib library to read the voltage of the ZMP101B. I can do the voltage reading when I don’t implement the MQTT part, but when I implement the MQTT part, it stops reading the voltage.. the voltage is at “0V”.. the dht readings are still normal.

The same is true for other IoT platforms.


#include <stdio.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <DHT.h>
#include <EmonLib.h>

#define VOLT_CAL    85             // voltage calib


// MQTT definitions
#define MQTT_PUB_TOPIC "tago/data/post"
#define MQTT_USERNAME  "test"                                     // any value
#define MQTT_PASSWORD  "66534b39-c363-41f8-b665-fd644a2423c9"     // Device Token TagoIO

// WIFI
const char* ssid_wifi = "AndroidAP";            // WI-FI network SSID
const char* password_wifi = "cett0940";         // WI-FI network password
WiFiClient espClient;

// MQTT
const char* broker_mqtt = "mqtt.tago.io";       // MQTT broker URL
int broker_port = 1883;                         // MQTT broker port
PubSubClient MQTT(espClient);


DHT dht(25, DHT11);                             // (pin, type DHT)
EnergyMonitor emon5;                            // instance emon

//Prototypes
void init_wifi(void);
void init_MQTT(void);
void connect_MQTT(void);
void connect_wifi(void);
void send_data_iot_platform(void);

unsigned long millis_Time = millis();
float temperature_read;
float humidity_read;
double voltage_read;

void setup() {

    Serial.begin(115200);
    dht.begin();                          // init DHT
    init_wifi();                          // func init wifi
    init_MQTT();                          // func init mqtt
    connect_MQTT();                       // func connect mqtt
    emon5.voltage(26, VOLT_CAL, 1.7);     // voltage (pin analóg, calib, fase change)

    delay(500);
}

void loop() {
    connect_wifi();                   // verify wi-fi
    connect_MQTT();                   // verify MQTT
    send_data_iot_platform();         // send data to TagoIO)

}


// Func init wi-fi
void init_wifi(void)  {
    delay(10);
    Serial.println();
    Serial.println("------ WI-FI -----");
    Serial.print("Connecting to Wifi: ");
    Serial.println(ssid_wifi);
    connect_wifi();
}

// Func connect to wifi
void connect_wifi(void){
    if (WiFi.status() == WL_CONNECTED)
        return;
    WiFi.begin(ssid_wifi, password_wifi);
    while (WiFi.status() != WL_CONNECTED){
        WiFi.begin(ssid_wifi, password_wifi);
        delay(3000);
        Serial.print(".");
    }

    Serial.println();
    Serial.print("Successful connection to Wifi network: ");
    Serial.println(ssid_wifi);
    Serial.print("IP: ");
    Serial.println(WiFi.localIP());
    Serial.println("---------------");
}

// Func init MQTT
void init_MQTT(void)  {
    MQTT.setServer(broker_mqtt, broker_port);
}

// Func conect to MQTT
void connect_MQTT(void){
    char mqtt_id_randomico[5] = {0};
    while (!MQTT.connected()){
        Serial.print("Connecting to MQTT: ");
        Serial.println(broker_mqtt);

        /* id mqtt random */
        randomSeed(random(9999));
        sprintf(mqtt_id_randomico, "%ld", random(9999));

        if (MQTT.connect(mqtt_id_randomico, MQTT_USERNAME, MQTT_PASSWORD)){
            Serial.println("Successful connection to MQTT");
            Serial.println("----------");
        }
        else{
            Serial.println("Failed to connect to MQTT...");
            Serial.println("Retry in 5s...");
            delay(5000);
        }
    }
}


// Func send data to TagoIO (MQTT)
void send_data_iot_platform(void){


    temperature_read = dht.readTemperature();
    humidity_read = dht.readHumidity();
    emon5.calcVI(10,100);
    voltage_read = emon5.Vrms;
    //voltage_read = 127;

if((millis() - millis_Time) > 3000) {

    Serial.print("Temp: ");
    Serial.print(temperature_read,1);
    Serial.print("°C;\t");
    Serial.print("Humidity: ");
    Serial.print(humidity_read,0);
    Serial.print("%\t");
    Serial.print("Voltage: ");
    Serial.print(voltage_read,1);
    Serial.println("V");



    // send temperature
    char temperature[250] = {0};
    StaticJsonDocument <250> tago_json_temperature;
    tago_json_temperature["variable"] = "temperature";
    tago_json_temperature["unit"] = "C";
    tago_json_temperature["value"] = temperature_read;
    memset(temperature, 0, sizeof(temperature));
    serializeJson(tago_json_temperature, temperature);
    MQTT.publish(MQTT_PUB_TOPIC, temperature);

    // send humidity
    char humidity[250] = {0};
    StaticJsonDocument <250> tago_json_humidity;
    tago_json_humidity["variable"] = "humidity";
    tago_json_humidity["unit"] = "%";
    tago_json_humidity["value"] = humidity_read;
    memset(humidity, 0, sizeof(humidity));
    serializeJson(tago_json_humidity, humidity);
    MQTT.publish(MQTT_PUB_TOPIC, humidity);


    // send voltage
    char voltage[250] = {0};
    StaticJsonDocument <250> tago_json_voltage;
    tago_json_voltage["variable"] = "voltage";
    tago_json_voltage["unit"] = "V";
    tago_json_voltage["value"] = voltage_read;
    memset(voltage, 0, sizeof(voltage));
    serializeJson(tago_json_voltage, voltage);
    MQTT.publish(MQTT_PUB_TOPIC, voltage);

    millis_Time = millis();
  }
}

Hello Gianferrari, thanks for reaching our Community and congratulations for your first post!

We’ve got a few articles about MQTT that may be very helpful to you, did you check them already?

Tago Experts are coming to take a better look into your question as well!