No recibo todos los valores emitidos por mi Arduino por puerto serie

hola, disulpen soy nuevo aquí y no conozco las normas si quebranto alguna espero me puedan disculpar, bueno entrando al tema lo que sucede es que desde mi Arduino envío valores flotantes que previamente los transformo a tipo String en forma de cadena y con separadores, pero el problema es que cuando lo recibo en mi NodeMCU solamente recibo unos pocos valores y los demás se pierden, lo que me dificulta al momento de separar cada valor y guardarlo en una nueva variable, me gustaría que me puedan ayudar un poco ya que no entiendo mucho de la programación de ante mano muchas gracias. Les adjunto una parte del código del Arduino y del NodeMCU para que me puedan guiar de mejor manera, de antemano muchas gracias y disculpen las molestias.

Codigo Arduino

#include <SoftwareSerial.h> // librería para comunicación por puerto Serie
#include "EmonLib.h"   // librería proveniente de Open Energy Monitor
EnergyMonitor emon1;  // crea una instancia carga 1
EnergyMonitor emon2; // crea una instancia carga 2
EnergyMonitor emon3;// crea una instancia carga 3
EnergyMonitor emon4;// crea una instancia carga 4
EnergyMonitor emon5;// crea una instancia carga 5

//pines digitales del Arduino Mega
const byte espRx = 10;
const byte espTx = 11;

//Declaración de variables Carga1
float Irms1 = 0;
float Vrms1 = 0;
float fp1 = 0;
float P1 = 0;
float Energia_actualKWh1 = 0;

//Declaración de variables Carga2
float Irms2 = 0;
float Vrms2 = 0;
float fp2 = 0;
float P2 = 0;
float Energia_actualKWh2 = 0;

//Declaración de variables Carga3
float Irms3 = 0;
float Vrms3 = 0;
float fp3 = 0;
float P3 = 0;
float Energia_actualKWh3 = 0;

//Declaración de variables Carga4
float Irms4 = 0;
float Vrms4 = 0;
float fp4 = 0;
float P4 = 0;
float Energia_actualKWh4 = 0;

//Declaración de variables Carga5
float Irms5 = 0;
float Vrms5 = 0;
float fp5 = 0;
float P5 = 0;
float Energia_actualKWh5 = 0;

SoftwareSerial SerialEsp(espRx, espTx); // Comunicación Serial con el módulo NodeMcu Rx, Tx
// ejecución del loop
long tiempoLoopinicio = 0;
long tiempoLoopactual = 0;
const int tiempoestablecidoloop = 1500; // 1.5s

// tiempo para enviar los datos al NodeMcu por puerto serie
long tiempoSerialinicio = 0;
long tiempoSerialactual = 0;
const int tiempoestablecidoserial = 1500;

void setup() {
  emon1.voltage(5, 48.97, 1.7); // sensor de voltaje: pin analógico, factor de calibración, constante de cambio de fase 65.97// carga1
  emon1.current(0, 14.34); //sensor de corriente: pin analógico, factor de calibración)
  emon2.voltage(6, 48.97, 1.7); // sensor de voltaje: pin analógico, factor de calibración, constante de cambio de fase 65.97 //carga2
  emon2.current(1, 14.34); //sensor de corriente: pin analógico, factor de calibración)
  emon3.voltage(7, 65.97, 1.7); // 63.45 sensor de voltaje: pin analógico, factor de calibración, constante de cambio de fase 65.97
  emon3.current(2, 14.46); //sensor de corriente: pin analógico, factor de calibración)
  emon4.voltage(8, 65.97, 1.7); // 63.45 sensor de voltaje: pin analógico, factor de calibración, constante de cambio de fase 65.97
  emon4.current(3, 14.46); //sensor de corriente: pin analógico, factor de calibración)
  emon5.voltage(9, 65.97, 1.7); // 63.45 sensor de voltaje: pin analógico, factor de calibración, constante de cambio de fase 65.97
  emon5.current(4, 14.46); //sensor de corriente: pin analógico, factor de calibración)

  Serial.begin(115200); // velocidad por puerto serie del arduino
  SerialEsp.begin(115200); // velocidad por puerto serie del NodeMCU
  tiempoLoopinicio = millis();
  tiempoSerialinicio = tiempoestablecidoloop;

}

void loop() {

  tiempoLoopactual = millis();
  if (tiempoLoopactual - tiempoLoopinicio >= tiempoestablecidoloop) {
    emon1.calcVI(20, 2000); // cálculo de los cruces por cero carga1
    Irms1  = emon1.Irms;
    Vrms1  = emon1.Vrms;
    fp1  = emon1.powerFactor;
    P1 = Irms1 * Vrms1 * fp1;
    Energia_actualKWh1 = Energia_actualKWh1 + ((P1 * 0.000277778) / 1000);

    emon2.calcVI(20, 2000); // cálculo de los cruces por cero carga2
    Irms2  = emon2.Irms;
    Vrms2  = emon2.Vrms;
    fp2  = emon2.powerFactor;
    P2 = Irms2 * Vrms2 * fp2;
    Energia_actualKWh2 = Energia_actualKWh2 + ((P2 * 0.000277778) / 1000);

    emon3.calcVI(20, 2000); // cálculo de los cruces por cero carga2
    Irms3  = emon3.Irms;
    Vrms3  = emon3.Vrms;
    fp3  = emon3.powerFactor;
    P3 = Irms2 * Vrms3 * fp3;
    Energia_actualKWh3 = Energia_actualKWh3 + ((P3 * 0.000277778) / 1000);

    emon4.calcVI(20, 2000); // cálculo de los cruces por cero carga2
    Irms4  = emon4.Irms;
    Vrms4  = emon4.Vrms;
    fp4  = emon4.powerFactor;
    P4 = Irms4 * Vrms4 * fp4;
    Energia_actualKWh4 = Energia_actualKWh4 + ((P4 * 0.000277778) / 1000);

    emon5.calcVI(20, 2000); // cálculo de los cruces por cero carga2
    Irms5  = emon5.Irms;
    Vrms5  = emon5.Vrms;
    fp5  = emon5.powerFactor;
    P5 = Irms5 * Vrms5 * fp5;
    Energia_actualKWh5 = Energia_actualKWh5 + ((P5 * 0.000277778) / 1000);

    tiempoLoopinicio = millis();
  }
  tiempoSerialactual = millis();
  if (tiempoSerialactual - tiempoSerialinicio >= tiempoestablecidoserial) {
    enviar_datos ();// enviar datos al NodeMCU
    tiempoSerialinicio = millis(); // reseteo del puerto serial
  }

}

// envío de los datos de arduino en modo string por puerto serie al NodeMCU
void enviar_datos() {
  emon1.calcVI(20, 2000); // cálculo de los cruces por cero carga1
  Irms1  = emon1.Irms;
  Vrms1  = emon1.Vrms;
  fp1  = emon1.powerFactor;
  P1 = Irms1 * Vrms1 * fp1;
  Energia_actualKWh1 = Energia_actualKWh1 + ((P1 * 0.000277778) / 1000);

  emon2.calcVI(20, 2000); // cálculo de los cruces por cero carga2
  Irms2  = emon2.Irms;
  Vrms2  = emon2.Vrms;
  fp2  = emon2.powerFactor;
  P2 = Irms2 * Vrms2 * fp2;
  Energia_actualKWh2 = Energia_actualKWh2 + ((P2 * 0.000277778) / 1000);

  emon3.calcVI(20, 2000); // cálculo de los cruces por cero carga2
  Irms3  = emon3.Irms;
  Vrms3  = emon3.Vrms;
  fp3  = emon3.powerFactor;
  P3 = Irms2 * Vrms3 * fp3;
  Energia_actualKWh3 = Energia_actualKWh3 + ((P3 * 0.000277778) / 1000);

  emon4.calcVI(20, 2000); // cálculo de los cruces por cero carga2
  Irms4  = emon4.Irms;
  Vrms4  = emon4.Vrms;
  fp4  = emon4.powerFactor;
  P4 = Irms4 * Vrms4 * fp4;
  Energia_actualKWh4 = Energia_actualKWh4 + ((P4 * 0.000277778) / 1000);

  emon5.calcVI(20, 2000); // cálculo de los cruces por cero carga2
  Irms5  = emon5.Irms;
  Vrms5  = emon5.Vrms;
  fp5  = emon5.powerFactor;
  P5 = Irms5 * Vrms5 * fp5;
  Energia_actualKWh5 = Energia_actualKWh5 + ((P5 * 0.000277778) / 1000);

  String s_Corriente1 = String (Irms1);
  String s_Voltaje1 = String (Vrms1);
  String s_Potencia1 = String (P1);
  String s_Consumo1 = String (Energia_actualKWh1);
  String s_Fp1 = String (fp1);
  String s_Corriente2 = String (Irms2);
  String s_Voltaje2 = String (Vrms2);
  String s_Potencia2 = String (P2);
  String s_Consumo2 = String (Energia_actualKWh2);
  String s_Fp2 = String (fp2);
  String s_Corriente3 = String (Irms3);
  String s_Voltaje3 = String (Vrms3);
  String s_Potencia3 = String (P3);
  String s_Consumo3 = String (Energia_actualKWh3);
  String s_Fp3 = String (fp3);
  String s_Corriente4 = String (Irms4);
  String s_Voltaje4 = String (Vrms4);
  String s_Potencia4 = String (P4);
  String s_Consumo4 = String (Energia_actualKWh4);
  String s_Fp4 = String (fp4);
  String s_Corriente5 = String (Irms5);
  String s_Voltaje5 = String (Vrms5);
  String s_Potencia5 = String (P5);
  String s_Consumo5 = String (Energia_actualKWh5);
  String s_Fp5 = String (fp5);

  SerialEsp.println (s_Corriente1 + "_" + s_Voltaje1 + "_" + s_Potencia1 + "_" + s_Consumo1 + "_" + s_Fp1 + "_" + s_Corriente2 + "_" + s_Voltaje2 + "_" + s_Potencia2 + "_" + s_Consumo2 + "_" + s_Fp2+ "_" + s_Corriente3 + "_" + s_Voltaje3 + "_" + s_Potencia3 + "_" + s_Consumo3 + "_" + s_Fp3+ "_" + s_Corriente4 + "_" + s_Voltaje4 + "_" + s_Potencia4 + "_" + s_Consumo4 + "_" + s_Fp4+ "_" + s_Corriente5 + "_" + s_Voltaje5 + "_" + s_Potencia5 + "_" + s_Consumo5 + "_" + s_Fp5 );
  Serial.println (s_Corriente1 + "_" + s_Voltaje1 + "_" + s_Potencia1 + "_" + s_Consumo1 + "_" + s_Fp1 + "_" + s_Corriente2 + "_" + s_Voltaje2 + "_" + s_Potencia2 + "_" + s_Consumo2 + "_" + s_Fp2+ "_" + s_Corriente3 + "_" + s_Voltaje3 + "_" + s_Potencia3 + "_" + s_Consumo3 + "_" + s_Fp3+ "_" + s_Corriente4 + "_" + s_Voltaje4 + "_" + s_Potencia4 + "_" + s_Consumo4 + "_" + s_Fp4+ "_" + s_Corriente5 + "_" + s_Voltaje5 + "_" + s_Potencia5 + "_" + s_Consumo5 + "_" + s_Fp5 );
}

Codigo NodeMCU

#include <ESP8266WiFi.h>
#include <PubSubClient.h>  // libreria para publicar y recibir información 
#include <SoftwareSerial.h>
#include "UbidotsESPMQTT.h"

#define  NoWifi  0
#define  Wifi  1
#define  MqttWifi  2
#define WIFINAME "CESAR" //Your SSID
#define WIFIPASS "1796#2019#" // Your Wifi Pass
#define TOKEN "xxxxxxxxxxxxxxxxxxxxxxxxxxx" // Ubidots TOKEN

long TiempoMqttReconectar = 0;
long TiempoMensaje = 0;

boolean ConectarWifi = false;
boolean ConectarMqtt = false;
int EstadoWifi = NoWifi;
// variables carga1
int control1 = 0;
char datos[50];
char datos1[50];
char datos2[50];
char datos3[50];
char datos4[50];
// variables carga2
int control2 = 2;
char datos5[50];
char datos6[50];
char datos7[50];
char datos8[50];
char datos9[50];
// variables carga3
int control3 = 14;
char datos10[50];
char datos11[50];
char datos12[50];
char datos13[50];
char datos14[50];
// variables carga4
int control4 = 12;
char datos15[50];
char datos16[50];
char datos17[50];
char datos18[50];
char datos19[50];
// variables carga5
int control5 = 13;
char datos20[50];
char datos21[50];
char datos22[50];
char datos23[50];
char datos24[50];

const char * ssid = "CESAR";
const char * password = "1796#2019#";
const char * mqtt_server = "192.168.1.26";
const char* TopicoControl1 = "Medidor/Carga1/control1";
const char* TopicoControl2 = "Medidor/Carga2/control2";
const char* TopicoControl3 = "Medidor/Carga3/control3";
const char* TopicoControl4 = "Medidor/Carga4/control4";
const char* TopicoControl5 = "Medidor/Carga5/control5";
const char* host = "192.168.1.26"; // cmd -> ipconfig
const uint16_t port = 80;
const byte espRx = 5;
const byte espTx = 4;

WiFiClient espClient;
PubSubClient client(espClient);
Ubidots Client(TOKEN);
SoftwareSerial SerialEsp(espRx, espTx); // RX, TX  Nodemcu => D1->5, D2->4

bool received = false;
String receivedMsg;
// variables carga1
String s_Corriente1;
String s_Voltaje1;
String s_Potencia1;
String s_Consumo1;
String s_Fp1;
float Corriente1 = 0.0;
float Voltaje1 = 0.0;
float Potencia1 = 0.0;
float Consumo1 = 0.0;
float Fp1 = 0.0;
// variables carga2
String s_Corriente2;
String s_Voltaje2;
String s_Potencia2;
String s_Consumo2;
String s_Fp2;
float Corriente2 = 0.0;
float Voltaje2 = 0.0;
float Potencia2 = 0.0;
float Consumo2 = 0.0;
float Fp2 = 0.0;

// variables carga3
String s_Corriente3;
String s_Voltaje3;
String s_Potencia3;
String s_Consumo3;
String s_Fp3;
float Corriente3 = 0.0;
float Voltaje3 = 0.0;
float Potencia3 = 0.0;
float Consumo3 = 0.0;
float Fp3 = 0.0;
// variables carga4
String s_Corriente4;
String s_Voltaje4;
String s_Potencia4;
String s_Consumo4;
String s_Fp4;
float Corriente4 = 0.0;
float Voltaje4 = 0.0;
float Potencia4 = 0.0;
float Consumo4 = 0.0;
float Fp4 = 0.0;
// variables carga5
String s_Corriente5;
String s_Voltaje5;
String s_Potencia5;
String s_Consumo5;
String s_Fp5;
float Corriente5 = 0.0;
float Voltaje5 = 0.0;
float Potencia5 = 0.0;
float Consumo5 = 0.0;
float Fp5 = 0.0;
const byte numVars = 25;
String controlledVars[] = {s_Corriente1, s_Voltaje1, s_Potencia1, s_Consumo1, s_Fp1, s_Corriente2, s_Voltaje2, s_Potencia2, s_Consumo2, s_Fp2, s_Corriente3, s_Voltaje3, s_Potencia3, s_Consumo3, s_Fp3, s_Corriente4, s_Voltaje4, s_Potencia4, s_Consumo4, s_Fp4, s_Corriente5, s_Voltaje5, s_Potencia5, s_Consumo5, s_Fp5};

void checkSerialCom() {
  char data;
  if (SerialEsp.available() > 0)
  { // Checks whether data is comming from the serial port
    while (SerialEsp.available() > 0)
    {
      data = (char)SerialEsp.read(); //
      receivedMsg += data;        //
    }
    received = true;
  }
}

void ProcessMsg() {
  receivedMsg.trim();
  Serial.println("Recibido: ");
  Serial.println(receivedMsg);
  int index;
  for (size_t i = 0; i < numVars; i++) {
    index = receivedMsg.indexOf('_');
    controlledVars[i] = receivedMsg.substring(0, index);
    receivedMsg = receivedMsg.substring(index + 1);
    Serial.println(controlledVars[i]);
  }

//separación de variables
  s_Corriente1 = controlledVars[0];
  s_Voltaje1 = controlledVars[1];
  s_Potencia1 = controlledVars[2];
  s_Consumo1 = controlledVars[3];
  s_Fp1 = controlledVars[4];
  s_Corriente2 = controlledVars[5];
  s_Voltaje2 = controlledVars[6];
  s_Potencia2 = controlledVars[7];
  s_Consumo2 = controlledVars[8];
  s_Fp2 = controlledVars[9];
  s_Corriente3 = controlledVars[10];
  s_Voltaje3 = controlledVars[11];
  s_Potencia3 = controlledVars[12];
  s_Consumo3 = controlledVars[13];
  s_Fp3 = controlledVars[14];
  s_Corriente4 = controlledVars[15];
  s_Voltaje4 = controlledVars[16];
  s_Potencia4 = controlledVars[17];
  s_Consumo4 = controlledVars[18];
  s_Fp4 = controlledVars[19];
  s_Corriente5 = controlledVars[20];
  s_Voltaje5 = controlledVars[21];
  s_Potencia5 = controlledVars[22];
  s_Consumo5 = controlledVars[23];
  s_Fp5 = controlledVars[24];

}

Si hubieras leído las normas del foro sabrías que tienes que poner el código con etiquetas.
Edita tu mensaje para poner el código correctamente.

No veo donde limpias el String receivedMsg
También puede que estés vaciando el buffer antes de que el otro arduino acabe de enviar toda la información, prueba con un un timeout de 100 o 200ms para ver si el fallo te viene por ahí.
Te recomiendo un carácter de fin de trama para saber cuando a acabado y poder cortar ese bucle.

Están disponibles en todas las secciones del foro, si no las conoces es porque no has querido tomarte 5 minutos para leerlas.
Por favor adjunta el código como corresponde.

Por otro lado no queda claro cuál es el separador entre los valores que envía el arduino, aparece como dobles comillas "" (o sea que no habría separador) pero si edito parece que en realidad entre las comillas habría un asterisco "*". ¿Ves por qué se pide poner el código como corresponde?
Ahora, sea uno u otro caso, el primer problema grave que veo es

index = receivedMsg.indexOf('_');

ya que estarías buscando un separador que, en principio, parecería no ser ese.

hola krnlpanic muchas gracias por responder disculpa cuando leiste el post no estaba correctamente pero ya lo cambie de acuerdo a las normas, al hablar de limpiar el string receivedMsg debo ponerlo en un caso else con receivedMsg== ""; ? y lo del tiempo de delay(100) desde el arduino verdad?, eso de un caracter de fin de trama no le entiendo bonito me podrias explicar un poco

El código del arduino no esta completo.
En un NUEVO post, adjunta el código completo del arduino, asi podemos constatar la velocidad del puerto serie y tal vez alguien quiera reproducir lo que estas haciendo.
Cuando lo vea te daré mi opinión por ahora las que te han dado estan en la dirección correcta.
Los datos enviados deberian tener un protocolo, algo como
I1x.xx,V1xxx.x,P1xxx.x,I2x.xx,V2xxx.x,P2xxx.x y seguimos
donde I es Corriente 1 es el orden x.xx 9.99 Amperes
donde V es tensión 1 es el orden xxx.x 999.9 voltios
donde P es Potencia 1 es el orden 999.9 wats
y todo separado por comas.

Para limpiar el string

receivedMsg = "";

Hazlo cuando proceses por completo lo recibido.

Google es un gran amigo, cuando no entiendas algo búscalo que tendrás muchas respuestas de gente que ya lo ha consultado.
"arduino limpiar string" o en inglés "arduino clear string"

Evita usar delay ya que detiene por completo el programa debes hacerlo con millis(), revisa la sección de documentación y en el IDE de Arduino tienes el ejemplo BlinkWithoutDelay dándole a archivo, ejemplos, digital.

Con el fin de trama me refiero a un carácter que no vayas a usar en los datos transmitidos para detectar que ya no hay mas datos.

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