Crear Salidas RX TX

Hola a todos. Quería saber si es posible crear salidas RX TX en un Arduino, como por ejemplo el NANO, que solo tiene una salida. A lo mejor es una tontería muy grande, pero quería saber si hay alguna posibilidad de "añadirlas". Muchas gracias de antemano

¿Salida de qué? ¿Hacer más de un TX? RX no se puede usar como transmisor, excepto que esa función se deshabilite mediante cierto registro, y se adjunte como TX en una instancia de SoftwareSerial.

Múltiples instancias de esta librería permiten crear múltiples pines de transmisión. No te emociones mucho, que cada una ocupa 132 bytes de memoria RAM.

Vale creo que lo he entendido. He creado con SoftwareSerial un TX y un RX. Ahora explico mi proyecto un poquito. Consta de un pHmetro y un termopar. El termopar es tipo K y va conectado a una placa Adafruit MAX 31856 , que a su vez va al Arduino NANO a los puertos 13,12,11,10. Hasta ahi todo correcto y lee sin problema. Ahora viene la historia. El pHmetro va conectado a una placa EZO ( es la marca) y tiene salida RX y TX, que va al arduino a sus respectivas RX TX. La historia es que he creado las Rx Tx y le he asignado el D6 y D7.Lo he llamado Serial3, y quiero que lea y mande lo leído por dicho puerto y me lo muestre en pantalla. Y cuando simulo no consigo que lea bien el valor. Os dejo el código a ver si me podéis echar una mano. Muchas gracias a todos de antemano.

#include <Adafruit_MAX31856.h>
#include <SoftwareSerial.h>
Adafruit_MAX31856 max_A = Adafruit_MAX31856(10, 11, 12, 13);
String termoparstring_A = "";
String sensorstring = "";
String inputstring = "";   
#define rxPin 7
#define txPin 6
SoftwareSerial Serial3 (rxPin,txPin);         
boolean input_string_complete = false;                
boolean sensor_string_complete = false;  
                                                       
void setup() {                                        
  Serial.begin(9600);     
                              
          pinMode(rxPin,INPUT);
          pinMode(txPin,OUTPUT);
         
         Serial3.begin(9600);
        inputstring.reserve(30);                            
        sensorstring.reserve(60); 
        max_A.begin();
        max_A.setThermocoupleType(MAX31856_TCTYPE_K);

}   

void loop() {                                         
termoparstring_A =(max_A.readThermocoupleTemperature());
Serial3.listen();  
   while (Serial3.available() > 0) {
    char sensorstring = Serial3.read();
   }
    sensor_string_complete = true; 
    sensorstring = Serial3.read();                                      
           
    Serial.println(termoparstring_A);
    Serial.println(sensorstring);
    delay(500); 
                                                                              
  sensorstring = "";                          
  sensor_string_complete = false;

}

Miniunder:
El pHmetro va conectado a una placa EZO ( es la marca) y tiene salida RX y TX, que va al arduino a sus respectivas RX TX. […] Y cuando simulo no consigo que lea bien el valor.

¿Seguro que los datos que salen son textuales?
Si son binarios, no te sirve colocarlo así no más en una cadena de caracteres; si es textualizado, tampoco porque esa no es la forma de recuperarlo.

He conseguido que lea el pHmetro al final. Quiero que lea un segundo pHmetro, que va igual conectado, pero el problema que tiene Softwareserial es que no puede leer dos dispositivos a la vez. Que primero tiene que ller uno y luego el otro. Se os ocurre alguna forma de hacer eso? Dejo código:

#include <Adafruit_MAX31856.h>
#include <SoftwareSerial.h>
Adafruit_MAX31856 max_A = Adafruit_MAX31856(10, 11, 12, 13);
String termoparstring_A = "";
String sensorstring = "";
String inputstring = "";  
String inputstring1 = "";  
String sensorstring1 = "";  

SoftwareSerial Serial3 (3,2);
SoftwareSerial Serial2 (5,4);           
boolean input_string_complete = false;                
boolean sensor_string_complete = false;
boolean input_string_complete1 = false;                
boolean sensor_string_complete1 = false;      
                                                       
void setup() {                                        
  Serial.begin(9600);     
                              
          pinMode(3,INPUT);
          pinMode(2,OUTPUT);
          pinMode(5,INPUT);
          pinMode(4,OUTPUT);
         Serial2.begin(9600);
         Serial3.begin(9600);
        inputstring.reserve(30);                            
        sensorstring.reserve(60); 
        max_A.begin();
        max_A.setThermocoupleType(MAX31856_TCTYPE_K);
        inputstring1.reserve(30);                            
        sensorstring1.reserve(60);

}
void loop() {                                         
termoparstring_A =(max_A.readThermocoupleTemperature());
sensorstring1 = Serial.readStringUntil(13);  
Serial3.available(); 
Serial3.listen();  
   while (Serial3.available() > 0) {
   sensorstring = Serial3.readStringUntil(13);
   }
    sensor_string_complete = true;
    Serial.println(termoparstring_A);
  
    Serial.println(sensorstring);
      sensorstring = "";                          
  sensor_string_complete = false;
  delay(500);
  Serial.println();
    Serial2.available(); 
     Serial2.listen();  
   while (Serial2.available() > 0) {
   sensorstring1 = Serial2.readStringUntil(13);
   }
    sensor_string_complete1 = true;  
  
    Serial.println(sensorstring1);
   
    delay(500); 
                                                                              
   
  sensorstring1 = "";                                  
  
  sensor_string_complete1 = false;
           

}

Porque abres otro tema si ya tienes uno enfocado al mismo problema y justamente caiste en la misma situación que es tu Serial3 el que te falla y dejaste el código para ser evaluado.

Porque el problema del otro hilo es sobre Arduino Mega. El problema original era con Arduino Mega, que no me funcionaba debido a que el servido del SCADA me fallaba, y no sabía el por qué. Entonces me fui al NANO y ví que sí que funcionaba con dos termopares y un pHmetro, pero para implementar el segundo creo que es demasiado complejo si con el Mega se puede hacer y sí que tiene todos los puertos serie que necesito. Por eso he posteado en el otro hilo. Siento si lo he hecho mal. He decidido seguir haciéndolo con el MEGA ya que penaba que era problema de incompatibilidad con el programa de SCADA o algo así, pero me he dado cuenta que no. Aún así, os agradecería muchísimo si me ayudais a entender por qué con el código que tengo ahora no es capaz de leer a la vez el puerto serie 3 y 2 (RX3 RX2 y TX3 TX2).

Y claro como te va a funcionar llamar a un puerto Serial3 si existe un Serial3 físico en el Mega.

Si es capaz, pero no pidas que todos se comuniquen a la vez. Como manejas ese tema? Como manejas el hecho de que Arduino no puede estar escuchano 4 puertos a la vez? Debes ser sistemático. Envias a uno, escuchas su respuesta y pasas al otro y asi sucesivamente.

Miniunder: pero el problema que tiene Softwareserial es que no puede leer dos dispositivos a la vez. Que primero tiene que ller uno y luego el otro. Se os ocurre alguna forma de hacer eso?

  • Usa el puerto serial por hardware, porque posiblemente por ahora solo lo tengas para mensajes de depuración en el monitor serial. Cuando estés seguro de que tu código funciona, quita esos mensajes y usas este puerto exclusivamente para la aplicación.
  • Utiliza otra librería para la emulación. La que buscas creo que se llama AltSoftSerial o algo así; lee la documentación porque de seguro la simultaneidad en los receptores tiene desventajas que posiblemente debas considerar.
  • Consigue un Arduino Mega, tiene tres puertos seriales por hardware adicionales. La única desventaja es el consumo de memoria RAM, donde en realidad tampoco es importante por el tamaño de esta, comparándolo con el Uno/Nano/Pro Mini.

Claro, si yo tengo un Arduino Mega, y es con el que primero hice todo el SCADA y el programa. Lo que pasa es que como el programa que uso es el Acimut Monitoriza (usa Modbus RTU) y el servidor al minuto se colapsaba y dejaba de funcionar debido finalmente a lo que parece un error a la hora de leer los puertos…pues pensaba que era por el Arduino Mega con Acimut. Así que abrí este hilo para ver si con uno Nano podía hacerlo. Pero ya estoy con el Mega otra vez ya que me he dado cuenta de que el error está en algo de la programación. Solo para aclarar: Con el Arduino Mega y el SCADA consigo conectar todos los componentes (2 termopares a salidas digitales y los 2 phMetros a los RX3 TX3 RX2 TX2) y funciona tomando los datos, mostrandolos…todo perfecto, durante uno o dos minutos. Llegado a ese tiempo, es como si se colapsara el servidor de Acimut y deja de mostrar los datos. Entonces, entiendo que el fallo debe estar en la forma de recogerlos por parte de Arduino (mi programa). Espero haberme explicado bien y pido perdón por lo de los dos hilos que hice, pero porque entendía que eran dos cosas distintas. Ojalá pudierais ayudarme. Como he comentado, soy un poco nuevo en Arduino y lo que hice fue adaptar los programas que te vienen con el pHmetro y con el termopar (juntarlos y que lo hagan todo en el mismo programa). Muchas gracias de antemano. Todo esto es lo que tengo en el programa (además también tengo lo que es el protocolo Modbus para que funcione con el programa) en mi ARDUINO MEGA:

#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);
          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 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);         
        regs [T_2] = (max_B.readThermocoupleTemperature()*100);       
        regs [pH_1] = (sensorstring.toFloat()*100); 
        regs [pH_2] = (sensorstring1.toFloat()*100); 
    
  sensorstring = "";
  sensorstring1 = "";                                  
  sensor_string_complete = false;
  sensor_string_complete1 = false;     
                                     
  }