Estoy seguro de que acierto si digo que, en algún momento de tu vida, te enseñaron un campo que te gustó pero en el que por una cosa u otra no pudiste profundizar. Algo que te llamó la atención, que te interesó, que te motivó, que te gustó aprender, pero que finalmente tuviste que dejar de lado para dedicar tu tiempo a otras cosas quizá menos estimulantes aunque más prioritarias.
A mí, en mi caso, me pasó con la electrónica. Me llamó la atención desde siempre, disfruté aprendiendo algo de ella y ahora, varios años después, me he animado a retomarla y a volver a disfrutar pelando cables y juntando unos componentes con otros para hacer cosas que se mueven, suenan, se encienden y funcionan en el mundo real. Paralelamente, aprender algo que habia olvidado me ha ayudado a tener una nueva perspectiva del conocimiento que ahora mismo tengo.
El caso es que estoy dando mis primeros pasos con Arduino montando algunas cosas sencillitas. Hay muchísima información acerca de Arduino en la red, os recomiendo que visiteis su web y la entrada en la wikipedia. También hay un documental en castellano sobre Arduino que, aunque es un poco aburrido, dice algo con lo que yo también estoy de acuerdo: es una herramienta interesantísima para utilizar en los institutos ya que permite fomentar la imaginación de los adolescentes, independientemente de que éstos estudien letras o ciencias. Lo importante es utilizar la parte derecha del cerebro.
En esta entrada voy a explicar un pequeño montaje que hemos hecho entre Carlos Javier Prados, mi jefe, y yo, utilizando Arduino. Como ambos nos dedicamos al M2M, y a los dos nos gusta programar, la electrónica y el cacharrear, no ha sido muy difícil que nos pusieramos de acuerdo para hacer un pequeño prototipo conjunto y que disfrutásemos a medida que éste iba progresando y tomaba forma.
El funcionamiento del prototipo es muy sencillo y nos permitirá poder ver desde nuestro teléfono la temperatura que hace en un lugar que queramos. La idea es que dejes un pequeño sistema funcionando, por ejemplo, en el salón de tu casa y, ya en el trabajo, en la calle, en el cine, o en cualquier sitio con conexión a internet puedas ver qué temperatura hace en ese momento en el salón.
Los elementos que van a entrar en juego son tres:
En cuanto a los componentes que vamos a necesitar para cada uno de los elementos, son los siguientes:
1. Para poder medir la temperatura:
2. Para poder enviarla:
3. Para poder leerla:
Si sabes algo de electrónica verás que el circuito es muy sencillo: dos cables se encargan de alimentar una resistencia cuya impedancia varía en función de la temperatura y un tercer cable devuelve el voltaje que no se ha consumido en dicha resistencia. Dicha resistencia, por tanto, actúa como un sensor de temperatura.
Los cables encargados de la alimentación son el rojo y el negro y el que devuelve el voltaje en función a la temperatura es el amarillo. Fijaros en que el cable amarillo se conecta en la entrada analógica 0 de la placa Arduino.
Una vez lo tengamos montado programamos la placa Arduino para que, en función al voltaje recibido por la resistencia, esta haga una conversión y envíe la temperatura ambiente en grados centígrados a través del puerto USB con el que se conecta la placa Arduino con el ordenador. El lenguaje, aunque parezca C, es Processing.
int PIN_SENSOR = 0; int TIEMPO_ENTRE_MEDICIONES = 5 * 60 * 1000; // 5 minutos float MARGEN = .5; float temperaturaAnterior = -100; // --------------------------------------------------- // procedimiento de iniciacion // --------------------------------------------------- void setup() { Serial.begin(9600); } // --------------------------------------------------- // procedimiento que se ejecuta permanentemente // --------------------------------------------------- void loop() { float temperaturaActual = getTemperature(PIN_SENSOR); if (isInRange(temperaturaActual)) { temperaturaAnterior = temperaturaActual; Serial.println(temperaturaActual); } delay(TIEMPO_ENTRE_MEDICIONES); } /** * Metodo que devuelve la temperatura que mide el sensor conectado al pin * recibido por parametro */ float getTemperature(int pin) { // recupera el voltaje leido por el sensor de temperatura // teniendo en cuenta que devuelve 10 mv por cada centesima de grado centigrado // con un offset de 500 mV para poder medir temperaturas por debajo // de cero grados return (getVoltage(pin) - .5) * 100; } /** * Metodo que devuelve el voltaje que mide el sensor conectado al pin * recibido por parametro */ float getVoltage(int pin) { // el sensor devuelve como maximo 5 voltios // y la pata de arduino tiene una resolucion de 0 a 1023 // de tal modo que 5 / 1024 = .004882814 return (analogRead(pin) * .0048828125); } /** * Metodo que indica si la temperatura medida esta dentro de los margenes * en los cuales consideramos que no es necesario actualizar la informacion */ boolean isInRange (float temperatura) { return ((temperatura + MARGEN) <= temperaturaAnterior || (temperatura - MARGEN) >= temperaturaAnterior); }
El código, como veis, está muy explicado. Lee la temperatura del sensor desde la entrada analógica 0 cada 5 minutos, y si ésta ha variado en más de medio grado por encima o por debajo la envía a través del cable USB.
Poder programar en la placa Arduino y poder hacer pruebas leyendo del puerto USB es muy sencillo gracias a Arduino IDE, por lo que no entraré en detalles.
El sensor que hemos utilizado es el TMP36GZ, de tal modo que el programa funciona bien con ese sensor pero, para otro sensor diferente, será necesario hacer un programa distinto.
De momento tenemos un pequeño circuito que cada 5 minutos comprueba la temperatura y, si ésta ha cambiado en más de medio grado por encima o por debajo, nos la devuelve. Ahora debemos leer esa temperatura y publicarla en internet para poder verla cuando estemos en otro sitio.
Para publicarla barajamos varias opciones, como por ejemplo hacer una pequeña aplicación y dejarla en Google App Engine, pero no nos aportaba mucho y nos hacía trabajar más. Otra opción era crearle una cuenta de twitter al sensor y que fuese publicando la tempertura, lo cual aunque nos pareció gracioso no terminó de cuajar. Finalmente decidimos que la mejor opción era utilizar pachube, que es un servicio cuya función es precisamente la de poder enviar y recibir información leida desde sensores que tienen los propios usuarios, así que creamos una cuenta gratuita en pachube y le dimos uso.
Pero claro, la placa Arduino por sí sola no envia la información a pachube, simplemente la envía por el puerto USB. Es por ello que hicimos un pequeño script en Python que lee desde el puerto USB y, cuando hay una nueva lectura, genera un objeto JSON y lo envía a pachube:
#!/usr/bin/env python
import httplib
import serial
from string import Template
ser = serial.Serial('/dev/tty.usbmodem1a21', 9600)
while 1:
# LEEMOS LA TEMPERATURA ENVIADA POR ARDUINO
# le quitamos los dos ultimos caracteres
readedTemperature = ser.readline()[:-2]
print "The new temperature is :", readedTemperature
# CREAMOS EL OBJETO JSON
# reemplazamos los valores en una plantilla
bodyTemplate = '''{
"version":"1.0.0",
"datastreams":[
{"id":"0", "current_value":"$temperature"}
]
}'''
template= Template(bodyTemplate)
bodyContent = template.substitute(temperature=readedTemperature)
# LO ENVIAMOS A PACHUBE
# aqui es necesario poner la key del usuario que tengais en pachube
# y subir los datos a vuestro datastream
headers={"X-PachubeApiKey":"VUESTRA KEY DE PACHUBE"}
connection = httplib.HTTPConnection('api.pachube.com')
connection.request('PUT', '/v2/feeds/ID DATASTREAM', bodyContent, headers)
response = connection.getresponse()
print response.status, response.reason
Como veis, este código también está muy comentado. Tan sólo mencionar que pachube os crea una key y un datastream cuando os registrais y que debeis modificar este script en Python para rellenarlo con vuestros datos.
Bueno, dejamos el sistema funcionando y nos vamos. Cuando queramos saber qué temperatura hace en el lugar donde hayamos dejado el invento nos vamos a nuestra cuenta de pachube y lo consultamos. Veremos una gráfica como la siguiente:
Pues como veis ha sido todo muy sencillo. La electrónica es muy simple y los dos programas hacen mucho con muy poco código. Lo bueno de utilizar estas herramientas para hacer estos prototipos es que se pueden hacer infinidad de cambios y, de este modo:
Me gustaría terminar esta entrada con una cita que, aunque no se de quién es, me viene en este caso como anillo al dedo:
“La diferencia entre los niños y los adultos está en el precio de sus juguetes.”
21 respuestas a Conoce la temperatura del sitio que quieras con Arduino y Pachube
Javier
5 de Julio de 2011 a las 1:10
Realmente piensas que esa programación es fácil para el nivel del instituto?
Nosotros en 3º y 4º damos una nociones de LOGO más para enseñar los conceptos y las estructuras que para hacer “grandes programas”.
Raúl Expósito
5 de Julio de 2011 a las 9:42
Muy buenas Javi,
Yo no lo veo especialmente complicado, pero mi punto de vista puede no ser válido
. Si te fijas, en la aplicación para Arduino hay sólo dos reglas de tres y dos comprobaciones. De todos modos he visto y he montado circuitos con más componentes y más vistosos que, con una programación más sencilla, seguramente sean más adecuados para estudiantes.
Si te animas algún día a montar algo con Arduino para tus chavales sabes que puedes contar conmigo. Al fin y al cabo tú fuiste quien me enganchó a esto enseñándome electricidad en clase de “maderitas”.
Un abrazo
Carlos García
10 de Julio de 2011 a las 15:34
Excelente Raúl,
Veo que tenemos inquietudes pareciadas en relación a la electrónida y la integración de software y hardware, espero aprendas mucho.
Un abrazo.
Raúl Expósito
10 de Julio de 2011 a las 20:17
Muy buenas Carlitos,
Tú que eres de Android quizá esto te parezca interesante:
http://www.amarino-toolkit.net/
http://developer.android.com/guide/topics/usb/adk.html
http://tcrobotics.blogspot.com/2011/05/tutorial-arduino-uno-adk-de-google.html
Si quieres que entre los dos nos piquemos a ver qué podemos hacer con esto hazmelo saber ¿va?
Saludetes
Dani
16 de Julio de 2011 a las 18:45
Buenas tardes a todos,
Me ha gustado la idea de trastear con la electrónica y espero seguir los post que colguéis.
He entrado en la web de Arduino, la cual me ha dirigido a otras web para poder comprar la placa,
pero he visto que existen varios modelos, Arduino MEGA ADK, Arduino Ethernet, Arduino Inventor Kit…
¿Podéis decirme con que placa estáis jugando, o cual es la buena para empezar?
Saludos.
Raúl Expósito
17 de Julio de 2011 a las 8:58
Muy buenas Dani,
La placa que tenemos es una Arduino Uno. En su momento tratamos de encontrar una tienda física donde poder comprarla pero no la encontramos, así que me imagino que tú también tendrás que comprarla por Internet.
Para empezar en esto compramos un kit llamado ‘Arduino Inventor Kit’ en un sitio llamado bricogeek. El precio de este kit es alto pero viene con un montón de componentes y con ejemplos de qué puedes hacer con Arduino y cómo hacerlo. Si vas a comenzar en esto y no tienes ni un simple cable pelado que usar te recomendaría que te comprases un kit de este estilo.
Saludos
fernando Z
17 de Julio de 2011 a las 16:42
Hola, te quisiera pedir ayuda, no soy programador y me estanque en la generación del JSON con python para poder subir datos a PACHUBE.
He instalado ambas aplicaciones (python y pyserial), como también intente copiar el código dentro de python con mi respectiva API pero no logro generar el JSON. Trate de leer en internet sobre generación de JSON pero me supera ampliamente. Si puedes ayudarme estaría muy agradecido!
Saludos desde Argentina
Raúl Expósito
17 de Julio de 2011 a las 17:50
Muy buenas Fernando,
Lo explico de otra manera por si tener otro enfoque te sirve de ayuda.
Para generar el objeto JSON y subirlo a pachube necesitamos tres cosas:
1- La temperatura, que nos llega desde Arduino y la leemos con pyserial.
2- Sustituir la temperatura en la plantilla que nos sirve para generar el objeto json.
3- Una key y un datastream de pachube.
El objeto json no es más que un texto plano. Cuando hablamos de generar un objeto json y subirlo a pachube lo unico que hacemos es generar un texto que se puede leer y enviarlo a pachube para que lo procese.
Si quieres probar que la temperatura te está llegando bien, mira en la consola cuando se esté ejecutando el script en python y verás registros como este (por ejemplo, para 30º):
The new temperature is :30
Si no fuese así, es señal de que no estás recibiendo bien la temperatura. Quizá no debas leer del puerto /dev/tty.usbmodem1a21 sino de otro en funcion a tu ordenador.
Si eso funcionase bien, hay una linea donde pone:
bodyContent = template.substitute(temperature=readedTemperature)
En esa linea lo que estas haciendo es usar una plantilla y ponerle el valor de la temperatura que te llega de Arduino. Prueba a añadir esta linea justo debajo para ver el objeto json que mandas:
print bodyContent
Verás que eso te genera un texto como este (en el caso de que hiciera 30 grados):
”{
“version”:”1.0.0″,
“datastreams”:[
{"id":"0", "current_value":"30"}
]
}”
Si eso funcionase bien revisa que los datos de pachube también estén bien. Tienes que sustitir dos datos en el script:
1- X-PachubeApiKey: y poner tu key
2- /v2/feeds/ID DATASTREAM, y poner el ID del datastream que te hayas creado.
Yo no puse esos datos por una razón: el primero es que la key actua a todos los efectos como un par usuario+contraseña codificados, y si los pongo todos podriais usar mi cuenta
, y la segunda es que ese datastream es privado ya que tiene información que sólo quiero poder ver yo.
Si tienes más dudas escríbeme si quieres. Tienes mi correo en la sección ‘acerca de’.
Saludos
Dani
30 de Julio de 2011 a las 17:11
Hola,
Ya me llego el kit de la placa, pero en el no viene ningún trasformador para la placa. Cual usáis vosotros?
Saludos.
Raúl Expósito
4 de Agosto de 2011 a las 21:10
Buenas Dani,
No usamos ningún transformador. Usamos el cable USB que viene con el kit tanto para alimentar la placa como para transmitir la información.
Saludos
Javier
13 de Septiembre de 2011 a las 17:44
http://lifehacker.com/5839544/the-introduction-to-arudino-comic-makes-it-easy-to-get-started-with-electronics-hacking
Para contarlo a otros
Un abrazo
Raúl Expósito
15 de Septiembre de 2011 a las 9:47
Muchas gracias por compartir el enlace Javi, es un comic muy didáctico.
Un abrazo
jorge
31 de Enero de 2012 a las 11:29
hola estoy armando un sensor de temperatura para un freezer me gustaria saber cual tengo que utilizar para Arduino uno y que programa se adapta mejor al uso que deseo darle, vivo en argentina y me gusto mucho tu pagina es interesante y amigable, jorge
Raúl Expósito
31 de Enero de 2012 a las 11:50
Muchas gracias por el comentario Jorge. Por desgracia no tengo respuesta ante las preguntas que me planteas.
Saludos
Dani
19 de Abril de 2012 a las 23:43
Hola a todos,
solo comentaros que en la 2 en el programa la nube, están hablando de arduino y han salido un para de proyectos muy chulos.
Ale ahora salen los de microsiervos
Saludos a todos.
Javz
1 de Mayo de 2012 a las 22:24
hey ayuda!! estoy intentando hacer este proyecto, he comprado arduino uno… y he utilizado como sensor un lm35… y el programa que utilice.. corre perfecto… pero tengo un serio problema con como hacer la lectura desde pachube…. no se como utilizar python y pyserial… los tengo instalados…. pero no tengo idea de como ocuparlos…. seria genial un poco de ayuda…
Ramón
10 de Mayo de 2012 a las 2:40
Buenas noches y hola a todos, estoy empezando en python y he probado el ejemplo de la temperatura en pachube.
Subo el skecht a mi Arduino, todo ok. Abro el serial monitor de arduino y me va tirando las temperaturas segun las va leyendo.
El problema lo tengo con python, al ejecutar el codigo me dice:
Traceback (most recent call last):
File “C:\Users\ramon\Dropbox\Conferencia Jaen\temp_pachube.py”, line 9, in
ser = serial.Serial(’/dev/tty.usbmodem1a21′, 9600)
File “C:\Python26\ArcGIS10.0\lib\site-packages\serial\serialwin32.py”, line 30, in __init__
SerialBase.__init__(self, *args, **kwargs)
File “C:\Python26\ArcGIS10.0\lib\site-packages\serial\serialutil.py”, line 260, in __init__
self.open()
File “C:\Python26\ArcGIS10.0\lib\site-packages\serial\serialwin32.py”, line 56, in open
raise SerialException(”could not open port %s: %s” % (self.portstr, ctypes.WinError()))
SerialException: could not open port /dev/tty.usbmodem1a21: [Error 3] El sistema no puede encontrar la ruta especificada.
Alguna sugerencia?? Gracias de antemano y enhorabuena por la web.
Ramón
10 de Mayo de 2012 a las 2:46
Mi arduino esta en el COM9, lo he solucionado, poniendo
ser = serial.Serial(8, 9600)
ser = serial.Serial(’/dev/tty.usbmodem1a21′, 9600)
De todos modos mil gracias
Francisco
11 de Mayo de 2012 a las 20:41
Muy interesante.
Estoy pensando en hacer algo similar. Pero cuando entro en pachube sale la pagina de Cosm, diciendo que ahora pachube es Cosm… ¿influye en algo en el código?
Un abrazo
Raúl Expósito
13 de Mayo de 2012 a las 19:06
Muy buenas Francisco,
Hace un par de días me mandaron los de pachube un correo diciendo que pasaban a ser Cosm. Me imagino que el código seguirá funcionando durante algún tiempo, tienen clientes y éstos no pueden migrar sus aplicaciones de un día a otro.
Saludos,
Raúl
Francisco.
14 de Mayo de 2012 a las 21:35
Gracias por la info. En una semana me meto con esto. Pero creo que lo haré arduino+processing. Así me parece que va a ser más fácil. Un abrazo.