Problema lectura sensor serie

Buenos días,

En primer lugar, no se si he de presentarme puesto que es la primera vez que escribo… Si es así díganmelo :slight_smile:

Para comenzar decir que no tengo mucho manejo de programación… aun así estoy intentando hacer un pequeño proyecto que consiste en la lectura de un sensor serie, e imprimir en una pantalla TFT dicha lectura y algunos estadísticos como media, máximos, mínimos y demás.

Hasta ahora he conseguido visualizar por pantalla los valores del sensor, pero cuando lleva un rato funcionando empieza a dar valores con menos dígitos y no entiendo por qué. Si reseteo vuelve a funcionar correctamente. Decir que el sensor entrega los datos de esta manera: “Z xxxx z xxxx” y que con recoger los valores correspondientes a las 4 primeras “x” me vale. Para conseguir esto he seleccionado los 9 primeros caracteres de la cadena y luego usado token para eliminar la Z y los espacios (no se si estoy haciendo bien).

El otro problema que tengo es que no consigo hacer operaciones puesto que los valores los saco del sensor con un String y la función para convertir a float (toFloat()) me da error, y dos string no puedo comparar para saber cual es mayor o menor.

Como última duda y que no consigo ver, de que manera podría hacer la media de los últimos 50 valores continuamente?, con una sola variable que se vaya refrescando cada 50 muestreos.

Adjunto el código de como lo tengo ahora mismo, con los fallos de desaparición de dígitos al cabo del tiempo y problemas con la conversión a float.

Muchas gracias de antemano a todos.

#include <stdio.h>
#include <string.h>

#include <SoftwareSerial.h>
SoftwareSerial puertoUno(5, 6);

#include <TFT.h>
#include <SPI.h>

#define CS   10
#define DC   9
#define RESET  8  

TFT myScreen = TFT(CS, DC, RESET);

char printout[9];
int i;
float Max1=00000;
float Min1=10000;

void setup() {
 Serial.begin(9600);
 puertoUno.begin(9600);

 myScreen.begin();  
 myScreen.background(0,0,0);
 myScreen.stroke(255,0,255);
 myScreen.text("Valor sensor:",0,0);
 myScreen.text("ppm",0,30);
 myScreen.setTextSize(3);
}

void loop() {
 puertoUno.listen();
//Serial.println("Valor sensor:");
   String datos = puertoUno.readStringUntil('\n');
   char copy[50]; 
   String valorSensor, Datos1;
   datos.toCharArray(copy, 9);
   char *token = strtok(copy, "Z" " " "z");
   if(token != NULL){
       while(token != NULL){
           // Sólo en la primera pasamos la cadena; en las siguientes pasamos NULL
             Serial.println(token);
             valorSensor = token;
             Datos1 = valorSensor;
             token = strtok(NULL, "Z" " " "z");
             token = 0;
                           }
                    }
/*
 Datos1.toFloat();
 Serial.println(Datos1);
 // Buscamos el maximo
 if (Datos1 > Max1){
 Max1 = Datos1;}
 Serial.println(Max1);

 // Buscamos el minimo
 if (Datos1 < Min1){
 Min1 = Datos1;}

 */
 
//Serial.println(valorSensor);
   valorSensor.toCharArray(printout,9);
//Serial.println(printout);
   myScreen.stroke(255,255,255);
   myScreen.text(printout,0,10);
   delay(1000);
   myScreen.stroke(0,0,0);
   myScreen.text(printout,0,10);

   Serial.flush();
           }

Primero, si usas un puerto SoftwareSerial, esto

puertoUno.listen();

no tiene sentido a menos que luego uses otro.
Pero opino por lo que veo ahora.

Que es esto?

char *token = strtok(copy, "Z" " " "z");

creas un puntero de chars y luego se lo asignas a

valorSensor = token;

un String? Locura total!!!

He ahi el problema.
Si usas punteros y array de chars sigue con ellos pero no mezcles clases de String con punteros o bien usa la conversión adecuda de typecase

Unifica todo a uno u otro metodo y no tendras problemas.