Lettura sdm630 con wemos d1 mini

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...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.