Caracteres raros en puerto serie al usar modo sleep

Hola a todos, estoy comenzando en el mundo Arduino y, después del uso básico de sensores, quiero aprender cómo ahorrar algo de energía usando el modo sleep.

La cuestión es que tengo un Arduino UNO con un sensor de temperatura DHT22. Tengo un sketch que cada ocho segundos (utilizando la función delay) mide la temperatura y la muestra por el puerto serie. Hasta aquí, todo correcto.

Estoy intentando hacer lo mismo con la librería “LowPower”, sustituyendo la instrucción delay(8000) por “LowPower.powerDown( SLEEP_8S , ADC_OFF , BOD_OFF );”.

El problema es que al ejecutarlo, en el puerto serie empiezan a aparecer caracteres extraños y no se puede leer la información.

Os pego el código completo para más claridad:

#include <LowPower.h>
#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT22

DHT dht( DHTPIN , DHTTYPE );

void setup() {
  Serial.begin( 9600 );
  Serial.println( "Test de uso del sensor DHT22" );
  Serial.println( "Midiendo temperatura y humedad" );
  Serial.println( "---------------------------------------------" );

  dht.begin();
  delay( 2000 );
}

void loop() {


  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature( true );

  if( isnan(h) || isnan(t) || isnan(f) ){
    
    Serial.println( "Se produjo un fallo en la lectura del sensor DHT!" );
    
  } else {
    
    float hif = dht.computeHeatIndex( f , h );
    float hic = (hif - 32) / 1.8;

    Serial.print( " T: " );
    Serial.print( t );
    Serial.print( " ºC\t" );

    Serial.print( "RH: " );
    Serial.print( h );
    Serial.print( " %\t" );
    
    Serial.print( "HI: " );
    Serial.print( hic );
    Serial.print( " ºC\n" );

    LowPower.powerDown( SLEEP_8S , ADC_OFF , BOD_OFF );
    
  }

}

No sé qué problema puede haber. Muchas gracias.

Asumo que desde el principio del loop al primer Serial.print se toma muy poco tiempo.

Cuando al Arduino se le manda a "dormir profundamente", se desactiva el oscilador externo de 16 MHz (cuando es temporizado, solo el WDT con su propio oscilador se mantiene encendido).
Al "despertar", dicho oscilador externo le toma alrededor de 100 ms estabilizar la frecuencia; si se le manda a imprimir al puerto serial "inmediatamente" después de despertar, este se desatiempará mientras el oscilador está en el proceso de estabilizarse. Supongo que ya sabes por donde voy: si el puerto serial se desatiempa, caracteres "basura" aparecen.

Quizá debas colocar un retraso de 100 ms antes de imprimir. Es extraño que sea requerido, se supone que operar con float es incluso más lento que operar con long.

Efectivamente Lucario448, con colocar un delay de 100ms se ha solucionado y ya imprime lo que debe.

Muchas gracias