Parsear un String recibido por Serial y guardarlo en variable (SOLUCIONADO)

Hola a todos, estoy enviando desde un Arduino UNO a un Nano via "Serial.print()" una cadena de caracteres:

En el Arduino UNO (Emisor):

       Serial.print("S.Ar: ");
         Serial.print(analogSensor1);
         Serial.print(" D");
         Serial.print(deltalive1);
         Serial.print(",S.Ab: ");
         Serial.print(analogSensor2);
         Serial.print(" D");
         Serial.print(deltalive2);

En el Nano (Receptor):

String dato = Serial.readStringUntil('\n');

asi, leo el String completo y lo guardo en la variable dato.

Hasta ahi, todo OK, puedo incluso hacer un "

Serial.print(dato);

" y me muesta el String recibido por Monitor Serial.

El problema es que el String "dato", necesito partirlo en dos variables. Tiene un caracter delimitador ","

He probado con esta funcion:

  char parte1[32], parte2[32];

    strcpy(parte1, strtok(dato, ","));
    strcpy(parte2, strtok(NULL, ","));


    printf("%s\n", parte1);
    printf("%s\n", parte2);

pero me arroja como error "cannot convert 'String' to 'char*' for argument '1' to 'char* strtok(char*, const char*)'"

He buscado otros codigos diferentes para convertir String a char, pero no he encontrado.

Tambien he probado leer directamente el Serial enviado por el Arduino UNO con:

unsigned char dato= Serial.read();

Pero ahi la variable dato se me transforma en un "255" y deja de ser texto.

Alguien podria ayudarme un poco?

Muchas gracias de antemano!

Podrias crear dos Strings,en el primero leer hasta caracter ',' y en el segundo hasta el final:

String dato1 = Serial.readStringUntil(',');
String dato2 = Serial.readStringUntil('\n');

Hola, me ha servido el dato de la ",", no sabia eso. He agregado otro delimitador ";". Los tiempos de lectura influyen mucho en el funcionamiento.... y hay que coordinar todo con "delay". Tal vez programandolo con millis() funcione mejor...

Con prueba y error he conseguido que funcione!

Mil gracias, cierro el hilo, si les parece, ya que para mí esto esta solucionado :slight_smile:

Saludos!!!

Aqui el codigo del Arduino Emisor:

byte redLed = 8;
byte relay = 3;
byte buzzer = 5;
float smoke1 = A0;
float smoke2 = A2;
int analogSensor1;
int analogSensor2;
float deltalive1 = 0;
float valoractual1;
float valoranterior1;
float deltalive2 = 0;
float valoractual2;
float valoranterior2;
unsigned long t = 0;




int Delta = 300; //sensibilidad. a menos valor, mas sensibilidad al cambio de gases o humo


//Variable para enclavar pulsadores
int estado = 0; //  estado = 2 -> hay humo,  0 = reposo, estado = 1 -> sin asignar






void setup() {
  pinMode(redLed, OUTPUT);
  pinMode(relay, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(smoke1, INPUT);
  pinMode(smoke2, INPUT);
  Serial.begin(9600);
  digitalWrite(relay, LOW); //pone a los relay no activados
 // para estabilizar:
    for (int i = 1; i <= 3; i++){
        //DEBUG Serial.print(" Estabilizando....");
        //DEBUG Serial.print(i);
         delay(1000);
} 

}

void loop() {

//con este for hago que haga un loop al principio, sin detectar humo. Esto es porque al principio el delta es mayor que 100, porque inicialmente las variables de los detectores deltalive son cero. Entonces da como si hubiese delta, cuando en realidad no lo hay.
    for (int i = 1; i <= 2; i++){
                          
valoranterior1 = valoractual1; //hago que el valor leido en el loop anterior, se guarde en otra variable con nombre "anterior"
valoranterior2 = valoractual2;

//Lectura de variables de sensores
  analogSensor1 = analogRead(smoke1);
  analogSensor2 = analogRead(smoke2);

//parte a
//DEBUG  Serial.print(" Sensor1 (Arriba): ");
//DEBUG  Serial.println(analogSensor1);


//DEBUG delay(400);  
//parte b
//DEBUG  Serial.print(" Sensor2 (Abajo) : ");
//DEBUG  Serial.println(analogSensor2);
//DEBUGdelay(400);  

//Termino lectura de variables

//renombre de variables
valoractual1 = analogSensor1; 
valoractual2 = analogSensor2;
//termino renombre de variables

//inicio calculos diferenciales
deltalive1 = valoractual1 - valoranterior1; //calculo de la diferencia del valor anterior y el actual
//parte c
//DEBUG  Serial.print("  Deltalive1 = ");
//DEBUG  Serial.println(deltalive1);
//DEBUGdelay(400);  

deltalive2 = valoractual2 - valoranterior2; //calculo de la diferencia del valor anterior y el actual
//parte d
//DEBUG  Serial.print("  Deltalive2 = ");
//DEBUG  Serial.println(deltalive2);

//DEBUGdelay(400);  
//DEBUG  Serial.print(" Estabilizando Delta....");
//DEBUG  Serial.print(i);
//DEBUGdelay(400);
}  
//termina calculos diferenciales

//mostrar en display valores:
    //transferir por serial todos los datos
         Serial.print("S.Ar: ");
         Serial.print(analogSensor1);
         Serial.print(" D");
         Serial.print(deltalive1);
         Serial.print(",");
         Serial.print("S.Ab: ");
         Serial.print(analogSensor2);
         Serial.print(" D");
         Serial.print(deltalive2);
         Serial.print(";");

         
         

//Comparacion con valor de referencia y acciones

//DEBUG Serial.print(" Relays.......                          ");

if (deltalive1 > Delta)               { //DEBUGSerial.print(" Hay humo en sensor 1 (Arriba)");
                                        //Serial.write("humo1");
                                        estado = 2;
                                      }
if (deltalive2 > Delta)               { //DEBUGSerial.print(" Hay humo en sensor 2 (Abajo)");
                                        estado = 2;
                                      }

if (estado == 2)                      { digitalWrite(redLed, HIGH); digitalWrite(relay, HIGH);
                                        tone(buzzer, 1680); 
                                        delay(1500);
                                        noTone(buzzer);
                                      
                                      }
 
  delay(2000);
}

y aqui el del Arduino receptor:

//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

//Variables


void setup()
{
  lcd.init();                      // initialize the lcd 

  // Print a message to the LCD.
  lcd.backlight();
    Serial.begin(9600);
}


void loop()
{
  delay(1000);
  String dato1 = Serial.readStringUntil(',');

  //Guardamos en la variable dato el valor leido Esto sirve para leer el string entero que envio. Sino te lee un caracter solo.Es mucho mas lento, como 1000 ms por cada leida.
  //unsigned char dato= Serial.read();//Guardamos en la variable dato el valor leido. Esto sirve para cuando enviamos solo una letra. Es muchas mas rapido. Como 60 ms por caracter. 
  Serial.print("dato1 = ");
  Serial.print(dato1);
  lcd.setCursor(-1,0);
  lcd.print(dato1);
  
  delay(1000);
  
  String dato2 = Serial.readStringUntil(';');
  
  Serial.print("dato2 = ");
  Serial.println(dato2);  

  lcd.setCursor(0,1);
  lcd.print(dato2);
}