Difference between revisions of "Termómetro conectado online"

From Wiki Makespace Madrid
Jump to: navigation, search
(1er Paso: Leer la temperatura desde el Imp)
(1er Paso: Leer la temperatura desde el Imp)
Line 41: Line 41:
  
  
  /*  
+
/*  
  Simple sketch to read Temperature from DHT11 sensor
+
Simple sketch to read Temperature from DHT11 sensor
  Written by Javier Montaner @tumaku_ for Makespace Madrid  
+
Written by Javier Montaner @tumaku_ for Makespace Madrid  
  http://www.makespacemadrid.org
+
http://www.makespacemadrid.org
 
+
  Based on YourDuino.com Example Software Sketch
+
Based on YourDuino.com Example Software Sketch
  DHT11 Humidity and Temperature Sensor test
+
DHT11 Humidity and Temperature Sensor test
  Credits: Rob Tillaart
+
Credits: Rob Tillaart
  http://arduino-direct.com/sunshop/index.php?l=product_detail&p=162
+
http://arduino-direct.com/sunshop/index.php?l=product_detail&p=162
  terry@yourduino.com */
+
terry@yourduino.com */
  
  #include <dht11.h>
+
#include <dht11.h>
  #include <SoftwareSerial.h>
+
#include <SoftwareSerial.h>
  
  dht11 DHT11;
+
dht11 DHT11;
  
  #define DHT11PIN 2
+
#define DHT11PIN 2
  SoftwareSerial eImpSerial(7, 8); // RX, TX
+
SoftwareSerial eImpSerial(7, 8); // RX, TX
  
  void setup()   
+
void setup()   
  {
+
{
 
     Serial.begin(9600);
 
     Serial.begin(9600);
 
     eImpSerial.begin(9600);
 
     eImpSerial.begin(9600);
Line 68: Line 68:
 
     Serial.println(DHT11LIB_VERSION);
 
     Serial.println(DHT11LIB_VERSION);
 
     Serial.println();
 
     Serial.println();
  }
+
}
  
  void loop()   
+
void loop()   
  {
+
{
 
     int chk = DHT11.read(DHT11PIN);
 
     int chk = DHT11.read(DHT11PIN);
 
     Serial.print("Temperature (oC): ");
 
     Serial.print("Temperature (oC): ");
Line 78: Line 78:
 
     eImpSerial.write(0xFC);
 
     eImpSerial.write(0xFC);
 
     delay(60000);
 
     delay(60000);
  }
+
}
  
  

Revision as of 17:29, 1 January 2014

Termómetro conectado online

ESTADO: Verisón Inicial Miembros: User:Tumaku


Objetivo

Publicar online la temperatura de un térmometro a través de los servidores en la nube de electricImp, Carriots y Ducksboard

Motivación

Empezar a trabajar sobre un proyecto real con las muestras que electric imp ha donado a Makespace. Si se instala en el espacio, el proyecto permite consultar desde interner la temperatura real de Makespace Madrid

Antecedentes

Se asume que ya se ha creado una cuenta en electricImp y que se ha configurado el electricImp con los parámteros de la red WiFi a utilizar. Estos pasos se describen en Hola Mundo eImp

Métodos y técnicas utilizadas

En este proyecto seutilizan los siguientes componenetes o servicios:

  • Sensor de temperatura DHT11 [1]
  • Arduino Uno (o Pro Mini 5V)
  • Convertidor de nivel [2]
  • Dispositivo 'imp' de electricImp con cuenta gratuita y servicio en la nube [3]
  • Cuenta gratuita y servicio en la nube de carriots [4]
  • Cuenta gratuita y servicio en la nube de ducksboard [5]

Detalles

1er Paso: Leer la temperatura desde el Imp

El sensor de temperatura DHT11 es muy sencillo de utilizar pero no es "compatible" con el HW del imp debido a su protocolo "propietario" para leer la temperatura y a su alimentación a 5V (el imp sólo funciona a 3.3V). En el propio foro de electricImp recomiendan utilizar un micro intermedio (arduino) para leer la temperatura y pasar esa lectura al imp a través de una conexión serie [6]

Para leer la temperatura del sensor DHT11 desde Arduino nos basamos en la librería y el skecth de Rob Tilliart en [7]. El enlace describe como instalar y utilizar la librería desde el IDE de Arduino.

Nota: La foto del sensor DHT11 en el enlace anterior muestra que tiene 4 PINes en su parte inferior. Sin embargo, el sensor montado sobre una pequeña place PCB vendido en DealeXtreme [8] sólo expone 3 PINes. La siguiente foto describe la función de cada uno de esots PINes:

DHT11.jpg

El sketch de Arduino simplemente lee la temperatura del pin DHT11PIN (Digital pin 2 of the Arduino) y envía el valor leído por medio de una conexión serie (Pines 7 y 8 de Arduino: SoftwareSerial eImpSerial(7, 8)). Tras envíar el valor de temperatura, se manda un código especial (byte 0xFC) para indicar al otro extremo de la conexión serie (el 'imp') el final del envío. A continuación se incluye el sketch de Arduino completo:


/* 
Simple sketch to read Temperature from DHT11 sensor
Written by Javier Montaner @tumaku_ for Makespace Madrid 
http://www.makespacemadrid.org

Based on YourDuino.com Example Software Sketch
DHT11 Humidity and Temperature Sensor test
Credits: Rob Tillaart
http://arduino-direct.com/sunshop/index.php?l=product_detail&p=162
terry@yourduino.com */
#include <dht11.h>
#include <SoftwareSerial.h>
dht11 DHT11;
#define DHT11PIN 2
SoftwareSerial eImpSerial(7, 8); // RX, TX
void setup()   
{
   Serial.begin(9600);
   eImpSerial.begin(9600);
   Serial.println("DHT11 TEST PROGRAM ");
   Serial.print("LIBRARY VERSION: ");
   Serial.println(DHT11LIB_VERSION);
   Serial.println();
}
void loop()  
{
   int chk = DHT11.read(DHT11PIN);
   Serial.print("Temperature (oC): ");
   Serial.println((float)DHT11.temperature, 2);
   eImpSerial.print((float)DHT11.temperature, 2);
   eImpSerial.write(0xFC);
   delay(60000);
}


Recomendaciones:

- Mantener la pantalla tan cerca como sea posible del sensor de luz del imp

- Utilizar el pulgar para cubrir la parte superior expuesta del imp (donde dice "developer edition")

- Evitar realizar el proceso con fuentes directas de luz. Ejecutar BlinkUp en la sombra

- No mover el teléfono o el imp durante el proceso

Importante: Ejecutar BlinkUp con la pantalla orientada en la dirección opuesta a tu vista (o la de otras personas) especialmente si tienes una condición médica que te hace susceptible a luz estróbica. Hay dos pitidos sonoros justo antes de que la aplicación empiece y termine el proceso de BlinkUp. Puedes cerrar los ojos mientras se está flasheando el imp.

Si todo ha ido bien, la luz del imp debería ponerse a parpadear en verde. Eso significa que se ha conectado a la red wifi y a la plataforma cloud de electric imp en internet. En caso de que la luz no parpadee en verde, consultar la página de Solución de problemas

2º Paso: Cargar la aplicación Hola Mundo

Uno vez configurado el dispositivo imp y la cuenta en el servidor, vamos a seguir el tutorial Hello world para cargar y ejecutar el primer programa, el "Hola mundo" de los objetos conectados.

Tras crear el circuito con un LED y una resistencia y conectarlo al imp como se indica en la figura del tutorial, hay que realizar los siguientes pasos:

  • Hacer login en la página de electric imp para acceder al IDE
  • En el menú de navegación de la izquierda pulsa en "New Devices" para expandir la lista de dispositivos
  • Pulsar sobre el icono de configuración a la derecha del nuevo dispositivo imp que acabamos de flashear (su nombre será una ristra de caracteres hexadecimales)
  • Se puede cambiar el nombre del dispositivo a algo más amigable ("Makespace Imp" por ejemplo). Este nombre se asocia a la placa April y no al dispositivo imp propiamente dicho
  • Pulsar sobre la lista desplegable "Associated Model" y escribir el nombre del nuevo modelo que vamos a crear "Hello world". Pulsar "Save Changes"
  • El modelo "Hello world" aparecerá en el menú de navegación de la izquierda y pulsando sobre él se muetra el nombre de nuestro dispositivo. Directamente o pulsando sobre el nombre del dispositivo, la sección principal del IDE mostrará el editor de código donde vamos a codificar la aplicación
  • Nuestra aplicación sólo utiliza código en el dispositivo (no requiere un agente en el servidor) con lo que nos situaremos en el cuadro de texto llamado "Device".

La aplicación del servidor se incluiría en la caja llamada "Agent". La tercera caja "Log" es el equivalente del Monitor serie del IDE de Arduino, tanto aplicaciones de dispositivo como agentes del servidor pueden escribir en tiempo real sobre el IDE utilizando el comando:

server.log("Mi texto");
  • Copiar y pegar el siguente código en la caja "Device"
imp.configure("Hello World", [], []);

// create a global variabled called led, 
// and assign pin9 to it
led <- hardware.pin9;

// configure led to be a digital output
led.configure(DIGITAL_OUT);

// create a global variable to store current
// state of the LED
state <- 0;

function blink() {
 // invert the value of state:
 // when state = 1, 1-1 = 0
 // when state = 0, 1-0 = 1
 state = 1-state;  

 // write current state to led pin
 led.write(state);
 server.log("Estado" + state);
 // schedule imp to wakeup in .5 seconds and do it again. 
 imp.wakeup(0.5, blink);
}

// start the loop
blink();
  • Pulsar el botón "Build and Run" en la parte superior del IDE. La aplicación se compilará y si hay errores se mostrarán en la consola. Si todo va bien, tras la compilación el servidor de electric imp cargará la aplicación en nuestro imp a través de internet y la conexión wifi (el imp debe estar encendido y conectado a la red wifi)
  • Una vez cargada la aplicación, el imp empezará a ejecutarlo y el LED parpadeará. Cada vez que cambié el estado del LED también aparecerá un mensaje en la caja Log del IDE
Explicación básica del código

electric imp utiliza un lenguaje de programación llamado Squirrel. Lo mejor para aprender es empezar a jugar con los ejemplos de código disponibles en la sección API Docs del Dev Center de electric Imp.

Un programa se ejecuta en modo secuencial empezando por la primera línea. Las funciones se definen precedidas por el keyword 'function'. Pueden colocarse en cualquier parte del código y no forman parte del flujo secuencial. Por ejemplo, en el programa "Hello world" se define la función "function blink()" para cambiar el estado del LED. Sin embargo, esta función sólo se ejecuta porque al final del código hay una línea que la llama:

blink();

Las variables se inicializan al principio. Se les puede asignar números, cadenas, PINes,... El programa "Hello world" define una variable para gestionar el PIN al que se conecta el LED y otra variable para definir su estado.

Todo el código se realiza en la función blink(). Básicamente cada vez que se llama a está función se cambia el estado del LED y se escribe el PIN en consecuencia. También se envía un mensaje al Log del servidor indicando el cambio de estado

server.log("Estado " + state);

Realizado esto, se le dice al imp que entre en modo sleep durante medio segundo y que cuando vuelva a despertarse ejecute de nuevo la función blink() para así generar el parpadeo del LED

imp.wakeup(0.5, blink);

Y ahora, ¿qué?

El siguiente paso será implementar un agente en el servidor. Hay un ejemplo en el tutorial Agents. Después es cuestión de trastear por los ejemplos en API Docs e ir aprendiendo sobre la marcha.

Con la ayuda de Hugo de electric imp creé un ejemplo para conectar un lector NFC a un imp y enviar la identidad de las tarjetas leídas al servidor. El código y una pequeña explicación están disponibles en github Podríamos crear un proyecto sobre esto para la gestión de la puerta o el acceso a las máquinas.