Go Down

Topic: Problema actualizacion de sensor (Read 165 times) previous topic - next topic

Carlitos1991

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.

Code: [Select]
#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!! https://www.youtube.com/watch?v=DcEexdUlcYM

Gracias y Saludos

rodripelto

Hola,
¿Pero has cambido muchas cosas no?
Code: [Select]

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
Code: [Select]
       
        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");
Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

Carlitos1991

#2
Aug 11, 2017, 09:22 pm Last Edit: Aug 14, 2017, 08:52 pm by surbyte Reason: Reply redundante
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

Code: [Select]

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

rodripelto

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.
Code: [Select]
      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

Si alguna respuesta ha solucionado tu problema, da las gracias marcándola como solucionada.

Carlitos1991

#4
Aug 15, 2017, 07:04 pm Last Edit: Aug 15, 2017, 07:44 pm by surbyte
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

Go Up