domingo, 20 de enero de 2013

ARDUINO XBEE DS1621 Y LCD

TRASMISIÓN Y RECEPCIÓN DE DATOS DE TEMPERATURA DESDE UN SENSOR BASADO EN UN DS1621 (I2C).  LA TEMPERATURA SE TRASMITE Y SE RECIBE A TRAVES DE DOS MÓDULOS XBEE CONECTADOS  A DOS ARDUINOS UNO LA EMPERATURA SE MUESTRA EN UN LCD SERIAL DE SPARKFUN.


En esta primera práctica con Arduino y XBee vamos a realizar una trasmisiñon y recpeción de una temperatura númericamente como un entero utilizando dos módulos XBee conectados cada uno a una placa Arduino UNO.

El módulo trasmisor donde está el dispositivo sensor ds1621 se muestra en la siguiente figura.

Observamos el integrado i2c ds1621 conectado a las lineas SDA y SCL del Arduino que ésta debajo del módulo Xbee que actúa como trasmisor por el puerto serie.

He tenido que usar el puerto serie hardware del arduino porque no he podido utilizar un puerto serie software (librería softwareserial) con esta "shield" XBee. Por internet he encontrado gente que ha tenido este mismo problema.



El código implementado en el Arduino asociado a trasmisor es el siguiente:

 /* TRASMISIÓN Y RECEPCIÓN DE DATOS DE TEMPERATURA DESDE UN SENSOR BASADO EN UN DS1621 (I2c).
   LA TEMPERATURA SE TRASMITE Y SE RECIBE A TRAVES DE DOS MÓDULOS XBEE CONECTADOS
   A DOS ARDUINOS. LA EMPERATURA SE MUESTRA EN UN LCD SERIAL DE SPARKFUN.
 
   CODIGO DEL TRASMISOR. (Donde está conectado el sensor ds1621)
 
   Realizado por German Tojeiro (rastman) en Enero de 2013.
*/
#include <Wire.h>          // Librería de control del bus i2c.
#define DEV_ID 0x90 >> 1   //Desplazamiento de la dirección del ds1621 necesario por la librería wire.h
int LED = 11;              // Utilizamos un LED parpadeante para observar si la trasmisión de la temperatura
                           // se efectúa correctaemnte.
int temp = 0;
void setup()
{

     pinMode(LED,OUTPUT);
     Serial.begin(9600);   // Establecemos la velocidad de trasmisión del módulo XBee.
  
     Wire.begin();
     Wire.beginTransmission(DEV_ID);   // Conectamos el ds1621
     Wire.write(0xAC);                 // Accedemos a su configuración
     Wire.write(0x02);                 // Establecemos una conversión continua de temperatura
     Wire.beginTransmission(DEV_ID);   // Lo reseteamos
     Wire.write(0xEE);                 // Empieza a convertir
     Wire.endTransmission();           // Finalizamos la comunicación con él y lo dejamos trabajar.

  }
    void loop()
  {
       delay(1000);                    // Le damos un tiempo para convertir cada temperatura
       Wire.beginTransmission(DEV_ID);
       Wire.write(0xAA);             
       Wire.endTransmission();
       Wire.requestFrom(DEV_ID, 1);            
       temp = Wire.read();             // Leemos el dato de temperatura en modo absoluto (sin decimales)
    
       Serial.print(temp);            // Enviamos el dato a través del módulo XBee.
       digitalWrite(LED,HIGH);
       delay(100);                     // El Led parpadea indicando que se está trasmitiendo la temperatura.
       digitalWrite(LED,LOW);
    }


El módulo recpetor donde está el LCD donde se muestra la temperatura se muestra en la siguiente figura:

Observamos el LCD serial de Sparkfun que muestra la temperatura recibida. Este LCD utiliza la librería serial y de esta manera ahorramo bastante cableado.
 Este módulo va conectado al PC ya que en una futura práctica lo tengo pensado integrar con el software de adquisición de datos "myOpenlab" para presentar la temperatura de una forma más visual y gráfica.

El código implementado en el Arduino asociado a receptor es el siguiente:

 /* TRASMISIÓN Y RECEPCIÓN DE DATOS DE TEMPERATURA DESDE UN SENSOR BASADO EN UN DS1621 (I2c).
   LA TEMPERATURA SE TRASMITE Y SE RECIBE A TRAVES DE DOS MÓDULOS XBEE CONECTADOS
   A DOS ARDUINOS. LA EMPERATURA SE MUESTRA EN UN LCD SERIAL DE SPARKFUN.
 
   CODIGO DEL RECEPTOR.
 
   Realizado por German Tojeiro (rastman) en Enero de 2013.
*/

#include <SoftwareSerial.h>    // Se utiliza la libreria serie para el LCD serial
SoftwareSerial mySerial(3,2);

      int LED = 11;              // Utilizamos un LED parpadeante para observar si la recepción de la temperatura
                               // se efectúa correctaemnte.
    char temp;                 // Utilizamos dos variables tipo caracter para recibir los dos digitos que forman
    char temp1;                // el dato absoluto de la temperatura.
     
    void setup()
    {
     Serial.begin(9600);      // Establecemos la velocidad de trasmisión del módulo XBee.
     pinMode(LED,OUTPUT);
     mySerial.begin(9600);     // Establecemos la velocidad de de conexión del LCD Serial.
     delay(500);               // Esperamos a que el LCD se inicialice.
   
      mySerial.write(254);      // Situamos el cursor del LCD al principio de éste.
     mySerial.write(128);

     mySerial.write("                "); // Limpiamos el LCD
     mySerial.write("                ");
   
     mySerial.write(254);       // Situamos el cursor del LCD al principio de éste.
     mySerial.write(128);
     mySerial.write("TEMPERATURA:");
   
    }
  
    void loop()  {
 
     mySerial.write(254);       // Situamos el cursor del LCD al final de la 1º linea para mostrar la temperatura
     mySerial.write(141);
      
     if (Serial.available() > 0)  // Comprobamos que el canal serie XBee está disponible
     {
          digitalWrite(LED,HIGH);  // Hacemos parpadear el LED
        
          temp = Serial.read();   // Leemos el 1º digito de la Temparatura del Buffer del Xbee
          delay(100);
          temp1 = Serial.read();  // Leemos el 2º digito de la Temparatura del Buffer del Xbee

          mySerial.write(temp);    // Enviamos la temperatura (2 digitos) AL LCD.
          mySerial.write(temp1);
        
          digitalWrite(LED,LOW);

     }
 }

No hay comentarios:

Publicar un comentario