Problema con SCADA ACIMUT MONITORIZA

Hola buenos días a todos. Tengo una duda con un SCADA que estoy haciendo y que no termina de funcionarme. Consta de dos termpares y un pHmetro. He conseguido incluir y que funcionen los dos termopares, pero no consigo que lea lo que manda la señal del pHmetro. El pHmetro manda señal a TX3 y RX3 (por el puerto serie) y se que funciona bien porque probandolo sin ACIMUT y demás va bien. El tema es que es incompatible la función regs con la variable Strings que necesita el pHmetro. Me salta el error al compilar es “error: cannot convert ‘String’ to ‘int’ in assignment”.
Entonces quería saber si hay alguna manera de que ACIMUT lea sin la función regs, o si puede leer el pHmetro por el puerto serie sin la variable String. Os dejo la parte del programa. Muchas gracias

#include <Adafruit_MAX31856.h>
Adafruit_MAX31856 max_A = Adafruit_MAX31856(10, 11, 12, 13);
Adafruit_MAX31856 max_B = Adafruit_MAX31856(9, 11, 12, 13);
String termoparstring_A = "";
String termoparstring_B = "";
String inputstring = "";
String sensorstring = "";
String inputstring1 = "";
String sensorstring1 = "";
boolean input_string_complete = false;
boolean sensor_string_complete = false;
boolean input_string_complete1 = false;
boolean sensor_string_complete1 = false;
void configure_mb_slave(long baud, char parity, char txenpin);

int update_mb_slave(unsigned char slave, int *regs, unsigned int regs_size);
enum {
        COMM_BPS = 9600,
        MB_SLAVE = 1,
        PARITY = 'n'
};

enum {
        T_1,
        T_2,
        pH_1,
        MB_REGS
};

int regs[MB_REGS];
unsigned long wdog = 0;
unsigned long tprev = 0;

void setup() {
          configure_mb_slave(COMM_BPS, PARITY, 0);
        Serial3.begin(9600);
         inputstring.reserve(30);
         sensorstring.reserve(60);
         inputstring1.reserve(30);
        sensorstring1.reserve(60);
        max_A.begin();
        max_A.setThermocoupleType(MAX31856_TCTYPE_K);
        max_B.begin();
        max_B.setThermocoupleType(MAX31856_TCTYPE_K);
}

void serialEvent() {
  inputstring = Serial3.readStringUntil(13);
  input_string_complete = true;

}


void serialEvent3() {
  sensorstring = Serial3.readStringUntil(13);
  sensor_string_complete = true;

}

void loop() {
        update_mb_slave(MB_SLAVE, regs, MB_REGS);
        termoparstring_A =(max_A.readThermocoupleTemperature());
        termoparstring_B =(max_B.readThermocoupleTemperature());
        regs [T_1] = (max_A.readThermocoupleTemperature()*100);         // ec. del sensor y *100.0 para que aparezcan decimales en el SCADA
        regs [T_2] = (max_B.readThermocoupleTemperature()*100);         // ec. del sensor y *100.0 para que aparezcan decimales en el SCADA
        regs [pH_1] = (sensorstring);

  }

Muchísimas gracias de antemano. Soy un poco novato en el tema Arduino.

Bueno no digo que este resuelto porque luego me da otro error al compilar pero me debe faltar alguna librería

corrige esta linea final

regs[pH_1] = sensorstring.toInt();

surbyte:
Bueno no digo que este resuelto porque luego me da otro error al compilar pero me debe faltar alguna librería

corrige esta linea final

regs[pH_1] = sensorstring.toInt();

Muchisimas gracias surbyte. Ahora ya he conseguido solucionar ese tema y ya tengo los dos termopares y el pHmetro funcionando finalmente. He tenido que modificar alguna cosilla pero todo OK. Tengo una duda, que es importante para el proyecto. Al convertir a INT es normal que no marque decimales? O hay alguna manera de cambiar eso y que muestre al menos un decimal o dos? Siento si la pregunta es muy tonta jajaja. Muchas gracias de antemano y de nuevo gracias por la ayuda.
Dejo el código final:
*Edito: La idea que se me ha ocurrido es cuando lee el valor de sensorstring (sensorstring = Serial3.readStringUntil(13); ) si pudiera multiplicarlo por 100 ya cogería ese valor entero. Luego solo tendría que dividirlo entre 100 en la parte de "regs [pH_1] = (sensorstring.toInt()*100); " y ya lo tendría, creo. Pero no puedo, o no se, hacerlo para que lo multiplique porque me da error…

#include <Adafruit_MAX31856.h>
Adafruit_MAX31856 max_A = Adafruit_MAX31856(10, 11, 12, 13);
Adafruit_MAX31856 max_B = Adafruit_MAX31856(9, 11, 12, 13); 
String termoparstring_A = "";
String termoparstring_B = "";  
String inputstring = "";   
String sensorstring = "";
String inputstring1 = "";  
String sensorstring1 = "";  
boolean input_string_complete = false;                
boolean sensor_string_complete = false;  
boolean input_string_complete1 = false;                
boolean sensor_string_complete1 = false;       
void configure_mb_slave(long baud, char parity, char txenpin);

int update_mb_slave(unsigned char slave, int *regs, unsigned int regs_size);
enum {
        COMM_BPS = 9600, 
        MB_SLAVE = 1,	 
        PARITY = 'n'     
};

enum {        
        T_1,
        T_2,
        pH_1,  
        MB_REGS	 	 
};

int regs[MB_REGS];
unsigned long wdog = 0;         
unsigned long tprev = 0;         

void setup() {
          configure_mb_slave(COMM_BPS, PARITY, 0);
          Serial3.begin(9600);
          Serial1.begin(9600);
         inputstring.reserve(30);                            
         sensorstring.reserve(60);
         inputstring1.reserve(30);                            
        sensorstring1.reserve(60);
        max_A.begin();
        max_A.setThermocoupleType(MAX31856_TCTYPE_K);
        max_B.begin();
        max_B.setThermocoupleType(MAX31856_TCTYPE_K);
}
                          
void serialEvent() {                                  
  inputstring = Serial1.readStringUntil(13);          
  input_string_complete = true;  
                
}


void serialEvent3() {                                 
  sensorstring = Serial3.readStringUntil(13);         
  sensor_string_complete = true; 
                      
}

void loop() {
        update_mb_slave(MB_SLAVE, regs, MB_REGS);
        termoparstring_A =(max_A.readThermocoupleTemperature());
        termoparstring_B =(max_B.readThermocoupleTemperature());
      if (sensor_string_complete == true) {  
        regs [T_1] = (max_A.readThermocoupleTemperature()*100);         // ec. del sensor y *100.0 para que aparezcan decimales en el SCADA 
        regs [T_2] = (max_B.readThermocoupleTemperature()*100);         // ec. del sensor y *100.0 para que aparezcan decimales en el SCADA 
        regs [pH_1] = (sensorstring.toInt()*100); 
    
      }
  sensorstring = "";
  sensorstring1 = "";                                  
  sensor_string_complete = false;
  sensor_string_complete1 = false;     
                                     
  }

Al convertir a INT es normal que no marque decimales?

Entero por definición no tiene decimales.
Float es un número real o sea tiene decimales.

Creo que estas errando el enfoque.
Mirando la librería me encuentro conque

float Adafruit_MAX31856::readThermocoupleTemperature(void) {
  oneShotTemperature();

  int32_t temp24 = readRegister24(MAX31856_LTCBH_REG);
  if (temp24 & 0x800000) {
    temp24 |= 0xFF000000;  // fix sign
  }

  temp24 >>= 5;  // bottom 5 bits are unused

  float tempfloat = temp24;
  tempfloat *= 0.0078125;

  return tempfloat;
}

El procedimiento devuelve un float que es lo que buscas. Para qué entonces definiste la variable como String? Seguro por desconocimiento.

Modifico tu código para que veas decimales.
Verifica su funcionamiento por favor…

#include <Adafruit_MAX31856.h>
Adafruit_MAX31856 max_A = Adafruit_MAX31856(10, 11, 12, 13);
Adafruit_MAX31856 max_B = Adafruit_MAX31856(9, 11, 12, 13); 

float termoparfloat_A;
float termoparfloat_B;

String inputstring = "";   
String sensorstring = "";

String inputstring1 = "";  
String sensorstring1 = "";  

boolean input_string_complete = false;                
boolean sensor_string_complete = false;  
boolean input_string_complete1 = false;                
boolean sensor_string_complete1 = false;       
void configure_mb_slave(long baud, char parity, char txenpin);

int update_mb_slave(unsigned char slave, int *regs, unsigned int regs_size);
enum {
        COMM_BPS = 9600, 
        MB_SLAVE = 1,  
        PARITY = 'n'     
};

enum {        
        T_1,
        T_2,
        pH_1,  
        MB_REGS    
};

int regs[MB_REGS];
unsigned long wdog = 0;         
unsigned long tprev = 0;         

void setup() {
    configure_mb_slave(COMM_BPS, PARITY, 0);
    Serial3.begin(9600);
    Serial1.begin(9600);
    inputstring.reserve(30);                            
    sensorstring.reserve(60);
    inputstring1.reserve(30);                            
    sensorstring1.reserve(60);
    max_A.begin();
    max_A.setThermocoupleType(MAX31856_TCTYPE_K);
    max_B.begin();
    max_B.setThermocoupleType(MAX31856_TCTYPE_K);
}
                          
void serialEvent() {                                  
    inputstring = Serial1.readStringUntil(13);          
    input_string_complete = true;              
}


void serialEvent3() {                                 
  sensorstring = Serial3.readStringUntil(13);         
  sensor_string_complete = true; 
}

void loop() {
    update_mb_slave(MB_SLAVE, regs, MB_REGS);
    termoparfloat_A = max_A.readThermocoupleTemperature();
    termoparfloat_B = max_B.readThermocoupleTemperature();
    if (sensor_string_complete == true) {  
        regs [T_1] = (int) max_A.readThermocoupleTemperature()*100;         // ec. del sensor y *100.0 para que aparezcan decimales en el SCADA 
        regs [T_2] = (int) max_B.readThermocoupleTemperature()*100;         // ec. del sensor y *100.0 para que aparezcan decimales en el SCADA 
        regs [pH_1] = (sensorstring.toInt()*100);                           // no se que lee?
    }
    sensorstring    = "";
    sensorstring1   = "";                                  
    sensor_string_complete  = false;
    sensor_string_complete1 = false;                                        
}

Muchas gracias por el esfuerzo, pero los termopares los lee con decimales sin problema en el SCADA, es el pHmetro (sensorstring) lo que no lee con decimales. Porque al convertirlo a Int se los come claro. Mi pregunta era sobre sensorstring, que es lo que transformo como bien me dijiste. La librería que has modificado viene de serie para el funcionamiento de los termopares. Van conectados a una placa Thermocouple Amplifier y usa esa biblioteca para su funcionamiento. No tiene nada que ver con el pHmetro. Siento si ha suponido esfuerzo en vano compañero. Muchas gracias de todas formas. Y si, soy novato en el tema de Arduino y de su programación. He leído que quizás convirtiendo la variable String "sensorstring" a float se podría hacer algo tipo como lo que he editado en el comentario anterior....Sería:
void serialEvent4 () {
__ sensortring.toFloat () * 100;__

y
regs [pH_1] = (sensorstring.toInt () / 100);

Pero no sé si se podría, si es un disparate. Muchas gracias de antemano

No has explicado nada sobre que lee cada parte asi que es dificil sugerite.
Veo esto

sensorstring = Serial3.readStringUntil(13);

O sea que lo ingresas por serial?

Tienes toda la razón y lo siento mucho, pero al ver que el primer post que me comentaste me lo dijiste a la primera pensaba que se entendía. Muchas gracias de todos modos compañero

surbyte:
No has explicado nada sobre que lee cada parte asi que es dificil sugerite.

Si lo ingresa por serial. Yo tengo el phmetro conectado a RX3 y Tx3 (y no se puede cambiar porque lleva una plaquita conectada que así lo especifica).
Entrega los datos por serial.
Entonces al final lo que hice, como bien me indicaste, es convertir ese valor del sensorstring a int. Lo que pasa es que se come los decimales. Lo que busco,si fuera posible, es hacer que me los muestre. Por eso había pensado lo de si fuera posible multiplicar por 100 el valor que da para así al transformarlo no coma decimales (no los tendría) y luego dividirlo entre 100 a la hora de mostrarlo en pantalla. Ese proceso es el que no se me ocurre como hacerlo. Espero haberme explicado mejor y nuevamente te pido disculpas.

void serialEvent4 () { 

sensortring.toFloat () * 100;




y 


regs [pH_1] = (sensorstring.toInt () / 100);




Pero no sé si se podría, si es un disparate. Muchas gracias de antemano

Si, ese es el camino que debes seguir!!

Bueno pues en principio todo solucionado!!! Ya lo he hecho así y funciona perfecto :slight_smile: .
dejo la solución por si a alguien le interesa alguna vez:

sensorstring.toFloat()*100;
sensorstring.toInt()/100;

Y ya sería mandarlo al SCADA:

regs [pH_1] = (sensorstring.toFloat()*100);

*Para los que uséis monitoriza, poned el divisor el indicador numérico 100.

Hola muy buenas. Tengo un problema a la hora de simular el SCADA, que creo que tiene algo que ver con la temporización de la toma de datos. Me explico.
El programa usa protocolo RTU Modbus. Y la transferencia la hago en 9600 blaudios.
El probelma viene cuando simulo mi SCADA. El programa arranca y funciona perfectamente, pero al minuto o dos minutos da fallo de conexión. Como si hubiera perdido la conexión con el Arduino. Estoy volviendome loco viendo qué puede ser y no hay manera. Muchas gracias de antemano. Dejo el código completo:

#include <Adafruit_MAX31856.h>
Adafruit_MAX31856 max_A = Adafruit_MAX31856(10, 11, 12, 13);
Adafruit_MAX31856 max_B = Adafruit_MAX31856(9, 11, 12, 13); 
String termoparstring_A = "";
String termoparstring_B = "";  
String inputstring = "";   
String sensorstring = "";
String inputstring1 = "";  
String sensorstring1 = ""; 
boolean input_string_complete = false;                
boolean sensor_string_complete = false;  
boolean input_string_complete1 = false;                
boolean sensor_string_complete1 = false;       
void configure_mb_slave(long baud, char parity, char txenpin);

int update_mb_slave(unsigned char slave, int *regs, unsigned int regs_size);
enum {
        COMM_BPS = 9600, 
        MB_SLAVE = 1, 
        PARITY = 'n'     
};

enum {        
        T_1,
        T_2,
        pH_1,
        pH_2,  
        MB_REGS 
};

int regs[MB_REGS];
unsigned long wdog = 0;         
unsigned long tprev = 0;         

void setup() {
          configure_mb_slave(COMM_BPS, PARITY, 0);
          Serial3.begin(9600);
          Serial1.begin(9600);
          Serial2.begin(9600);
         inputstring.reserve(30);                            
         sensorstring.reserve(60);
         inputstring1.reserve(30);                            
        sensorstring1.reserve(60);
        max_A.begin();
        max_A.setThermocoupleType(MAX31856_TCTYPE_K);
        max_B.begin();
        max_B.setThermocoupleType(MAX31856_TCTYPE_K);
}
                          
void serialEvent() {                                  
  inputstring = Serial1.readStringUntil(13);          
  input_string_complete = true;  

}


void serialEvent3() {                                 
  sensorstring = Serial3.readStringUntil(13);         
  sensor_string_complete = true; 
  sensorstring1 = Serial2.readStringUntil(13);         
  sensor_string_complete1 = true;         
}


void loop() {
        update_mb_slave(MB_SLAVE, regs, MB_REGS);
        termoparstring_A =(max_A.readThermocoupleTemperature());
        termoparstring_B =(max_B.readThermocoupleTemperature());
    
       
        regs [T_1] = (max_A.readThermocoupleTemperature()*100);         // ec. del sensor y *100.0 para que aparezcan decimales en el SCADA 
        regs [T_2] = (max_B.readThermocoupleTemperature()*100);         // ec. del sensor y *100.0 para que aparezcan decimales en el SCADA 
        regs [pH_1] = (sensorstring.toFloat()*100); 
        regs [pH_2] = (sensorstring1.toFloat()*100); 
    
  sensorstring = "";
  sensorstring1 = "";                                  
  sensor_string_complete = false;
  sensor_string_complete1 = false;     
                                     
  }

Lo que va después es el protocolo /****************************************************************************

  • BEGIN MODBUS RTU SLAVE FUNCTIONS

No puedo ponerlo todo porque es demasiado largo y no me deja postear, pero es el que se encuentra aquí: Scada for Arduino

Es el Download SketchBook Arduino v. 1.0 lo que tengo metido.

No veo en tu porción de código cual es el pin que usas para el control RS485 del modbus?

Hola! Después de volverme loco ya se por qué falla! No era problema del protocolo sino un poco de la programación. Os cuento. El sistema tiene dos termopares y dos pHmetros. El sistema con dos termopares y un pHmetro va perfectamente y no hay problemas de interferencias ni fallos de ningún tipo. La cosa es que al conectar el segundo pHmetro como que colapsa y se va el servidor, creo que por que tiene problemas al procesas datos del RX3 TX3 y el RX2 TX2 al mismo tiempo digamos. Obviamente eso tiene que ser cuestión de hacer una programación adecuada. Y ahí es donde yo fallo…se os ocurre como hacer que no se solapen. Dejo el código: *El valor del pH metro es “sensorstring” y “sensorstring1”. Muchas gracias amigos

#include <Adafruit_MAX31856.h>
Adafruit_MAX31856 max_A = Adafruit_MAX31856(10, 11, 12, 13);
Adafruit_MAX31856 max_B = Adafruit_MAX31856(9, 11, 12, 13); 
String termoparstring_A = "";
String termoparstring_B = "";  
String inputstring = "";   
String sensorstring = "";
String inputstring1 = "";  
String sensorstring1 = ""; 
boolean input_string_complete = false;                
boolean sensor_string_complete = false;  
boolean input_string_complete1 = false;                
boolean sensor_string_complete1 = false;       
void configure_mb_slave(long baud, char parity, char txenpin);

int update_mb_slave(unsigned char slave, int *regs, unsigned int regs_size);
enum {
        COMM_BPS = 9600, 
        MB_SLAVE = 1,	 
        PARITY = 'n'     
};

enum {        
        T_1,
        T_2,
        pH_1,
        pH_2,  
        MB_REGS	 	 
};

int regs[MB_REGS];
unsigned long wdog = 0;         
unsigned long tprev = 0;         

void setup() {
          configure_mb_slave(COMM_BPS, PARITY, 0);
          Serial3.begin(9600);
          Serial1.begin(9600);
          Serial2.begin(9600);
         inputstring.reserve(30);                            
         sensorstring.reserve(60);
         inputstring1.reserve(30);                            
        sensorstring1.reserve(60);
        max_A.begin();
        max_A.setThermocoupleType(MAX31856_TCTYPE_K);
        max_B.begin();
        max_B.setThermocoupleType(MAX31856_TCTYPE_K);
}
                          
void serialEvent() {                                  
  inputstring = Serial1.readStringUntil(13);          
  input_string_complete = true;  

}


void serialEvent3() {                                 
  sensorstring = Serial3.readStringUntil(13);         
  sensor_string_complete = true; 
  sensorstring1 = Serial2.readStringUntil(13);         
  sensor_string_complete1 = true;         
}


void loop() {
        update_mb_slave(MB_SLAVE, regs, MB_REGS);
        termoparstring_A =(max_A.readThermocoupleTemperature());
        termoparstring_B =(max_B.readThermocoupleTemperature());
    
       
        regs [T_1] = (max_A.readThermocoupleTemperature()*100);         // ec. del sensor y *100.0 para que aparezcan decimales en el SCADA 
        regs [T_2] = (max_B.readThermocoupleTemperature()*100);         // ec. del sensor y *100.0 para que aparezcan decimales en el SCADA 
        regs [pH_1] = (sensorstring.toFloat()*100); 
        regs [pH_2] = (sensorstring1.toFloat()*100); 
    
  sensorstring = "";
  sensorstring1 = "";                                  
  sensor_string_complete = false;
  sensor_string_complete1 = false;     
                                     
  }