Tildes y simbolo de grado en Monitor Serie

Hola soy nuevo en Arduino y en este foro.
Estoy haciendo un proyecto de Arduino Mega con el sensor DHT11. La cosa es que todo funciona correctamente pero por algun motivo el Monitor Serie no muestra correctamente una tilde de una palabra y el simbolo de grado "°".
Lo curioso es que si me muestra esos caracteres correctamente despues intervalos irregulares donde se muestra mal. Adjunto una imagen para que veais de lo que hablo.

Tambien posteare el codigo de mi proyecto.

#include <DHT.h> // Esto se hace para agregar la libraría que tendrá el control del sensor
#define DHTPIN 2

#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);
int PinRojo = 9;   // Red LED,  connected to digital pin 11  
int PinVerde = 11;  // Green LED, connected to digital pin 10  
int PinAzul = 10;  // Blue LED, connected to digital pin 9  

void setup() {
    // Inicializamos comunicación serie
  Serial.begin(9600);
 
  // Comenzamos el sensor DHT
  dht.begin();
  pinMode(PinRojo, OUTPUT);   // Sets the pins as output for RGB LED  
  pinMode(PinVerde, OUTPUT);  
  pinMode(PinAzul, OUTPUT);  
}

void loop() {
  // Esperamos 5 segundos entre medidas
  delay(5000);
 
  // Leemos la humedad relativa
  float h = dht.readHumidity();
  // Leemos la temperatura en grados centígrados (por defecto)
  float t = dht.readTemperature();
 
  // Comprobamos si ha habido algún error en la lectura
  if (isnan(h) || isnan(t)) {
    Serial.print("Error obteniendo los datos del sensor DHT11");
    return;
  }
 
  // Calcular el índice de calor en grados centígrados
  float hic = dht.computeHeatIndex(t, h);
  Serial.print("Humedad: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" °C ");
  Serial.print("Índice de calor: ");
  Serial.print(hic);
  Serial.println(" °C ");
 
if(((t) < 26) && ((t) >= 23.2))   // Writing the LED colour pins HIGH or LOW to set colours  
  {  
   digitalWrite(PinRojo, HIGH);  // yellow  
   digitalWrite(PinVerde, HIGH);  
   delay(100);  
     
   digitalWrite(PinAzul, LOW);  
   
  }  
    
  if(((t) < 23) && ((t) > 20.2))  
  {  
   digitalWrite(PinVerde, HIGH);  // green  
   delay(100);  
     
   digitalWrite(PinRojo, LOW);  
   digitalWrite(PinAzul, LOW);  
    
  }  
   
 if(((t) < 20) && ((t) > 17.2))  
  {  
   digitalWrite(PinVerde, HIGH);  // aqua  
   digitalWrite(PinAzul, HIGH);  
   delay(100);  
     
   digitalWrite(PinRojo, LOW);  
     
   
  }  
   
  if((t) <= 12)  
  {  
   digitalWrite(PinAzul, HIGH);  // blue  
   delay(100);  
     
   digitalWrite(PinVerde, LOW);  
   digitalWrite(PinRojo, LOW);  
    
  }  
    
  delay(1000);   // Sensor shouldn't be read too frequently so delay of 1s  
}

El monitor serie no muestra tildes. No luches contra eso porque no ganarás.
Tu respuesta ya fue resuelta.

Creo que el problema es que el monitor serie es un poco «impaciente» y para representar lo que llega no espera al segundo byte de los dos que forman algunos caracteres UTF-8. Si tu IDE de Arduino está en un entorno UTF-8, los caracteres que no pertenezcan a los primeros 128 caracteres ASCCI son representados con dos o más bytes (máximo hasta cuatro bytes). Las letras con tildes y el símbolo de grado son representados con dos bytes. Si «llega» algún byte «suelto» con un valor mayor a 127 o si no «reconoce» el conjunto de dos o más bytes, el carácter «desconocido» se representa con ese cuadrado con una interrogante (�).

Así que para representar los caracteres, que en este caso son formados por dos bytes cada uno, han de «llegar» uno tras otros en tiempo y forma. Es en el tiempo donde creo que está el problema. Llega el primer byte y, antes de que de tiempo de llegar el segundo byte, el monitor serie no espera más y decide representar el byte que le ha llegado. Por su puesto, ese primer byte tiene un valor que por sí sólo no es un carácter válido en UTF-8. Es por ello que muestra el primer carácter con la interrogante (�). Acto seguido le llega el segundo byte, pero el monitor ya ha «mostrado» el primer byte de los dos, así que «interpreta» que el segundo byte no tiene nada que ver con el anterior y al interpretarlo como un único byte, resulta no ser tampoco un carácter UTF-8 válido, con lo que muestra un segundo carácter de «desconocido» (�).

En mi caso, he estado probando a aumentar la velocidad del puerto serie para ver si, al transmitir más rápido el tiempo entre que recibe el primer byte y el segundo es lo suficientemente corto como para que el monitor serie no se «desespere». Al final he llegado a los 921600 baudios y con esa velocidad parece que va bien. También he probado con los 2000000 baudios a los que el monitor serie me permite configurar como máximo y también parece que funciona.

En principio, salvo por la posible mayor sensibilidad al ruido, parece que la USART de mi Arduino Uno trabaja sin problemas a 2000000 baudios.

Resumiendo, prueba a cambiar el 9600 de la línea:
Serial.begin(9600);
Por 921600 o por 2000000. Y recuerda que hay que configurar el monitor serie con ese mismo valor, para que no te salgan símbolos raros ni cosas inteligibles.

Nota: a veces, cuando le da la gana, a velocidades «bajas» el monitor serie espera lo suficiente para que llegue el segundo byte y muestra correctamente el carácter, pero otras veces no «espera» lo suficiente. Por eso a veces los muestra bien y otras veces lo muestra mal a velocidades «bajas».

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.