Sto cercando di leggere i dati da un contatore Sdm630 ed inviarli ad emoncms tramite mqtt. sto usando questo sketch che funziona per circa un giorno e mezzo poi smette di inviare i dati tramite mqtt, ma continua a leggere i dati dal contatore visto che vedo i led rx-tx del modulo rs485 che lampeggiano ogni 5 secondi.
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <PubSubClient.h>
#include <SDM.h>
#ifndef STASSID
#define STASSID "xxxxx"
#define STAPSK "xxxxx"
#endif
#define NBREG 9 //number of sdm registers to read
const char* ssid = STASSID;
const char* password = STAPSK;
const char* host = "SDM630-";
// Mqtt
const char* mqttServer = "192.168.1.109";
const int mqttPort = 1883;
const char* mqttUser = "xxxxx";
const char* mqttPassword = "xxxxx";
const char* topic = "emon/Sdm630";
WiFiClient espClient;
PubSubClient client(espClient);
// SDM configure
#if !defined ( USE_HARDWARESERIAL )
#error "This example works with Hardware Serial on esp8266, please uncomment #define USE_HARDWARESERIAL in SDM_Config_User.h"
#endif
SDM sdm(Serial, 9600, NOT_A_PIN, SERIAL_8N2, false);
int led_pin = LED_BUILTIN;
#define N_DIMMERS 3
int dimmer_pin[] = {14, 5, 15};
// -------------------------------------------------------------------------------------
typedef volatile struct {
volatile float regvalarr;
const uint16_t regarr;
} sdm_struct;
volatile sdm_struct sdmarr[NBREG] = {
{0.00, SDM_PHASE_1_VOLTAGE}, //V
{0.00, SDM_PHASE_2_VOLTAGE}, //V
{0.00, SDM_PHASE_3_VOLTAGE}, //V
{0.00, SDM_PHASE_1_POWER}, //W
{0.00, SDM_PHASE_2_POWER}, //W
{0.00, SDM_PHASE_3_POWER}, //W
{0.00, SDM_L1_IMPORT_ACTIVE_ENERGY}, //Kwh
{0.00, SDM_L2_IMPORT_ACTIVE_ENERGY}, //Kwh
{0.00, SDM_L3_IMPORT_ACTIVE_ENERGY} //Kwh
};
//------------------------------------------------------------------
void setup() {
pinMode(LED_BUILTIN,OUTPUT);
sdm.begin();
//Serial.begin(115200);
/* switch on led */
pinMode(led_pin, OUTPUT);
digitalWrite(led_pin, LOW);
//Serial.println("Booting");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
WiFi.begin(ssid, password);
//Serial.println("Retrying connection...");
}
client.setServer(mqttServer, mqttPort);
// client.setCallback(callback);
while (!client.connected()) {
//Serial.println("Connecting to MQTT...");
if (client.connect("ESP8266Client", mqttUser, mqttPassword )) {
//Serial.println("connected");
} else {
//Serial.print("failed with state ");
//Serial.print(client.state());
delay(2000);
}
}
/* switch off led */
digitalWrite(led_pin, HIGH);
/* configure dimmers, and OTA server events */
analogWriteRange(1000);
analogWrite(led_pin, 990);
for (int i = 0; i < N_DIMMERS; i++) {
pinMode(dimmer_pin[i], OUTPUT);
analogWrite(dimmer_pin[i], 50);
}
ArduinoOTA.setHostname(host);
ArduinoOTA.onStart([]() { // switch off all the PWMs during upgrade
for (int i = 0; i < N_DIMMERS; i++) {
analogWrite(dimmer_pin[i], 0);
}
analogWrite(led_pin, 0);
});
ArduinoOTA.onEnd([]() { // do a fancy thing with our board led at end
for (int i = 0; i < 30; i++) {
analogWrite(led_pin, (i * 100) % 1001);
delay(50);
}
});
ArduinoOTA.onError([](ota_error_t error) {
(void)error;
ESP.restart();
});
/* setup the OTA server */
ArduinoOTA.begin();
//Serial.println("Ready");
}
void loop() {
ArduinoOTA.handle();
if (WiFi.status() != WL_CONNECTED){
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
//Serial.println("Connecting to WiFi..");
}
while (!client.connected()) {
//Serial.println("Connecting to MQTT...");
if (client.connect("ESP8266Client", mqttUser, mqttPassword )) {
//Serial.println("connected");
} else {
//Serial.print("failed with state ");
//Serial.print(client.state());
delay(2000);
}
}
}
//leggere qui
float tmpval = NAN;
//digitalWrite(LED_BUILTIN,LOW);
for (uint8_t i = 0; i < NBREG; i++) {
tmpval = sdm.readVal(sdmarr[i].regarr);
if (isnan(tmpval))
sdmarr[i].regvalarr = 0.00;
else
sdmarr[i].regvalarr = tmpval;
yield();
}
//digitalWrite(LED_BUILTIN,HIGH);
char msg_payload[150];
//sprintf(msg_payload, "{\"L1_Voltage\":%f,\"L2_Voltage\":%f\"L3_Voltage\":%f,\"L1_Power\":%f,\"L2_Power\":%f,\"L3_Power\":%f}",l1_voltage,l2_voltage,l3_voltage,l1_power,l2_power,l3_power);
sprintf(msg_payload, "{\"L1_Volt\":%f,\"L2_Volt\":%f,\"L3_Volt\":%f,\"L1_Watt\":%f,\"L2_Watt\":%f,\"L3_Watt\":%f,\"L1_Kwh\":%f,\"L2_Kwh\":%f,\"L3_Kwh\":%f}",sdmarr[0].regvalarr,sdmarr[1].regvalarr,sdmarr[2].regvalarr,sdmarr[3].regvalarr,sdmarr[4].regvalarr,sdmarr[5].regvalarr,sdmarr[6].regvalarr,sdmarr[7].regvalarr,sdmarr[8].regvalarr);
client.publish(topic,msg_payload);
delay(5000);
}
nel loop il ciclo di lettura dovrebbe essere eseguito solo se il wemos non rimane bloccato nel while della connessione al wifi o nel while della connessione al broker mqtt, questo sembra non avvenire visto che continuo a vedere i led del rs485 lampeggiare. fatto sta che dopo circa un giorno e mezzo i dati mqtt non vengono piu inviati.
ho commentato tutti i serial perche i pin rx tx del wemos sono collegati al modulo rs485.
qualcuno sa darmi una mano...