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];
}