Difference between revisions of "Termómetro conectado online"
(→4º Paso: Recepción de la temperatura por el 'imp' y subida a la nube de Carriots) |
(→Explicación básica del código del dispositivo 'imp') |
||
Line 176: | Line 176: | ||
agent.send("sendTemperature", s); | agent.send("sendTemperature", s); | ||
− | La función ''agent.send()'' tiene dos | + | La función ''agent.send()'' tiene dos parámetros. El primero es el nombre del mensaje que se hará llegar al agente en el servidor (''sendTemperature'' en este caso). El segundo es el objeto que se pasará como parámetro a la función del agente encargada de recibir ese mensaje. Para más información, consultar la documentación del API de electricImp en [http://www.electricimp.com/docs/api/agent/send/] y [http://www.electricimp.com]./docs/api/agent/ |
− | + | ||
===== Explicación básica del código del agente en el servidor de electricImp ===== | ===== Explicación básica del código del agente en el servidor de electricImp ===== |
Revision as of 22:27, 1 January 2014
Contents
- 1 Termómetro conectado online
- 1.1 Objetivo
- 1.2 Motivación
- 1.3 Antecedentes
- 1.4 Métodos y técnicas utilizadas
- 1.5 Detalles
- 1.5.1 1er Paso: Leer la temperatura desde Arduino y enviarla al dispositivo 'imp'
- 1.5.2 2º Paso: Conectar Arduino e 'imp' a través del conversor de tensión
- 1.5.3 3er Paso: Crear una cuenta y un dispositivo en el servidor de Carriots
- 1.5.4 4º Paso: Recepción de la temperatura por el 'imp' y subida a la nube de Carriots
- 1.6 Y ahora, ¿qué?
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 Arduino y enviarla al dispositivo '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:
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.
Tras leer la temperatura y enviarla al 'imp' a través de la conexión serie, el arduino espera un minuto (60000 milisegundos) hasta la siguiente lectura.
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); }
2º Paso: Conectar Arduino e 'imp' a través del conversor de tensión
'imp' trabaja a 3.3V mientras que Arduino lo hace a 5V. No se pueden conectar directamente pues se corre el riesgo de quemar el 'imp' con el exceso de voltaje generado por Arduino. La solución es conectarlos a través de un convertidor de tensión intermedio. Se ha elegido el conversor de Sparkfun [9] pero se podría utilizar cualquier otro componente similar. En la web de Sparkfun hay un tutorial explicando como funciona este componente y en particular hay un ejemplo para una conexión serie entre Arduino y electricImp, exactamente nuestro objetivo [sección "Using the LLC for Serial" https://learn.sparkfun.com/tutorials/using-the-logic-level-converter/hookup-examples]. Realizar las conexiones tal como se indican en el dibujo [10] pero tener en cuenta que nuestro Arduino está utilizando los pines 7 y 8 para la conexión serie con el 'imp'. Los cables que salen de los pines 0/RX0 (verde) y 1/TX0 (amarillo) deberán salir de los pines 7 y 8.
Importante: La conexión serie del Arduino utiliza los pines 7 y 8 (no los pines 0 y 1)
3er Paso: Crear una cuenta y un dispositivo en el servidor de Carriots
4º Paso: Recepción de la temperatura por el 'imp' y subida a la nube de Carriots
En el proyecto Hola Mundo eImp ya se explicó que electricImp permite programar tanto una aplicación local en el dispositivo 'imp' como un "agente" en la nube en el servidor de electricImp. Esta doble posibilidad facilita la implementación de servicios en Internet y la vamos a utilizar para enviar al servidor de Carriots los datos de temperatura recibidos desde Arduino. Se recomienda repasar la sección "2º Paso: Cargar la aplicación Hola Mundo" del proyecto Hola Mundo eImp antes de seguir con este paso.
- Hacer login en la página de electric imp para acceder al IDE
- En el menú de navegación de la izquierda buscar el dispositivo 'imp' que estamos utilizando (puede que se encuentro dentro de la pestaña "New Devices" o dentro de la pestaña de alguno de los modelos que se hayan definido)
- Pulsar sobre el icono de configuración a la derecha del dispositivo imp
- Pulsar sobre la lista desplegable "Associated Model" y escribir el nombre del nuevo modelo que vamos a crear "Temperature Carriots". Pulsar "Save Changes"
- El modelo "Temperature Carriots" 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
- La aplicación utiliza código en el dispositivo y en el servidor. El código del servidor se incluiría en la caja llamada "Agent" y el código del dispositivo en "Device".
- Copiar y pegar el siguente código en la caja "Device"
server.log("Device Started"); local s=""; local sSize=0; arduino <- hardware.uart57; function arduinoData() { local b = arduino.read(); while(b != -1) { sSize++; if (sSize>10) { sSize=0; s=""; server.log("reset string"); } if (b == 0xFC) { agent.send("sendTemperature", s); server.log(s); sSize=0; s=""; } else {s= s+b.tochar();} b = arduino.read(); } } arduino.configure(9600, 8, PARITY_NONE, 1, NO_CTSRTS, arduinoData);
- Copiar y pegar el siguente código en la caja "Agent"
const CARRIOTS_URL = "http://api.carriots.com/streams/"; const jsonStringA= "{\"protocol\":\"v1\",\"at\": \"now\",\"device\":\"your_device_id\",\"data\":{\"temp\":\""; const jsonStringB="\"},\"checksum\":\"\"}"; function postTemperature(tempString) { local body = jsonStringA + tempString + jsonStringB; local request = http.post(CARRIOTS_URL, {"carriots.apiKey":"your_api_key"}, body); local resp = request.sendsync(); server.log("HTTPResponse: " + resp.statuscode + " - " + resp.body + " " + tempString); } device.on("sendTemperature", postTemperature);
Nota: Sustituir en el código las cadenas your_device_id y your_api_key por los valores obtenidos en el paso anterior.
- 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, se empezará a ejecutar. El dispositivo imp espera a recibir datos a través de la conexión serie con Arduino. Cunado recibe un dato de temperatura, lo envía al agente en el servidor de electricImp y añade un nuevo mensaje en la ventana Log del IDE. Al recepcionar esta nueva lectura, el agente de electricImp la reenvía al servidor de Carriots y añade un mensaje al Log del IDE indicando el resultado de este envío.
Explicación básica del código del dispositivo 'imp'
Recordamos que el código del 'imp' se ejecuta de forma secuencial empezando desde la primera línea (las funciones se definen con la palabra clave function y no forman parte del flujo secuencial).
Disclaimer: No soy experto en squirrel, el lenguaje de programación de electricImp, así que pido disculpas por la mala calidad y organización del código.
Se define una variable s para almacenar la cadena de caracteres recibida desde Arduino a través de la conexión serie. La longitud de esta cadena se almacena en sSize (seguro que squirrel permite trabajar con cadenas de caracteres de una forma más sencilla, pero no la he encontrado).
También se define una variable arduino que representa la conexión serie. Se utilizan los pines 5 y 7 del imp (uart57):
arduino <- hardware.uart57;
Esta variable se inicializa más abajo. Además de especificar los parámetros técnicos de la conexión serie, se define la función a la que se llamará en el imp cuando se reciban datos a través de la conexión serie: arduinoData().
arduino.configure(9600, 8, PARITY_NONE, 1, NO_CTSRTS, arduinoData);
Se puede encontrar más información sobre las conexiones serie en el imp en la documentación de electricImp [11]
La función arduinoData() es la encargada de escuchar la conexión serie con Arduino. Cuando se recibe algún byte por esa conexión, el dispositivo imp llama a esta función. arduinoData() lee los bytes recibidos y los va almacenando en la variable s como una cadena de carateres. Este proceso continúa hasta que se recibe el código 0xFC, que es el mismo valor que se ha definido en el sketch de Arduino para identificar el final de un envío de datos. Si se leen más de 10 bytes antes de recibir un código de final de envío, se resetea la cadena s pues se asume que se están recibiendo datos eróneos o ruido.
Cuando se recibe el código de fin de envío, la función arduinoData() envía la cadena almacenada en la variable s (el dato recibido desde Arduino) al agente que está corriendo en el servidor de electricImp en la nube:
agent.send("sendTemperature", s);
La función agent.send() tiene dos parámetros. El primero es el nombre del mensaje que se hará llegar al agente en el servidor (sendTemperature en este caso). El segundo es el objeto que se pasará como parámetro a la función del agente encargada de recibir ese mensaje. Para más información, consultar la documentación del API de electricImp en [12] y [13]./docs/api/agent/
Explicación básica del código del agente en el servidor de electricImp
blablabla
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.