Problema actualizacion de sensor

Hola de nuevo compañeros. He estado trasteando y con librerias y esta me ha parecido muy facil de usar a la par que util si en tus programas quieres tener un poco de organizacion, pero me surge un problema a la hora de visualizar la informacion de un sensor, y es que solo coge la de ese momento y a mi me gustaria poder visualizarla en tiempo real, creo que para eso deberia ir la lectura en el loop para que la lectura fuese continua, pero solo es una suposicion mia. En donde actualmente realiza la lectura del DHT solo la presenta una vez y si quieres actualizar debes salir y volver a entrar.

#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);

#include <DHT.h>
#define DHTPIN 12
#define DHTTYPE DHT22 
DHT dht(DHTPIN, DHTTYPE);

#include <MenuBackend.h>
void menuChangeEvent(MenuChangeEvent changed);
void menuUseEvent(MenuUseEvent used);

/*
	This is the structure of the modelled menu
	
	Fecha
		Hora y Fecha
  Temperatura DHT
    Temperatura
    Temperatura Max
    Temperatura Min
  Temperatura BMP
    Temperatura
    Temperatura Max
    Temperatura Min
	Humedad Relativa
    H.Relativa
    H.Relativa Max
    H.Relativa Min
	Presion
			Presion Absoluta
        Presion
        Presion Max
        Presion Min
      Presion Relativa
        Presion
        Presion Max
        Presion Min
	Iluminacion
      Lux
      Lux Max
      Lux Min
	Anemometro
    Velocidad Viento
  Veleta
      Direccion Viento
  Pluviometro
      Lluvia mm
*/

const int buttonPinLeft = 6;    // pin for the Up button 
const int buttonPinRight = 7;   // pin for the Down button 
const int buttonPinEsc = 5;     // pin for the Esc button 
const int buttonPinEnter = 5;   // pin for the Enter button

//this controls the menu backend and the event generation
MenuBackend menu = MenuBackend(menuUseEvent,menuChangeEvent);
	//beneath is list of menu items needed to build the menu
	MenuItem Fecha = MenuItem("1. Fecha");
		MenuItem FechaHora = MenuItem("1.1 Hora y Fecha");
	MenuItem dhtSensor = MenuItem("2. Temperatura DHT");
	  MenuItem dhtTemp = MenuItem("2.1 Temperatura");
		MenuItem dhtTempMax = MenuItem("2.2 Temperatura Max");
    MenuItem dhtTempMin = MenuItem("2.3 Temperatura Min");
  MenuItem bmpSensor = MenuItem("3. Temperatura BMP");
    MenuItem bmpTemp = MenuItem("3.1 Temperatura");
    MenuItem bmpTempMax = MenuItem("3.2 Temperatura Max");
    MenuItem bmpTempMin = MenuItem("3.3 Temperatura Min");
  MenuItem hRelativa = MenuItem("4. Humedad");
    MenuItem hRel = MenuItem("4.1 Humedad Relativa");
    MenuItem hRelMax = MenuItem("4.2Humedad Max");
    MenuItem hRelMin = MenuItem("4.3Humedad Min");
  MenuItem menu1Item5 = MenuItem("5. Presion");
    MenuItem menu1Item5SubItem1 = MenuItem("5.1 Presion Absoluta");
      MenuItem menu1Item5SubItem1Sub1 = MenuItem("5.1.1 Presion Absoluta");
      MenuItem menu1Item5SubItem1Sub2 = MenuItem("5.1.2 Presion Absoluta Max");
      MenuItem menu1Item5SubItem1Sub3 = MenuItem("5.1.3 Presion Absoluta Min");
    MenuItem menu1Item5SubItem2 = MenuItem("5.2 Presion Relativa");
      MenuItem menu1Item5SubItem2Sub1 = MenuItem("5.2.1 Presion Relativa");
      MenuItem menu1Item5SubItem2Sub2 = MenuItem("5.2.2 Presion Relativa Max");
      MenuItem menu1Item5SubItem2Sub3 = MenuItem("5.2.3 Presion Relativa Min");
  MenuItem menu1Item6 = MenuItem("6. Iluminacion");
			MenuItem menu1Item6SubItem1 = MenuItem("6.1 Lux");
			MenuItem menu1Item6SubItem2 = MenuItem("6.2 Lux Max");
			MenuItem menu1Item6SubItem3 = MenuItem("6.3 Lux Min");
	MenuItem menu1Item7 = MenuItem("7. Anemometro");
    MenuItem menu1Item7SubItem1 = MenuItem("7.1 Velocidad Viento");
  MenuItem menu1Item8 = MenuItem("8. Veleta");
    MenuItem menu1Item8SubItem1 = MenuItem("8.1 Direccion Viento");
  MenuItem menu1Item9 = MenuItem("9. Pluviometro");
    MenuItem menu1Item9SubItem1 = MenuItem("9.1 mm Lluvia");
	
//this function builds the menu and connects the correct items together
void menuSetup()
{
	Serial.println("Elige la opcion del menu navegando...");
	//add the file menu to the menu root
	menu.getRoot().add(Fecha); 
	
	  Fecha.addBefore(menu1Item9);
		Fecha.addRight(FechaHora);
		  FechaHora.addLeft(Fecha);
	  Fecha.addAfter(dhtSensor);
		
		dhtSensor.addRight(dhtTemp);
        dhtTemp.addBefore(dhtTemp); //loop to d400 
        dhtTemp.addAfter(dhtTempMax);
        dhtTempMax.addAfter(dhtTempMin);
        dhtTempMin.addAfter(dhtTemp);
    dhtSensor.addAfter(bmpSensor);

    bmpSensor.addRight(bmpTemp);
      bmpTemp.addBefore(bmpTemp);
      bmpTemp.addAfter(bmpTempMax);
      bmpTempMax.addAfter(bmpTempMin);
      bmpTempMin.addAfter(bmpTemp);
    bmpSensor.addAfter(hRelativa);

    hRelativa.addRight(hRel); 
      hRel.addBefore(hRel);
      hRel.addAfter(hRelMax);
      hRelMax.addAfter(hRelMin);
      hRelMin.addAfter(hRel);
    hRelativa.addAfter(menu1Item5);

    menu1Item5.addRight(menu1Item5SubItem1);
      menu1Item5SubItem1.addBefore(menu1Item5SubItem1);
      menu1Item5SubItem1.addAfter(menu1Item5SubItem2);
      menu1Item5SubItem1.addRight(menu1Item5SubItem1Sub1);
        menu1Item5SubItem1Sub1.addBefore(menu1Item5SubItem1Sub1);
        menu1Item5SubItem1Sub1.addAfter(menu1Item5SubItem1Sub2); 
        menu1Item5SubItem1Sub2.addAfter(menu1Item5SubItem1Sub3);
        menu1Item5SubItem1Sub3.addAfter(menu1Item5SubItem1Sub1);
      menu1Item5SubItem2.addRight(menu1Item5SubItem2Sub1);
        menu1Item5SubItem2Sub1.addBefore(menu1Item5SubItem2Sub1);
        menu1Item5SubItem2Sub1.addAfter(menu1Item5SubItem2Sub2); 
        menu1Item5SubItem2Sub2.addAfter(menu1Item5SubItem2Sub3);
        menu1Item5SubItem2Sub3.addAfter(menu1Item5SubItem2Sub1);
      menu1Item5SubItem2.addAfter(menu1Item5SubItem1);
    menu1Item5.addAfter(menu1Item6);

    menu1Item6.addRight(menu1Item6SubItem1);
      menu1Item6SubItem1.addBefore(menu1Item6SubItem1); 
      menu1Item6SubItem1.addAfter(menu1Item6SubItem2);
      menu1Item6SubItem2.addAfter(menu1Item6SubItem3);
      menu1Item6SubItem3.addAfter(menu1Item6SubItem1);
    menu1Item6.addAfter(menu1Item7);

    menu1Item7.addRight(menu1Item7SubItem1);
      menu1Item7SubItem1.addLeft(menu1Item7);
    menu1Item7.addAfter(menu1Item8);

    menu1Item8.addRight(menu1Item8SubItem1);
      menu1Item8SubItem1.addLeft(menu1Item8);
    menu1Item8.addAfter(menu1Item9);

    menu1Item9.addRight(menu1Item9SubItem1);
      menu1Item9SubItem1.addLeft(menu1Item9);
    menu1Item9.addAfter(Fecha);
  }

/*
	This is an important function
	Here all use events are handled
	
	This is where you define a behaviour for a menu item
*/
void menuUseEvent(MenuUseEvent used)
{
	Serial.print("Menu use ");
	Serial.println(used.item.getName());

  if (used.item.getName() == "1.1 Hora y Fecha")
  {
    u8g.firstPage();  
      do 
      {        
        u8g.setFont(u8g_font_courB10);
        u8g.setPrintPos( 12, 18);
        u8g.print("Temperatura DHT");
        u8g.setFont(u8g_font_osr18);
        u8g.setPrintPos( 20, 64);
        u8g.print(dht.readTemperature());//
        u8g.setPrintPos(83, 64);
        u8g.print((char) 0xb0); //Para obtener por pantalla el simbolo º
        u8g.setPrintPos( 95, 64);
        u8g.print("C");
      } while( u8g.nextPage() );
  }
	
}

/*
	This is an important function
	Here we get a notification whenever the user changes the menu
	That is, when the menu is navigated
*/
void menuChangeEvent(MenuChangeEvent changed)
{
  MenuItem newMenuItem=changed.to;
  
	Serial.print("Menu change ");
	Serial.print(changed.from.getName());
	Serial.print(" ");
	Serial.println(changed.to.getName());

  if(newMenuItem == "1. Fecha")
  {
    u8g.firstPage();  
      do 
      {        
        u8g.setFont(u8g_font_osr18);
        u8g.setPrintPos( 10, 40);
        u8g.print("Fecha");
      } while( u8g.nextPage() );
  }
}

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

  dht.begin();
  pinMode(buttonPinEnter, INPUT_PULLUP); 
  pinMode(buttonPinEsc, INPUT_PULLUP); 
  
	menuSetup();
}

void loop()
{
  	if (Serial.available()) {
		byte read = Serial.read();
		switch (read) {
			case 'w': menu.moveUp(); break;
			case 's': menu.moveDown(); break;
			case 'd': menu.moveRight(); break;
			case 'a': menu.moveLeft(); break;
			case 'e': menu.use(); break;
		}
	}
}

Para moverse por el menu se usa el puerto serie introducioendo w para ir arriba, s para ir abajo, a para ir atras o salir y d para ir adelante o enter.

He cogido referencias de este video, y veo que es posible, pero en el enlace de abajo donde te lleva al codigo luego busco esa palte de la temperatura y no aparece!! Arduino - LCD menu with different functions - YouTube

Gracias y Saludos

MenuBackend-master.zip (14 KB)

U8glib_Arduino-master.zip (1.08 MB)

DHT.zip (4.15 KB)

Hola,
¿Pero has cambido muchas cosas no?

if (used.item.getName() == "1.1 Hora y Fecha")
  {
    u8g.firstPage(); 
      do
      {       
        u8g.setFont(u8g_font_courB10);
        u8g.setPrintPos( 12, 18);
        u8g.print("Temperatura DHT");
        u8g.setFont(u8g_font_osr18);
        u8g.setPrintPos( 20, 64);
        u8g.print(dht.readTemperature());//
        u8g.setPrintPos(83, 64);
        u8g.print((char) 0xb0); //Para obtener por pantalla el simbolo º
        u8g.setPrintPos( 95, 64);
        u8g.print("C");
      } while( u8g.nextPage() );

Se supone que esa parte del menu es para mostrar fecha y hora y esta utilizado para la temperatura, entiendo que una vez elegido ese opción del menu esta dando vueltas y por lo tanto actualizando la temperatura en el do...while hasta un cambio de pagina.
Si solo quieres mostrar la temperatura y pasar del menu, lo que tienes que poner en el loop seria

        u8g.setFont(u8g_font_courB10);
        u8g.setPrintPos( 12, 18);
        u8g.print("Temperatura DHT");
        u8g.setFont(u8g_font_osr18);
        u8g.setPrintPos( 20, 64);
        u8g.print(dht.readTemperature());//
        u8g.setPrintPos(83, 64);
        u8g.print((char) 0xb0); //Para obtener por pantalla el simbolo º
        u8g.setPrintPos( 95, 64);
        u8g.print("C");

En primer lugar gracias por tu respuesta. Puede que haya dado lugar a confusiones esa parte, en lo de hora y fecha lo puse por probar con algo menos lioso como la temperatura. Y otra cosa la estructura do while va en conjunto con presentar eso por pantalla, pero la cosa es que no me lo esta mostrando mientras permanezco en esa pantalla, esta claro que si lo pongo en el loop iria pero con esta sintaxis

if (used.item.getName() == "2.1 Temperatura") // Ya corregido para no dar lugar a errores de comprension
  {
    u8g.firstPage(); --> Inicio Sintaxys
      do
      {       
        u8g.setFont(u8g_font_courB10);
        u8g.setPrintPos( 12, 18);
        u8g.print("Temperatura DHT");
        u8g.setFont(u8g_font_osr18);
        u8g.setPrintPos( 20, 64);
        u8g.print(dht.readTemperature());//
        u8g.setPrintPos(83, 64);
        u8g.print((char) 0xb0); //Para obtener por pantalla el simbolo º
        u8g.setPrintPos( 95, 64);
        u8g.print("C");
      } while( u8g.nextPage() ); --> Final Sintaxys

Se supone que deberia funcionar de la siguiente manera... esta presentando la temperatura por pantalla hasta que se pase a la siguiente pantalla, sin embargo, no hace bucle, es como si solo lo leyese una vez y lo presentase tal cual una unica vez, sin actualizarlo en tiempo real. Luego he buscado la forma de hacer posible que esa opcion la pudiese hacer en el loop, de manera que si que funcionaria, pero no he dado con la clave...
No se si me he explicado bien. Gracias y un saludo

Hola,
He intentado revisar la libreria u8g, el problema es que no entiendo bien el C+ y ademas la libreria es muy extensa, lo unico que he podido sacar en claro es que u8g.nextPage() devuelve un 1 o un 0.
Se supone que while( u8g.nextPage() ) esta recibiendo 1 y por lo tanto dando bueltas en el do...while hasta que cambia de pagina.
¿Podrias intentar poner una impresión de u8g.nextPage() para ver que retorna?

Por ejemplo.

      do
      {       
        u8g.setFont(u8g_font_courB10);
        u8g.setPrintPos( 12, 18);
        u8g.print("Temperatura DHT");
        u8g.setFont(u8g_font_osr18);
        u8g.setPrintPos( 20, 64);
        u8g.print(dht.readTemperature());//
        u8g.setPrintPos(83, 64);
        u8g.print((char) 0xb0); //Para obtener por pantalla el simbolo º
        u8g.setPrintPos( 95, 64);
        u8g.print("C");
        u8g.print("u8g.nextPage()");
      } while( u8g.nextPage() );

Nos dices si en la pantalla aparece un 1 o un 0

No entiendo lo que quieres que haga para que podais ayudarme, en si el problema no es de la libreria de la pantalla, es de la libreria de menubackend, que solo me permite que se muestre una sola vez la lectura del menu en el que entro. Si lo que quiero mostrar por pantalla como puede ser la temperatura, lo coloco en el loop, aqui se ejecuta correctamente y me muestra los datos actuales hasta que paso de pantalla