Creación de una red de sensores inalámbricos en tu hogar
Spanish (Español) translation by Andrea Jiménez (you can also view the original English article)
Este tutorial te enseñará cómo crear una red de módulos de sensores inalámbricos rentables. Muchos de los módulos inalámbricos listos para usar pueden ser demasiado costosos para su uso en múltiples unidades de sensores. Si bien los módulos Wi-Fi y Zigbee son populares y fáciles de usar, su costo puede hacer que su uso en una variedad de sensores no sea práctico. Sin embargo, existen módulos de RF de bajo costo sin todas las características costosas que funcionarán bien para estos propósitos. La plataforma Arduino puede utilizar módulos de radio de gama baja para comunicarse de forma fácil y fiable.
Una vez que el hardware esté ensamblado, aprovecharás la plataforma Raspberry Pi para publicar los datos en el servicio de Internet de las cosas de Xively, donde puedes rastrear los valores a lo largo del tiempo y activar las condiciones de umbral.
Reunir los componentes y las herramientas
Este proyecto incluirá tres partes, dos unidades transmisoras y una unidad receptora. Los transmisores se componen de una placa Arduino, un sensor y un transmisor de RF. La unidad receptora se compone de una placa Arduino, un receptor de RF, un convertidor de nivel lógico y una Raspberry Pi.
Hay una amplia gama de placas compatibles con Arduino que se pueden utilizar en este proyecto. El requisito mínimo para la placa para este proyecto es dos pines GPIO digitales y un pin analógico. Selecciona una placa compatible con Arduino que coincida con el costo y las necesidades de simplicidad para este proyecto.
En este tutorial usé un conjunto de placas Arduino Nano que encajan bien en una placa y son fáciles de programar. Sin embargo, las versiones de 5V de Arduino pro mini o Trinket también funcionarán bien y a un precio mucho más bajo. Sin embargo, estos requieren un poco más de experiencia para programar y usar. Elige sabiamente.
Receptor
- Raspberry Pi: modelo B con fuente de alimentación, estuche y tarjeta SD: asegúrate de que los pines GPIO estén accesibles con el estuche que elijas
- Adaptador Wi-Fi compatible con Pi
- Arduino
- Cables de puente de placa
- Cables de puente de hombre a hembra
- Convertidor de nivel lógico
- Receptor de RF de 434 MHz
- Media placa
Transmisores (dos unidades)
- 2 x Arduino
- 2 x Sensores de temperatura / humedad
- 2 x transmisor de RF de 434 MHz
- 2 x Media placa
- 2 x conector de barril de CC de 2,1 mm compatible con placa de pruebas
- 2 x adaptador de corriente de 9V con 2,1 mm x 5
- Cables de puente de placa
Herramientas
- PC/Mac con IDE de programación Arduino instalado
- Cable USB para programar placas Arduino
- Teclado y mouse USB. Ya sea combinado o con un concentrador para que ambos se puedan usar con un solo puerto USB.
- El paquete fuente asociado con este tutorial en tu estación de trabajo de programación
Ensamblar transmisores
Los transmisores en sí mismos son circuitos relativamente simples. Solo se usa un pin para recuperar la información del sensor de temperatura y humedad y un pin se usa para enviar esos datos al transmisor de RF. El diagrama de la placa se muestra a continuación.
La fuente de alimentación de 9V se conectará al conector de barril haciendo que los rieles inferiores sean de 9V. El regulador de potencia en el Arduino producirá 5V que es seguro de usar para la radio y los sensores, el riel de potencia superior del diagrama.
El sensor viene con una resistencia de 10k ohmios que conecta el pin de datos a la alimentación como una resistencia pull up mientras que otro cable lo conecta a GPIO D3.
Ten cuidado de seguir la siguiente configuración y asegúrate de verificar dos veces la hoja de datos del sensor y el módulo de RF para asegurarse de que los componentes estén colocados en la placa de pruebas correctamente y que los pines de alimentación, tierra y señal estén conectados a los pines correctos. El diagrama fritzing se incluye en el paquete fuente para obtener más detalles.



La antena es una parte importante de la placa porque el módulo RF no tiene una antena incorporada. Usé un cable de puente hembra a macho de 6 pulgadas conectado a la placa de pruebas y funcionó lo suficientemente bien como para permitir la recepción desde todas las partes de mi casa y un poco afuera. Como se indica en el diagrama, 6.5 pulgadas es óptimo para esta antena si necesitas un rango adicional.
Una nota sobre el uso de RF. Existen diferentes leyes y reglas sobre el uso de frecuencias en diferentes países. Asegúrate de cumplir con estas reglas antes de transmitir. Dicho esto, las señales de estos módulos son apenas lo suficientemente potentes como para pasar fuera de tu hogar. Sin embargo, en perfectas condiciones, estos módulos pueden transmitir hasta 500 pies.
Descargar bibliotecas para componentes
El transmisor utiliza dos bibliotecas que no están incluidas con el IDE de Arduino. Descarga las bibliotecas como se describe a continuación y descomprímelas en tu directorio de bocetos en un subdirectorio llamado Bibliotecas.
- Descarga el paquete fuente de VirtualWire para este tutorial y descomprime la carpeta de boceto wirelesstransmitter en tu carpeta de boceto de Arduino
- En la carpeta wirelesstransmitter, crea una carpeta llamada Bibliotecas
- Descarga la última versión del código de VirtualWire, 1.23 a partir de este escrito, desde la página del proyecto
- Extrae la carpeta VirtualWire en la carpeta wirelesstransmitter/Libraries/ para tener otra subcarpeta llamada VirtualWire
- Descarga la biblioteca de sensores DHT de la página de su proyecto en github
- Extrae también la carpeta DHT en la carpeta Bibliotecas. Ahora deberías tener las dos carpetas de biblioteca requeridas DHT y VirtualWire en tu carpeta wirelesstransmitter/Bibliotecas.
Programar la placa Arduino
Este tutorial asume que tienes algo de experiencia con Arduino y cómo programarlos usando el IDE de Arduino. Si no es así, hay muy buenas instrucciones en el sitio oficial de Arduino.
- Abre el boceto wirelesstransmitter desde el archivo de origen en el IDE de Arduino y guarda una copia localmente
- Asegúrate de que el Arduino NO esté conectado a la alimentación a través del conector de barril
- Conecta la placa a tu estación de trabajo de programación con un cable USB apropiado
- Configura el tipo de placa en la placa Arduino seleccionada en el menú Herramientas > Placa
- Configura el puerto serie en el puerto detectado cuando conectaste la placa Arduino en el menú Herramientas > Puerto
- Asegúrate de que la definición de MYID esté configurada en 1 y que TRANSPIN y DHTPIN estén correctamente configurados en los pines conectados al módulo transmisor de RF y al sensor DHT, respectivamente. Si construíste tu tablero según el diagrama anterior, todo esto ya debería estar configurado. Mira el siguiente ejemplo de código.
- Asegúrate de que la UNIDAD esté configurada correctamente para tu preferencia Fahrenheit o Celsius.
1 |
#define MYID 1 //the ID number of this board. Change this for each board you flash.
|
2 |
//The ID will be transmitted with the data so you can tell which device is transmitting
|
3 |
#define TRANSPIN 3 //what pin to transmit on
|
4 |
#define DHTPIN 4 // what pin the DHT is connected to
|
5 |
#define UNIT 0 // 0 for Fahrenheit and 1 for Celsius
|
La definición de MYID es una identificación numérica que el transmisor utiliza para identificarse de forma única. Debido a que tendrás varios transmisores en diferentes ubicaciones, es importante tener una identificación única para cada uno. Este número se utilizará de nuevo cuando configures el script del receptor.
- Verifica el código presionando Control-R para asegurarte de que las bibliotecas estén incluidas y compiladas correctamente.
- Presiona el código en el tablero haciendo clic en el botón Cargar en la barra de herramientas.
- Abre las ventanas del Serial Monitor pulsando Control-Mayús-M
La ventana Serial Monitor reinicia el Arduino, por lo que deberías ver una línea de código en la pantalla que se parece a esto:
1 |
Humidity: 44.00 % Temperature: 60.80 *F |
2 |
Sending Message: ID:1:TS:23143:TF:60.79:RH:44.00 |
El mensaje se compone de pares Nombre:Valor que manejará el receptor. El transmisor leerá y transmitirá su señal en un intervalo aleatorio largo. Los sensores no cambian mucho o con frecuencia, por lo que transmitir más de una vez por minuto no agrega valor. El tiempo de espera aleatorio es para permitir que coexistan varios sensores.
Incluso si se duplica y se pierde la señal de ambos transmisores, el intervalo aleatorio asegurará que sus próximas transmisiones no se superpongan. El valor semilla aleatorio para este intervalo se configura desde un analogRead en un puerto analógico no utilizado que devolverá valores aleatorios para garantizar que no haya dos transmisores en el mismo patrón.
El código de ejemplo que genera la salida anterior está configurado para usar Fahrenheit. Puedes ver el identificador TF:60.79 en la cadena del mensaje que indica que mi laboratorio es de hecho solo un pelo por debajo de los 61 grados. Sin embargo, la humedad relativa RH:44.00 es un cómodo 44%. Uno podría inferir del ambiente fresco y húmedo que mi laboratorio está en mi sótano. Uno podría tener razón.
Los transmisores están configurados para esperar de 2 a 5 minutos entre transmisiones de forma predeterminada. Si quieres acelerar esto con fines de depuración, modifica el valor de delay() al final del boceto para que sea más como 5000 (ms). Es muy recomendable que cambies esto de nuevo y vuelvas a cargar el código a tus transmisores cuando estés listo para su uso a tiempo completo.
- Construye la segunda placa transmisora
- Modifica el boceto del transmisor para que la definición de MYID se configure en 2
- Carga el código en la segunda placa
- Abre las ventanas Serial Monitor presionando Control-Shift-M y verifica que la salida se vea como la primera placa transmisora con la excepción de que el mensaje transmitido comienza con ID:2
Construye la placa receptora
La placa receptora será responsable de recibir el mensaje de transmisión en su componente receptor de RF y enviar ese mensaje a través de cables seriales a la Raspberry Pi. La placa Arduino se utiliza para recibir la señal por un par de razones muy importantes. El código VirtualWire usa la naturaleza en tiempo real del Arduino para gestionar la modulación y demodulación de la señal.
Esto significa que la unidad receptora debe funcionar con la misma frecuencia. Además, hay poco espacio para la fluctuación en el procesador receptor, al que es propensa la Raspberry Pi, debido a su sistema operativo preventivo, no en tiempo real. Al comparar los costos de un Arduino Pro Mini más el módulo receptor de RF con el de un módulo Zigbee que podía hablar directamente con la Raspberry Pi, se reveló que usar un Arduino externo seguía siendo bastante económico.
Construye la placa receptora según el diagrama de Fritzing a continuación.



En este punto, NO conectes los cables de tierra y de 5 V del Pi a la placa de pruebas. Mantén los cables de puente a mano, pero no quieras alimentar el Arduino desde el puerto USB y la Raspberry Pi.
Ten en cuenta que el convertidor de nivel lógico en la lista de materiales anterior no es exactamente el mismo que el de la biblioteca Fritzing, pero las salidas de pines están bien etiquetadas, solo que en diferentes lugares. Por favor, asegúrate de que los cables correctos estén conectados a los pines correctos en el convertidor de nivel lógico real.
Este componente es necesario para convertir la señal serial Arduino de 5V en una señal serial Raspberry Pi de 3.3V y no dañar la Pi. Mira la siguiente imagen para obtener ayuda adicional.

Tena en cuenta que los cables RX y TX atraviesan el convertidor de nivel lógico para que el TX del Arduino entre en el RX del Pi. Los siguientes pasos implican configurar el Pi, volverás a programar el Arduino más tarde.
Configura la Raspberry Pi
Hay varias guías para comprar e instalar un sistema operativo en tu Raspberry Pi. Instala el último sistema operativo Raspbian. Los siguientes pasos describen la conexión de los periféricos al Pi y la configuración.
Consejo: Si necesitas saber más sobre cómo flashear una tarjeta SD, para tu Raspberry Pi, solo consulta nuestros tutoriales: Cómo flashear una tarjeta SD para Raspberry Pi y Cómo instalar NOOBS en una Raspberry Pi con una Mac.
- Inserta el adaptador WI-FI USB en el puerto USB superior del Pi
- Conecta el concentrador USB al puerto USB inferior del Pi
- Conecta el mouse y el teclado al concentrador USB
- Conecta el monitor HDMI
- Inserta la tarjeta SD
- Conecta la fuente de alimentación
- Realiza la configuración de la instalación por primera vez dejando la opción predeterminada para arrancar en un escritorio gráfico
- Después de que el Pi se reinicie en un escritorio, sigue estas instrucciones sobre cómo usar la herramienta GUI para configurar tu red wifi.
- Abre una ventana de terminal haciendo doble clic en el icono de LXTerminal.
- Ejecuta el comando
sudo raspi-config
- Selecciona Habilitar arranque en escritorio / Scratch > Consola de texto de la consola, que requiere la opción de inicio de sesión
- Selecciona las Opciones avanzadas > SSH para habilitar el acceso a la línea de comandos de red
- Selecciona Finalizar y permite que Pi se reinicie en la consola de texto
- Anota la dirección IP que Pi informa cuando arranca. Esto se utilizará para SSH al Pi en pasos posteriores. Los siguientes pasos para configurar el Pi son más fáciles de realizar desde una sesión SSH al Pi.
Configura Raspberry Pi
La Raspberry Pi utiliza su puerto serie de forma predeterminada como una consola serie. El dispositivo se llama ttyAMA0. Cuando arranca, descarga los mensajes de arranque en este dispositivo y configura una sesión de inicio de sesión en él. Para usarlo para recibir datos del Arduino, deberás deshabilitar la consola serial y la sesión.
- Edita el archivo inittab que controla la sesión de inicio de sesión de texto con el siguiente comando. Siempre se recomienda hacer una copia de seguridad del archivo original antes de editarlo en caso de que algo salga mal.
1 |
sudo pico /etc/inittab
|
- Busca las líneas en la parte inferior del archivo que hacen referencia al dispositivo ttyAMA0 y agrega un # al inicio de la línea que incluye este nombre de dispositivo. Debería verse como las siguientes líneas cuando hayas terminado
1 |
#Spawn a getty on Raspberry Pi serial line |
2 |
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100 |
- Edita el /boot/cmdline.txt con el siguiente comando. No olvides hacer una copia de seguridad por si acaso.
1 |
sudo pico /boot/cmdline.txt
|
- Quita los argumentos que hacen referencia a ttyAMA0. La parte que quieres eliminar se ve algo así: console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
- Guarda el archivo y reinicia el Pi
Instala el Script de Python y requisitos previos
El script de Python que completará el receptor realizará varias funciones.
- Lee desde el puerto serie
- Analiza la entrada y asegúrate de que esté normal
- Interpreta los datos en serie
- Publica los datos en Xively en la fuente adecuada
Para realizar estas funciones, deberás instalar los módulos de requisitos previos para instalar las bibliotecas serie y las comunicaciones Xively.
- Inicia sesión en el Pi y ejecuta los siguientes comandos para instalarlos.
1 |
sudo apt-get install python-serial python-setuptools |
2 |
sudo easy_install pip
|
3 |
sudo pip install --pre xively-python |
4 |
mkdir ~/scripts
|
- Copia el script wirelessnetwork.py del paquete fuente de este tutorial en el directorio de scripts que acabas de crear. Puedes hacerlo copiando y pegando el contenido o enviando el script al Pi.
- Asegúrate de que el script sea ejecutable con el comando
1 |
chmod u+x wirelessnetwork.py
|
Los siguientes pasos te llevarán a configurar cuentas de Internet de las cosas que te permiten registrar y reaccionar a los datos que está registrando tu dispositivo.
Configura tu cuenta Xively para el Pi
Xively es un servicio que recopila datos de las cosas. Puedes configurar y registrar tu cosa o Raspberry Pi con Xively y los datos se pueden empujar desde tu Pi a la nube para el seguimiento y la activación.
- Ve a xively.com y regístrate para obtener una cuenta gratuita
- Haz clic en el botón Empezar
- Desplázate hasta la parte inferior de la página y elige la opción Registrarse para obtener una cuenta de desarrollador gratuita
- Completa la información de cuenta correspondiente y valida tu cuenta
- Autentícate como tu nueva cuenta según sea necesario
- Selecciona Herramientas web > Desarrollar para ir a la nueva página de desarrollador
- Haz clic en el cuadro grande + Agregar dispositivo para agregar tu Raspberry Pi
- Completa el Nombre del dispositivo: Red inalámbrica, Descripción del dispositivo: Monitor ambiental, elige Dispositivo privado a menos que quieras compartir tu nivel de sal con el mundo.
- Haz clic en Agregar dispositivo. Después de crear el dispositivo, se te presentará la pantalla del dispositivo con las claves y la información sobre el dispositivo.
- Registra el ID de fuente y la clave API de la página del dispositivo. El ID de fuente está en letra pequeña cerca de la parte superior de la página y la clave API está en letra grande en el lado derecho de la página. Los necesitarás para finalizar el script wirelessnetwork.py que descargaste en la sección anterior.
Configura el Script de Python
Para publicar datos en Xively, el script wirelessnetwork.py debe tener el ID fuente y las claves API que registraste anteriormente. Edita el script usando pico o tu herramienta de edición favorita (no vi contra emacs wars aquí, por favor). Mira el fragmento de muestra de la parte superior del script wirelessnetwork.py para ver un ejemplo de dónde ingresarías las variables. Ten en cuenta también que puedes desactivar la salida del script cambiando la variable DEBUG a 0.
1 |
#some defines for Xively
|
2 |
FEED_ID = "FEED ID HERE" #enter your feed ID number here |
3 |
API_KEY = "API KEY HERE" #set your API key here |
4 |
# initialize api client
|
5 |
api = xively.XivelyAPIClient(API_KEY) |
6 |
|
7 |
#Create mapping from transmitter ID number to names. This could be a DB some day
|
8 |
DEV={'1':'Bedroom', '2':'Basement'} |
9 |
|
10 |
DEBUG = True |
Mientras editas el script, asegúrate de editar la variable DEV. Esta variable es una asignación de nombre para los ID que enviarán los módulos de sensor. En este ejemplo, cuando el módulo sensor con el ID 1 envía un mensaje, el script se publicará en un canal Xively con el nombre descriptivo Dormitorio en lugar de ID1. De la misma manera, el módulo sensor con el ID 2 se notificará en el canal Sótano.
Programa el receptor Arduino
La Raspberry Pi ya está lista para recibir datos usando el script wirelessnetwork.py. El Arduino necesita ser programado con el boceto wirelessreceiver.
- Abre el boceto wirelessreceiver desde el paquete fuente y guarda una copia localmente
- Copia la biblioteca VirtualWire del directorio wirelesstransmitter/Biblioteca al directorio Biblioteca bajo el nuevo directorio wirelessreceiver
- Conecta el receptor Arduino receptor a tu estación de trabajo de programación y asegúrate de que el puerto y el tipo de placa estén configurados correctamente.
- Asegúrate de que la definición de RXPIN esté configurada en el número de pin que está conectado al módulo receptor de RF. Si se construye según el diagrama, el boceto debería estar bien sin cambios.
- Verifica y carga el boceto en el Arduino
- Abre las ventanas de Serial Monitor presionando Control-Shift-M. Si los transmisores no están funcionando, no verás la salida.
- Enchufa uno de los módulos transmisores a la corriente usando el adaptador de pared de 9V y el conector de barril en la placa de pruebas. Ahora deberías ver los mensajes que se están recibiendo en el Arduino. Se parecerá a los siguientes datos.
1 |
ID:1:TS:23143:TF:60.79:RH:44.00 |
2 |
ID:1:TS:24532:TF:60.79:RH:44.00 |
3 |
ID:1:TS:29324:TF:60.79:RH:44.00 |
- Desconecta el cable USB del Arduino
- Conecta los puentes de tierra y potencia de la Raspberry Pi
Prueba el Script del receptor
Ya que tienes el Arduino recibiendo datos de un módulo de sensor, puedes probar el script en el Pi para asegurarte de que estás leyendo correctamente los datos y publícalos en Xively. Abre una sesión SSH o de terminal en Pi para seguir los siguientes pasos.
- Activa el segundo transmisor inalámbrico enchufándolo con el segundo adaptador de 9V
- Ejecuta el script wirelessnetwork.py desde el directorio /home/pi/scripts con los siguientes comandos
1 |
cd /home/pi/scripts/
|
2 |
./wirelessnetwork.py |
- Revisa la salida en la consola y en el sitio web de Xively.
1 |
|
2 |
Received input: ID:1:TS:154075:TF:73.39:RH:39.00 |
3 |
Processing data for: Bedroom |
4 |
Posting temp fahrenheit for Bedroom |
5 |
Creating datastream |
6 |
Updating Xively feed with value: 73.39 |
7 |
Posting relative humidity for Bedroom |
8 |
Found existing datastream |
9 |
Updating Xively feed with value: 39.00 |
10 |
|
11 |
Received input: ID:2:TS:522:TF:60.79:RH:44.00 |
12 |
Processing data for: Basement |
13 |
Posting temp fahrenheit for Basement |
14 |
Creating datastream |
15 |
Updating Xively feed with value: 60.79 |
16 |
Posting relative humidity for Basement |
17 |
Found existing datastream |
18 |
Updating Xively feed with value: 44.00 |
El script creará fuentes de humedad y temperatura la primera vez que se ejecute. El ejemplo anterior muestra que el script recibe los mensajes, los analiza y los envía a Xively correctamente. Usa Control-C para salir del script antes de continuar con el siguiente paso.
Cambia a las ventanas del navegador donde creaste tu cuenta y dispositivo Xively. Los nuevos flujos de datos y algo de información sobre ellos deberían estar disponibles y parecerse a la siguiente imagen.



Configura el Script para que se inicie al arrancar
Debido a que la Raspberry Pi se ejecutará sin cabeza, el script debe configurarse para que se inicie automáticamente cuando la unidad esté encendida.
- Agrega la siguiente línea al archivo /etc/rc.local. Usa tu editor favorito, pero asegúrate de sudo el comando de edición ya que /etc/rc.local es un archivo propiedad de la raíz. El script en sí puede ejecutarse como usuario pi en lugar de como root.
1 |
sudo -u pi /home/pi/scripts/wirelessnetwork.py & |
- Reinicia el Pi
- Inicia sesión en Pi después de que se haya reiniciado y comprueba que el script se está ejecutando con el siguiente comando.
1 |
ps ax |grep wirelessnetwork |
La salida debería parecerse al siguiente extracto.
1 |
22000 pts/1 S+ 0:02 /usr/bin/python /home/pi/scripts/wirelessnetwork.py |
Resumen
¡Felicidades! Has trabajado en un tutorial bastante largo y construiste una red inalámbrica de sensores muy flexible y expandible. Ejerciste una variedad de habilidades, como construir circuitos de placa basados en Arduino, conectar un Arduino a una Raspberry Pi, enviar y recibir datos en serie de forma segura entre Arduino y Pi, y enviarle datos de sensores al servicio de Internet de las cosas de Xively.
Hay mucho potencial de expansión o experimentación adicional con este proyecto. Puedes optar por construir módulos de sensores adicionales o agregarle sensores a los módulos existentes. El formato del mensaje de radio es un par clave:valor simple y el script de Python tiene comentarios sobre cómo agregar diferentes tipos de datos. Trata de construir una casa permanente o vivienda para los transmisores. Hay un montón de potencial de diversión de dónde tomar en este proyecto.