Go Down

Topic: Problemas con proyecto de estación meteorológica (Read 926 times) previous topic - next topic

arduleo

Muy buenas a todos!

Hacía tiempo que no posteaba por aquí... Y como siempre, es para pedir ayuda  :smiley-roll-sweat:

Me hace ilusión conseguir que me funcione un pequeño proyecto que se me ha ocurrido, pero en las pruebas previas a montarlo no consigo obtener los resultados que necesito, así que una vez más me pongo en disposición de la comunidad para aprender de ella

Os pongo un poco en situación.
El proyecto consta de:

- Una placa con un sensor de temperatura LM35 y un modulo BT
- Una placa con un Shield LCD  16x2 + botones (el aque aparece en la pagina 8 de este pdf: http://www.robotshop.com/content/PDF/dfrobot-arduino-shields-manual.pdf ) y otro módulo BT

La idea es crearme una pequeña "interfaz" en el LCD que contenga dos (de momento) "pantallas", entre las que me iría moviendo con los botones de Izquierda y Derecha:
- Temperatura actual
- Temperatura máxima y mínima

El botón Select encendería o apagaría el LCD, y los botones de Arriba y Abajo cambiarían la intensidad de la iluminacion del LCD

Hasta ahí todo correcto, supongo.


Entonces aquí viene el "quid" de la cuestión.
Antes de ponerme a programarlo todo, he hecho pruebas de:
- Mostrar SOLO la temperatura actual conectando el sensor al Shield (el Shield, como se puede apreciar en la documentación, tiene algunos pines a disposicion del usuario, aunque no todos los que "utiliza", ya que en realidad usa muchos menos), y FUNCIONA
- Detectar las pulsaciones de los botones del Shield, y FUNCIONA

El problema me viene al intentar hacerlo todo junto, que mientras me detecte las pulsaciones, me muestre el valor recogido por el sensor (ni siquiera hablamos de BT todavía, sino de usarlo en conjunción con el LCD).
Como podréis observar en la documentación, la detección del botón pulsado se hace midiendo la tensión recogida en el pin A0, por tanto yo conecto el pin de datos del LM35 al A1, y su alimentación al pin que deja disponible el Shield, el de 3.3V (el que uso para mis pruebas y me funciona correctamente), y el GND a uno de los dos pines GND que deja disponilbes el Shield (he probado con ambos)

Mi teoría es que A1 (o cualquier otro, ya que he estado probando con todos los pines digitales, e incluso alimentandolo a 5V un momento, y hasta alimentacion desde pines digitales), es decir, el cable que va desde la "pata" de datos del LM35 hasta A1 recibe corriente del Shield, ya que el valor de temperatura que obtengo varía al pulsar cualquiera de los botones (y no debería, ya que ese pin queda a disposicion del usuario y el Shield no lo utiliza).... Mas abajo adjunto toda la documentacion que he podido encontrar, por si alguien es capaz de ver el fallo


Os dejo los códigos que utilizo para mostrar la temperatura por el Shield, y el de detectar los botones del Shield... Yo he probado integrando ambos y me da el error que comento, que obtengo valores de temperatura que no son los que necesito

Lo pongo en varios mensajes porque me pone que supero el maximo de caracteres

arduleo

CODIGO SHIELD LCD + BOTONES: http://pastebin.com/JP9cR6bw
(no cabe entero en un post)


CODIGO LCD + TEMPERATURA
Code: [Select]
#include <LiquidCrystal.h>

LiquidCrystal lcd( 8, 9, 4, 5, 6, 7);

float temp;
int tempPin = A1;

void setup() {
  lcd.begin(16, 2);
  lcd.print("Temperature:");
}

void loop() {
  temp = analogRead(tempPin);
  temp = temp * 0.48828125;
  lcd.setCursor(0, 1);
  lcd.print(temp);
  delay(1000);
}



Decir que también encontré un código que utiliza otra libreria, una llamada <LCD4Bit_mod.h> que en mi opinión es algo más compleja de usar, ya que solo permite imprimir chars por la LCD (O strings, ya que la libreria al parecer los convierte directamente), pero lo que yo necesito es mostrar un float


Tambien he pensado en utilizar este codigo y pasar (aun no se como) al final "grados" y "deciR" a char e intentar imprimirlos.. Pero sigo sin tener claro el error de la lectura erronea
Code: [Select]
//Control temperatura
int analogPin = A1; // Pin analogico 0 de Arduino
float temperature = 0.0;
int grados, decimas, gradR, deciR;
int lm35read, tmedia;
int val,cnt;


void setup()   {
  // Iniciamos comunicacion serie 
  Serial.begin(9600);
}


void loop()
{
    // inicializamos el valor de tmedia
    tmedia=0;
   
    // medimos la temperatura 10 veces y la almacenamos en tmedia
    for ( cnt=0; cnt<10; cnt++)
    {
      lm35read = analogRead(analogPin);
      tmedia=tmedia+lm35read;
    }
   
    // calculamos la media de las medidas
    tmedia=tmedia/cnt;
   
    // convertimos tmedia en un valor en grados, pero
    // dadas las caracteristicas del sensor la precision es de
    // 0.5 grados y los decimales son .4 o .9
    temperature = (5.0 * float(tmedia) * 100.0)/1024.0;
   
    // mapeamos el valor tmedia para que nos de
    // la temperatura en decimas de grado
    val = map(tmedia,0,1023,0,4990);
   
    // ahora los grados los obtenemos dividiendo por 10
    grados=val/10;
   
    // y las decimas de grado son el resto de la division
    // por 10
    decimas=val%10;
   
    // Redondeamos los decimales a 0 o a 5
    if (decimas< 3)
       {
         gradR=grados;
         deciR=0;
       }
    if ((decimas > 2)&(decimas<7))
       {
         gradR=grados;
         deciR=5;
       }
     else
       {
         gradR=grados+1;
         deciR=0;
       } 
   
    // Sacamos los datos por el puerto serie   
   /* Serial.print("Lectura en bruto ");
    Serial.print(lm35read);
    Serial.print("  temperatura sin redondear  ");
    Serial.print(temperature);
    Serial.print("C  ");
    Serial.print("temperatura redondeada ");*/
    Serial.print(grados);
    Serial.print(".");
    Serial.println(deciR);
   
    // Y por ultimo lo mandamos a la pantalla LCD

  /*  Serial.println("  Temperatura"); 
    Serial.print(" ");
   
    Serial.print(gradR);
    Serial.print(",");
    Serial.print(deciR);
    Serial.print(".C");
    Serial.print("       ");*/

    delay(2000);


}



Aquí os adjunto la documentación del shield que he podido encontrar:
- http://www.robotshop.com/content/PDF/dfrobot-arduino-shields-manual.pdf (Pagina 8 )
- Esquematico: http://www.robotshop.com/content/PDF/schematics-v1.0-dfr0009.pdf
- http://www.robotshop.com/content/PDF/wiki-dfr0009.pdf
- http://www.robotshop.com/content/PDF/lcd-datasheet-dfr0009.pdf (Datasheet del HITACHI HD44780U, que al parecer es el controlador que lleva la LCD)

Cualquier ayuda es bienvenida!
Y muchisimas gracias por adelantado :)

Go Up