Go Down

Topic: Display libreria liquid crystal (Read 419 times) previous topic - next topic

javialg

Feb 03, 2015, 08:11 pm Last Edit: Feb 03, 2015, 09:04 pm by javialg
os pongo en situacion,

tengo un lm35 enviando temperatura por radiofrecuencia (433mhz)

lo recibo perfectamente por el monitor serial de la otra placa, sin ningun problema

ahora viene el problema, cuando intento sacar por pantalla el dato, el cual ya realizo la conversion de la variable entera del sensor a char.

no consigo la manera de que saque por la lcd el dato, es decir la temperatura.

pongo el codigo por si alguien pudiera ayudarme, gracias

Code: [Select]

#include <LiquidCrystal.h>
#include <VirtualWire.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
    lcd.begin(16, 2);
    Serial.begin(9600);          // Comenzar comunicacion serie, entre parentesis la velocidad, siempre esa.
    vw_set_ptt_inverted(true);  // Requerido por el modulo RF. comprobar si es relevante o no. parece ser que es para unos tipos de Rx Tx
    vw_setup(2000);            // igual que en el transmisor, la velocidad en bps
    vw_set_rx_pin(9);         // Pin en el que conectamos la patilla data del receptor
    vw_rx_start();           // comenzamos la recepcion
}

void loop()
{
 
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;  //necesario para recibir el mensaje. Ni idea que significa

   if (vw_get_message(buf, &buflen))      // Comprobamos si hemos recibido datos
  {
    int i;
    for (i = 0; i < buflen; i++)
    {
      Serial.write(buf[i]);  // Los datos recibidos son guardados en el buffer

    }
     
  }
   
  }

surbyte

#1
Feb 03, 2015, 09:00 pm Last Edit: Feb 03, 2015, 09:04 pm by surbyte
Hola. Te recomiendo que edites ese título y retires la palabra AYUDA.
Todo lo que acá hacemos es ayudar. Asi que no hace falta ponerlo en el título.

En esa parte del código no veo una sola instrucción que imprima en el LCD salvo su inicialización
Code: [Select]
lcd.begin(16.2);

Te recomiendo que hagas esto

Code: [Select]
#include <LiquidCrystal.h>
#include <VirtualWire.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
lcd.begin(16, 2);
   Serial.begin(9600);          // Comenzar comunicacion serie, entre parentesis la velocidad, siempre esa.
   vw_set_ptt_inverted(true);  // Requerido por el modulo RF. comprobar si es relevante o no. parece ser que es para unos tipos de Rx Tx
   vw_setup(2000);            // igual que en el transmisor, la velocidad en bps
   vw_set_rx_pin(9);         // Pin en el que conectamos la patilla data del receptor
   vw_rx_start();           // comenzamos la recepcion
}

void loop()
{
  char str[20];

  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;  //necesario para recibir el mensaje. Ni idea que significa

  if (vw_get_message(buf, &buflen)) {     // Comprobamos si hemos recibido datos
     int i;
   for (i = 0; i < buflen; i++) {
         Serial.write(buf[i]);  // Los datos recibidos son guardados en el buffer
     }
     sprintf(str, "Tmp = %s", buf);  // esto permite copiar "Tmp = 123" en str y luego presentarlo en el lcd
     lcd.setCursor(0,1);         // supongamos que buf = "123"
     lcd.print(str);
  }

}


Esto debería imprimir

Temp= 123
desde la posición 0 de la linea 1.

javialg

lo probare amigo, ya he cambiado el tema.

muchisimas gracias por el tiempo dedicado, siempre eres tu el que me contestas a todas las dudas. me gusta exprimirme la cabeza pero no habria dado con esa solucion ya que estoy con esta aficion sin saber nada de programacion.

Probare tu solucion mañana.

me gustaria entender algo mas de esta linea, lo que esta entre comillas quiere decir que me mostrara Tmp en pantalla y la temperatura no? es algo asi como que el buf que recibo lo modificas para que sea legible por la lcd? (perdona mi manera de expresarme si digo alguna locura)

Code: [Select]


 sprintf(str, "Tmp = %s", buf);  // esto permite copiar "Tmp = 123" en str y luego presentarlo en el lcd



saludos


surbyte

#3
Feb 03, 2015, 10:00 pm Last Edit: Feb 03, 2015, 10:01 pm by surbyte
La temperatura no? Claro que si, supuse que la temperatura almacenada en buf era 123 y por eso te di ese ejemplo.
Como voy a sugerirte algo FIJO, que solo imprima Temp = 123 que sentido tiene?

EXPLICACION DE SPRINTF
Es como lo dices. sprintf es una función muy util del C que te permite evitar el hacer las cosas en dos pasos o 3 o mas.
entonces, defines un buffer como str de longitud igual al de tu LCD. creo que puse 20 y debe ser 16.
Si me equivoqué con la longitud. La longitud del buffer debe ser la de los caracteres a imprimir.

Luego usas diferentes elementos para imprimir tipos de variables.
%d es para enteros
%ld es para long
%s es para string de todo tipo
%c para caracteres

NOTA ESPCIAL PARA FLOATS
%f no puede usarse en arduino porque no tiene el soporte Floating point asi que antes usas
una función dtostrf que cambia un float a string indicando decimales etc, etc. lo buscas aca mismo.
y tienes todo cubierto.

Code: [Select]
char* dtostrf( double        variableFlotante,
               signed char  tamañoMinimo,
               unsigned char presicion,
               char          *cadenaDondeGuardar
)

Esta función recibe la variable que queremos convertir (variableFlotante), el tamaño mínimo de la cadena resultante (tamañoMinimo) incluyendo el punto decimal y el signo negativo en caso necesario, el número de dígitos tras el punto decimal (presicion) y una cadena con suficiente espacio para guardar (cadenaDondeGuardar). Regresa un apuntador a la cadenaDondeGuardar.





Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy