Archivo de la etiqueta: Práctica

Ejercicios Finales

Veamos unos ejercicios completos con todo lo aprendido durante el curso.

Este ejercicio consiste en el montaje de 15 nodos remotos basados en Wemos D1 mini que gestionaremos con Node-RED y 15 Raspberry Pi con un led y un pulsador cada una y que además ejecutarán Node-RED localmente.

Montaje

Esquema de conexión nodo Remoto Wemos D1 Mini basado en:

Esquema de conexión RAspberry Pi:

  • Pin LED: 12 (GPIO 18) 
  • Pin Pulsador: 16 (GPIO 23) (Usando la resistencia interna de Pulldown)

Preparación

La programación de los nodos remotos basados en ESP8266 se hará mediante Node-RED ejecutado en cada Raspberry Pi, para ello se instalará un firmware que puede obtenerse de: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/firmware-Ejercicio_Final/firmware-Ejercicio_Final.ino.

NOTA: este firmware es para el nodo 14, pero en caso de que el nodo sea otro nº de nodo sustituir estas líneas, siendo X = 1, 2, 3, 4 ,5, 6, ….:

  • const char* publish_10sec = “nodoX/dato10s”;
  • const char* publish_60sec = “nodoX/dato60s”;
  • const char* publish_reset = “nodoX/reset”;
  • const char* subs_led = “nodoX/led”;
  • const char* subs_rele = “nodoX/rele”;
  • if (client.connect(“wemosd1mini187222X”,”usuario_mosquitto”,”password_mosquitto”))

Este firmware publica en un topic cada 10 segundos y en otro cada 60 segundos. Los topics son:

  • nodoX/dato10s
  • nodoX/dato60s

En caso de que el nodo se resete publica en el topic: nodoX/reset

Los nodos estás suscrito a dos topic:

  • nodoX/led – enciende y apaga el led integrado de ESP8266
  • nodoX/rele – enciende y apaga el relé

Para el control del LED y botón de Raspberry Pi, se hará mediante la programación en cada uno de los Node-RED de cada Raspberry Pi.

  • RPiX/led – topic al que se suscribe para indicar si se enciende o apaga
  • RPiX/pulsador – topic al que publica el estado: pulsado (1) o liberado (0)

Testeo del Sistema

Una vez configurado todo el sistema comprobar que cada nodo y Raspberry Pi está publicando los datos y funciona el control al modificar los valores de los topics a los que están suscritos.

Para ello usar un cliente MQTT como MQTT.fx:

  • suscrito a los topics:
    • nodoX/dato10s
    • nodoX/dato60s
    • nodoX/reset
    • RPiX/pulsador
  • publicando a los topics:
    • nodoX/led
    • nodoX/rele
    • RPiX/led

Una vez comprobado que leo los valores que publican los nodos y que puedo modificar el estado de los leds y relé publicando en los topics, pasamos a programar el sistema completo usando Node-RED.

Todo el código de los ejercicios: https://github.com/jecrespo/Curso-Node-RED/tree/master/04-Ejercicio%20Final

Ejercicio 1 – Dashboard

Configura Node-RED para que se vea un dashboard “Home” con tres grupos:

  • Suscripciones: las 3 suscripciones y botón que resete los valores
  • Pulsadores: dos botones para encender led y relé de nodo remoto
  • RPi: un pulsador que maneje el LED de la RPi y un gauge con el estado del pulsador.

Además al pulsar el pulsador encender el led detectando flaco, una pulsación enciende y otra pulsación apaga.

La configuración en Node-RED es:

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_1/Ejercicio_1-1.json

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_1/Ejercicio_1-2.json

Ejercicio 2 – Interacción por Grupos

Crear un nuevo grupo del dashboard Home llamado “Control Relés” con 3 botones que encienda:

  • Botón 1: controla relés 1, 2, 3, 4, 5
  • Botón 2: controla relés 6, 7, 8, 9, 10
  • Botón 3: controla relés 11, 12, 13, 14, 15

Dashboard

Nodos

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_2/Ejercicio_2.json

Ejercicio 3 – Seguridad

Poner un pin para encender los Reles, de forma que si no hay pin no se puede encender desde el dashboard. Simular una cerradura de forma que al poner el pin correcto se abre y luego a los 5 segundos se cierra.

Mostar en el dashboard el estado de la cerradura.

Crear un tab nuevo en el dashboard llamado pin de seguridad

Basarse en el flujo: https://flows.nodered.org/flow/7bcb0b049df4fa3c962294137ebaec19

Hacer el flujo como un subflow.

Dashboard

Flujo

Subflow

Código:

Ejercicio 4 – Email y SMS

Hacer un formulario en el dashboard para mandar un correo electrónico y otro para mandar un SMS usando el servicio de Twilio: https://www.twilio.com/

Dashboard

Flujo

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_4/Ejercicio_4.json

Luego usar esta configuración para enviar un correo y un SMS cuando se pulse el botón de la Raspberry Pi y el relé del nodo remoto 14 esté encendido, viéndolo en un dashboard.

Ejercicio 5 – Imágenes

Coger mediante Node-RED la imagen publicada en http://www.aprendiendoarduino.com/servicios/imagen.jpg y que se actualiza cada 30 segundos en el servidor.

Mostrar la imagen en el dashboard y su información.

Publicar en el topic raspberrypi/image la imagen por MQTT para poder reutilizarla.

Mandar la imagen por email al pulsar un botón.

Dashboard

Flujo

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_5/Ejercicio_5.json

Probar con otros servicios online a coger vídeo o imagen y tratarlo en Node-RED

Ejercicio 6 – Twitter

Hacer un flujo que tuitee algo. Para ello es necesario darse de alta en: https://developer.twitter.com/en/apps

Hacer un flujo que monitorice un hashtag (p.e. #Rioja), lo publique en cloudMQTT y lo guarde en una BBDD MySQL.

Flujo

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_6/Ejercicio_6.json

Ejercicio 7 – Open Weather Map

Usando el node de OpenWeatherMap, hacer un dashboard con la temperatura, humedad y presión donde se actualice el dato en un gauge y se haga una gráfica que muestre los últimos 7 días.

Mandar el dato de la temperatura a los nodos remotos, para ello publicar en el topic “nodoX/temperatura” el dato de temperatura y comprobar que llegan, para ello modificar el firmware para que los nodos remotos estén suscritos y lo muestren por el puerto serie.

Hacer un botón para que mande la predicción de los próximos 5 días al correo electrónico.

Dashboard

Flujo

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_7/Ejercicio_7.json

Ejercicio 8 – Telegram

Hacer un bot de Telegram con Node-RED que mande mensajes a grupos o canales y que responda a determinados comandos.

Para crear un bot de telegram: https://core.telegram.org/bots

Para añadir comandos al bot:

  • /setcommands
  • @aprendiendoarduino_bot

Pasar los comandos:

help – Ayuda
start – Inicio
enciende – Enciende Led
apaga – Apaga led
lee – Muestra datos broker

Y ya tengo los comandos configurados:

  • /help
  • /start
  • /enciende
  • /apaga
  • /lee

Para configurar el bot en Telegram solo hace falta poner el nombre del bot y el token.

Crear un canal o un grupo y hacer un flujo sencillo que al pulsar mande un un mensaje por Telegram a tu usuario y a al grupo o canal.

Ahora queda que desde Node-RED lea los comandos y responda. Al mandar el comando /enciende el LED de la Raspberry Pi al mandar el comando /apaga el LED de la Raspberry Pi. El comando /lee me devuelve el estado del LED.

Una forma de hacer esto es publicando el el topic /raspberrypi/led el valor ON u OFF y ya tengo otro flujo hecho en el ejercicio 1.

Para saber el estado, se puede guardar en una variable de flujo que se actualiza con el topic /raspberrypi/led de forma que no solo cuando modifico desde el bot sino desde otros lugares.

Flujo

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_8/Ejercicio_8.json

Ejemplos Node-RED y MQTT

Node-RED y MQTT

Sólo tienes que arrastrar el nodo mqtt que está en la categoría input al flujo.

sistema alarma node-red

Ahora hay que configurarlo. Aquí es donde vemos la potencia de Node-RED. Cuando utilizamos una tecnología, nos centramos en lo superficial. En el caso de MQTT lo único que tenemos que hacer es configurar el broker y el topic.

Al tratarse de un nodo de entrada, lo que hace es recibir los mensajes publicados en un topic es decir, se suscribe al topic. Haz doble click sobre el nodo para que abra el panel de configuración.

En el panel de configuración MQTT vamos a configurar primero el broker MQTT. Haz click en el lápiz que aparece en Server.

sistema alarma node-red

Esto abre un nuevo panel de configuración. Pon un nombre al broker MQTT por ejemplo RASPBERRY PI MOSQUITTO. En Server tienes que poner la IP donde está instalado el broker MQTT y el puerto que utiliza, normalmente es el 1883.

Esta sería la configuración mínima. No te olvides de hacer click en el botón Add.

Después de esta acción volverás al panel de configuración del nodo mqtt y automáticamente, habrá seleccionado el broker MQTT que acabamos de crear.

Por último, vamos a rellenar el campo de Topic. Debe ser el mismo que hemos puesto en Arduino o el ESP8266, /casa/puerta/alarma. Una vez lo tengas, haz click en Done.

sistema alarma node-red

Ahora sólo nos queda probarlo. Para ello vamos a utilizar el mismo nodo debug de la categoría output que hemos utilizado antes.

Arrástralo al flujo, conecta los dos nodos y haz click en el botón Deploy.

sistema alarma node-red

Para probar el sistema lo podemos hacer de dos formas. Desde una terminal de Raspberry Pi podemos publicar un mensaje en el topic o directamente conectando la placa y simulando que abren la puerta.

El resultado sería el siguiente.

sistema alarma node-red

Ejemplo

Vamos a usar los Wemos D1 mini, para integrarlos como nodos remotos y programarlos desde Node-RED.

Esquema:

El firmware para los nodos remotos:

Cada firmware ya está configurado para solo configurar el topic donde va a publicar y el topic al que se suscribe:

  • RELE: Paso ON y OFF
  • OLED: Paso el string que va a mostrar por pantalla
  • LEDS: 7 topics donde paso el color en formato RGB y el brillo

Probar cada firmware y hacer un programa sencillo para interactuar con ellos.

Completos tutoriales:

Programación Básica Node-RED

Node-RED es un motor de flujos con enfoque IoT, que permite definir gráficamente flujos de servicios, a través de protocolos estándares como REST, MQTT, Websocket, AMQP… ademas de ofrecer integración con apis de terceros, tales como Twitter, Facebook, Yahoo!…

Más información: https://about.sofia2.com/2016/11/16/que-es-nodered/

Historia de Node-RED: https://nodered.org/about/#history

Conceptos básicos de nodered: https://nodered.org/docs/user-guide/concepts

  • Nodo: Un nodo es el bloque de construcción básico de un flujo. Los nodos se activan al recibir un mensaje del nodo anterior en un flujo o al esperar algún evento externo, como una solicitud HTTP entrante, un temporizador o un cambio de hardware GPIO. Procesan ese mensaje o evento y luego pueden enviar un mensaje a los siguientes nodos del flujo.
  • Nodo de Configuración: Un nodo de configuración (config) es un tipo especial de nodo que contiene una configuración reutilizable que los nodos regulares pueden compartir en un flujo.
  • Flow (Flujo) Un flujo se representa como una pestaña dentro del espacio de trabajo del editor y es la forma principal de organizar los nodos. El término “flujo” también se utiliza para describir informalmente un conjunto único de nodos conectados. Por lo tanto, un flujo (pestaña) puede contener múltiples flujos (conjuntos de nodos conectados).
  • Contexto: El contexto es una forma de almacenar información que se puede compartir entre nodos sin usar los mensajes que pasan a través de un flujo. Hay tres tipos de contexto:
    • Nodo: solo visible para el nodo que establece el valor
    • Flujo: visible para todos los nodos en el mismo flujo (o pestaña en el editor)
    • Global: visible para todos los nodos
  • Mensaje: Los mensajes son los que pasan entre los nodos en un flujo. Son objetos simples de JavaScript que pueden tener cualquier conjunto de propiedades. A menudo se les conoce como msg dentro del editor. Por convención, tienen una propiedad llamada “payload” que contiene la información más útil.
  • Subflow: Un subflujo es una colección de nodos que se contraen en un solo nodo en el espacio de trabajo. Se pueden usar para reducir la complejidad visual de un flujo o para agrupar un grupo de nodos como un componente reutilizable que se usa en varios lugares.
  • Wire: Los cables conectan los nodos y representan cómo pasan los mensajes a través del flujo.
  • Palette (Paleta): La paleta está a la izquierda del editor y enumera los nodos que están disponibles para usar en los flujos. Se pueden instalar nodos adicionales en la paleta utilizando la línea de comandos o el Administrador de paletas.
  • Workspace: El área de trabajo es el área principal donde se desarrollan los flujos arrastrando nodos de la paleta y conectándolos. El espacio de trabajo tiene una fila de pestañas en la parte superior; uno para cada flujo y cualquier subflujo que se haya abierto.
  • Barra Lateral: La barra lateral contiene paneles que proporcionan una serie de herramientas útiles dentro del editor. Estos incluyen paneles para ver más información y ayuda sobre un nodo, para ver el mensaje de depuración y para ver los nodos de configuración del flujo.

Con respecto a Node-RED, se pueden hacer muchas cosas. Desde encender un LED en remoto, crear una API Rest en 5 minutos o conectar con una base de datos InfluxDB para graficar con Grafana. Aunque es visual, se requieren unos conocimientos técnicos en programación y tecnología medios y/o avanzados.

También permite programar en JavaScript funciones que pueden hacer de todo. Node-RED da mucho juego para muchas cosas.

El editor de flujos de Node-RED consiste en una sencilla interfaz en HTML, accesible desde cualquier navegador, en la que arrastrando y conectando nodos entre sí, es posible definir un flujo que ofrezca un servicio.

Como vemos, el editor se estructura como un entorno gráfico sencillo con:

  • Paleta de Nodos: Muestra todos los nodos que tenemos disponibles en nuestra instalación. Como veremos más adelante, existe un repositorio de nodos desarrollados por otros usuarios e incluso podemos crear e instalar nuestros propios nodos.
  • Editor: Nos permite arrastrar nodos desde la paleta y conectarlos. De este modo iremos creado el flujo de operación. El lienzo de node-red no tiene límites y se puede hacer zoom.

Asimismo, seleccionando cada nodo, se muestra a la izquierda su formulario de configuración, donde es posible establecer las propiedades concretas de dicho nodo:

Usar el editor: https://nodered.org/docs/user-guide/editor/

En node-Red los nodos se comunican entre sí mediante msg, que es un objeto con propiedades y que podemos añadir propiedades. La propiedad principal es payload, pero puedo añadir las que quiera. Puedo añadir otras propiedades como temperatura.

Los nodos se unen en flujos que se ejecutan en paralelo.

En los nodos con entrada y salida, lo que entra sale y se mantiene la información salvo la que modifiques en el nodo. 

Hay tres propiedades principales y que siempre existen:

  • número de mensaje
  • topic
  • payload

Ejemplo:

  • {“_msgid”:”f5daa4f0.f34888″,”topic”:”timestamp”,”payload”:”2020-03-08T11:53:50.646Z”}

El valor de una propiedad puede ser cualquier tipo de JavaScript válido como:

  • Boolean – true, false
  • Number – eg 0, 123.4
  • String – “hello”
  • Array – [1,2,3,4]
  • Object – { “a”: 1, “b”: 2}
  • Null

Más información sobre los tipos en javascript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures

Disponemos de un debug que nos muestra el objeto y la podemos sacar por pantalla.

Los nodos son la unidad mínima que podemos encontrar en Node-RED. En la parte izquierda de la interfaz podemos ver la lista de nodos que vienen instalados por defecto y organizados en categorías según su funcionalidad.

Hay nodos de entrada, salida, funciones, social, para almacenar datos, etc… Esto muestra la capacidad de Node-RED de comunicarse con otros servicios.

Se pueden clasificar en tres tipos de nodos:

  • Nodos que sólo admiten entradas: sólo admiten datos de entrada para ser enviados a algún sitio como pueda ser una base de datos o un panel de control.
  • Nodos que sólo admiten salidas: son los nodos que sólo ofrecen datos tras recibirlos a través de diferentes métodos como por ejemplo un mensaje MQTT.
  • Nodos que admiten entradas y salidas: estos nodos nos permiten la entrada de datos y luego ofrecen una o varias salidas. Por ejemplo, podemos leer una temperatura, transformarla en grados Celsius y enviarla a otro nodo.

Los nodos los arrastramos al flujo o flow, en inglés. Aquí es donde tendremos la lógica para cada dato a base de ir arrastrando nodos.

Algunos de los nodos disponibles en Node-RED, los nodes de core son: https://nodered.org/docs/user-guide/nodes 

  • Inject: para disparar un flujo manualmente. Inyecta una payload a un topic.
  • Debug: sirve para mostrar mensajes en la zona de debug de Node-RED. Puede habilitarse o deshabilitarse.
  • Function: permite programar un nodo mediante JavaScript, pero es mejor buscar nodos hechos que hagan la función deseada, por ejemplo un temporizador.
  • Change: se usa para modificar las propiedades de un mensaje sin usar funciones
  • Switch: permite que los mensajes sean enrutados a diferentes ramas de un flujo mediante un conjunto de reglas contra el mensaje.
  • Template: se usa para generar texto usando las propiedades de un mensaje.

Trabajar con mensajes en Node-RED: https://nodered.org/docs/user-guide/messages 

Escribir funciones en Node-RED: https://nodered.org/docs/writing-functions 

Existen además muchos tipos de nodos que podemos ver en https://flows.nodered.org/ que son contribuciones de terceros.

Los nodos se organizan en flujos, para organizar los nodos como queramos. Es recomendable agrupar en flujos tareas que tengan relación entre ellos, pero solo a modo organizativo.

En node-red se puede trabajar con variables:

  • Contexto – solo aplica a un nodo
  • Flujo – aplica solo al flujo
  • globales – aplica a todo.

Cookbook de nodered: https://cookbook.nodered.org/ 

Node-RED programming guide: http://noderedguide.com/ 

Administración de node red mediante comando: https://nodered.org/docs/node-red-admin

Running node-red: https://nodered.org/docs/getting-started/running 

Más información: https://programarfacil.com/blog/raspberry-pi/introduccion-node-red-raspberry-pi/ 

Por ejemplo, podemos suscribirnos a un topic de MQTT, recibir un dato de temperatura y mostrarlo en la pantalla de debug:

primer flujo node-red

Pero no sólo podemos hacer esto, también podemos conectar con servicios de terceros como IFTTT, ThingSpeak, Google Home, ThingerIO, etc…

Primeros Flujos

Ejercicios

Hacer un programa que publicando en el topic /raspberrypi/led el texto “on” se encienda y publicando off se apague. 

Hacer un flujo que cada vez que se pulse el botón publique en el topic /raspberrypi/boton el valor recibido

Hacer otro flujo para que al pulsar el botón se encienda al detectar un flanco ascendente y al volver a pulsar se apague.

Solución: https://github.com/jecrespo/Curso-Node-RED

Manejar GPIO Raspberry Pi

En este punto https://aprendiendoarduino.wordpress.com/2020/03/01/gpio-raspberry-pi/ ya hemos visto las características físicas del GPIO de Raspberry Pi

Para controlar GPIO con Python, primero debes importar una librería de código escrito previamente. El más común y difundido es el Rpi.GPIO, utilizado para crear miles de proyectos desde los primeros días de la Raspberry Pi.

Ben Croston creó una biblioteca de Python llamada RPi.GPIO, que utilizó como parte de su proceso de elaboración de cerveza. Esto permitió a las personas controlar los pines GPIO desde sus programas Python, y se convirtió en un éxito tanto en educación como en proyectos personales. Lo usamos en muchos de nuestros recursos de aprendizaje gratuitos.

Web: https://pypi.org/project/RPi.GPIO/

Más recientemente, se ha introducido otra biblioteca, llamada GPIO Zero, que ofrece una experiencia más fácil para aquellos que son nuevos en Python y en la electrónica básica. GPIO Zero es una librería creada por Raspberry Pi para que sea más accesible y fácil de usar que RPi.GPIO

Web: https://pypi.org/project/gpiozero/

Documentación: https://gpiozero.readthedocs.io/en/stable/

Versión 1.5: https://www.raspberrypi.org/blog/gpio-zero-v1-5/

GPIO Zero creada por Raspberry Pi: https://www.raspberrypi.org/blog/gpio-zero-a-friendly-python-api-for-physical-computing/

Migrar de GPIO Zero desde RPi.GPIO https://gpiozero.readthedocs.io/en/stable/migrating_from_rpigpio.html

Linea de comandos gpiozero: https://gpiozero.readthedocs.io/en/stable/cli_tools.html

El módulo gpiozero siempre usa la numeración Broadcom GPIO para identificar un GPIO.

El módulo RPi.GPIO puede usar la numeración física de pin (BOARD) o la numeración Broadcom GPIO (BCM).

Ambas bibliotecas están preinstaladas en el sistema operativo Raspbian. En cuanto a la nomenclatura de los pines GPIO, hay varias maneras de identificarlos; el método más simple y obvio es definitivamente el que se refiere a su ubicación física. Empezando por la parte superior izquierda del GPIO, y con esto nos referimos al pin más cercano a la ranura de la micro SD, tenemos el pin físico 1 que proporciona alimentación 3v3. A la derecha de ese pin se encuentra el pin físico de 2 que proporciona 5v de potencia. El número de pines seguirá creciendo a medida que desciendas por las columnas, como habrás entendido a la izquierda encontraremos todos los pines con números impares y a la derecha los pares. 

Hay otro método utilizado, y es la numeración de pines de Broadcom (BCM) (numeración de pines GPIO) que, sin embargo, para el usuario medio puede parecer caótica, con GPIO17, 22 y 27 siguiéndole unos a otros con lo que parecería una pequeña reflexión sobre la numeración lógica. En realidad, el mapeo de pines BCM se refiere a los pines GPIO que estaban conectados directamente al SoC del Raspberry Pi.

La mayoría de los tutoriales de Raspberry Pi que verás utilizan este esquema de numeración, también porque es el que cuenta con el apoyo oficial de la Fundación Raspberry Pi. También ten en cuenta que los números de pin BCM y GPIO se refieren al mismo esquema. Por ejemplo, GPIO17 es lo mismo que BCM17. Por último, algunos pines GPIO también tienen funciones secundarias que les permiten interactuar con diferentes tipos de dispositivos que utilizan los protocolos I2C, SPI o UART; por ejemplo, los pines GPIO3 y GPIO4 también son pines SDA y SCL I2C utilizados para conectar dispositivos a través del protocolo I2C

Más información: https://descubrearduino.com/pines-gpio-de-la-raspberry-pi-4/

Pines GPIO Zero

Uso de los pines:

PWM con RPi: http://www.instructables.com/id/RaspberryPi-Pulse-Width-Modulation-Demonstration/?ALLSTEPS

Ejemplos de Uso

Blink Led

Antes de empezar recordar comprobar la posición de los pines porque en caso de error podemos dañar la Raspberry Pi ya que los GPIO no tienen ninguna protección.

  • Cuando conectes cables a los GPIO procura no equivocarte y fíjate bien.
  • Usa cables con recubrimiento del tipo Dupont Macho-hembra por ejemplo, y no acerques cables sin proteger a tus GPIO (Y mucho menos un destornillador) porque puedes hacer un corto con facilidad.
cables M-F
  • Una vez que conectes un cable hembra protegido, vuelve a mirar y asegúrate de que lo has conectado al pin que querías y no al de al lado.
  • Especial cuidado con los pines que uses para sacar 3V o 5V de tu Raspi. No dejes el otro extremo al aire: Asegúrate de conectarlo a algún sitio.
  • NO CONECTES NADA DE 5V si no estás seguro. Tu Raspberry funciona a 3.3V y meterle 5V en un pin puede suponer quemar el procesador central. 

Instalar las librerías para el uso de los pines GPIO desde Python, asegurandonos de tener actualizado Raspbian:

  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo apt-get install python-dev
  • sudo apt-get install pyton-rpi.gpio

Tened en cuenta que en esta ocasión vamos a alimentar el LED con 3.3V (Que es lo que proporciona un pin de la Raspi) y que la intensidad que obtendremos será: 3.3 / 220 Ω = 15 mA.

Esquema de GPIO:

Conectamos GND al pin 6 de la Raspberry y vamos a usar el pin 12 (GPIO 18) como control del encendido mediante una resistencia intermedia. El esquema de conexión es:

Abrir el IDLE de Python 3 para empezar nuestro programa:

Y copiar código:

import RPi.GPIO as gpio

import time

gpio.setmode(gpio.BOARD)
gpio.setup(12, gpio.OUT)

for  x in range ( 0, 10):

    gpio.output(12, True)
    time.sleep(0.5)

    gpio.output(12, False)
    time.sleep(0.5)

print “Ejecución finalizada”

Guardar el fichero con el nombre blink.py en /home/pi y ejecutarlo pulsando F5

Bucle infinito: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio01-Blink/rpi_led.py

Más información:

Botón

Leer estado de un pulsador:

Código: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio04-Pulsador/rpi_pushbutton_test.py

Código con detección de flanco: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio04-Pulsador/rpi_pushbutton_block.py

GPIO.cleanup() – limpia el estado de in out y pull up down para que no se quede.

GPIO.setwarnings(false) – deshabilita warnings

Con eventos https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio04-Pulsador/rpi_pushbutton_detect.py

Multithread mucho más eficiente si uso con más procesamiento: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio04-Pulsador/rpi_pushbutton_threaded.py

En un hilo de ejecución ejecuto el script que lo pone a dormir y en otro hilo ejecuta la función de callback.

PWM

Cambio de intensidad LED.

Código: https://github.com/jecrespo/Aprendiendo-RaspberryPi/blob/master/Ejercicio05-PWM/rpi_led_pwm.py

Led y Pulsador con GPIO Zero

Ejemplos https://www.raspberrypi.org/documentation/usage/gpio/python/README.md

Documentación GPIO Zero

Tutoriales GPIO Oficiales

Inicio GPIO: https://projects.raspberrypi.org/en/projects/physical-computing/0

Recetas básicas: https://gpiozero.readthedocs.io/en/stable/recipes.html

Más información

Tutorial Adafruit: https://learn.adafruit.com/playing-sounds-and-using-buttons-with-raspberry-pi/overview

Remote GPIO

Remote gpio: Se agregó para permitir el acceso remoto a los pines GPIO desde otro Pi en la red, usando el demonio pigpio, ya que esto es posible usando la biblioteca Python GPIO Zero.

Ver con más detalle: http://bennuttall.com/whats-new-gpio-zero-v1-3/ 

GPIO con Node-RED

Otra forma de manejar el GPIO de Raspberry Pi es usando Node-RED con el nodo https://flows.nodered.org/node/node-red-node-pi-gpio que es el módulo que viene instalado por defecto

Aunque hay más nodos para manejar el GPIO:

Más información: https://nodered.org/docs/faq/interacting-with-pi-gpio

Node-Red no viene instalado en Raspberry Pi pero se puede hacer desde add/remove software.

La forma recomendada es desde Menú – Preferencias – Software Recomendado. Si se instala de esta manera, se puede actualizar usando sudo apt-get upgrade.

Luego se puede ejecutar manualmente con el comando “node-red-star” o :

Para iniciar Node-RED en el arranque de Raspberry Pi de forma automática usar:

  • sudo systemctl enable nodered.service

Más información https://nodered.org/docs/hardware/raspberrypi

Para comprobar que funciona abrir en un navegador http://ip-raspberry:1880

pantalla node-red

Documentación del nodo: https://flows.nodered.org/node/node-red-node-pi-gpio

Tutoriales básicos Node-RED:

Getting started con Node-RED: https://projects.raspberrypi.org/en/projects/getting-started-with-node-red

IoT en 90 Minutos

Vamos a crear un sistema IoT sencillo utilizando una placa basada en ESP8266, la plataforma Thingspeak para registrar los datos y la APP Blynk para controlar y monitorizar desde el móvil.

El objetivo es:

  • Monitorizar la temperatura y humedad de una sala remotamente desde el móvil
  • Encender desde el móvil la iluminación de la sala
  • Registrar todos los datos históricos de temperatura y humedad
  • Registrar las veces que se abre una puerta
  • Mandar avisos por alta temperatura. 
  • Mandar avisos cuando el sensor de puerta se abra.

Los avisos o notificaciones pueden ser:

Material Necesario

Hardware:

  • Wemos D1 mini
  • Sensor DHT11
  • Led + resistencia 220 ohms (para simular la iluminación) o Relé para la iluminación
  • Pulsador + Resistencia 10 kohms  (para simular la apertura de la puerta) o sensor magnético/infrarrojos.

Coste aproximado: 5 – 20 € dependiendo del material usado.

Software:

Coste del software y licencias: 0 €

Conexión Hardware

Esquema de conexión:

Pines utilizados:

  • D4: Led y también es el led integrado de la placa
  • D3: pulsador/puerta, tiene una resistencia de pull up integrada: OJO, este pin va al GPIO0 que control el arranque, asegurarse de no estar a masa/pulsado al reiniciar o cargar un nuevo programa
  • D2: sonda DHT11

El pulsador simula la apertura de la puerta y el led simula la iluminación de la sala.

Blynk

Blynk es una plataforma que permite que cualquiera pueda controlar fácilmente su proyecto Arduino con un dispositivo con sistema iOS o Android. Los usuarios tendrán ahora la posibilidad de crear una interfaz gráfica de usuario de “arrastrar y soltar” para su proyecto en cuestión de minutos y sin ningún gasto extra.

Blynk vendría a ser como tener una protoboard en tu dispositivo móvil, tablet o teléfono, que cuenta con todo lo que necesites usar, desde deslizadores y pantallas a gráficos y otros widgets funcionales que se pueden organizar en la pantalla un Arduino. Además te da la opción de poder recopilar datos de los sensores que montes en un proyecto. Funciona nada más sacarlo de la caja y conectarlo a la placa por Internet.

Arquitectura de Blynk:

Thingspeak

ThingSpeak es un plataforma de Internet of Things (IoT) que permite recoger y almacenar datos de sensores en la nube y desarrollar aplicaciones IoT. Thinkspeak también ofrece aplicaciones que permiten analizar y visualizar tus datos en MATLAB y actuar sobre los datos. Los datos de los sensores pueden ser enviados desde Arduino, Raspberry Pi, BeagleBone Black y otro HW.

Web: https://thingspeak.com/

Precios: https://thingspeak.com/prices

Pasos a seguir

Crear una cuenta en Thingspeak y configurar

Web: https://thingspeak.com/users/sign_up

Tutoriales:

Crear cuenta:

Crear un Nuevo Canal llamado: “Curso IoT”

Crear 3 Fields:

  • Temperatura – Guarda los datos de temperatura
  • Humedad – Guarda los datos de humedad
  • Puerta – Guarda las aperturas de puerta

Guarda la API Key y el número de canal

Instalar Blynk 

Getting Started: https://blynk.io/en/getting-started

Docs: https://docs.blynk.cc/

Instalar Blynk en el móvil: https://blynk.io/

Crear una cuenta en Blynk

Crear un nuevo proyecto llamado “IoT en 90 minutos”

Elegir Hardware, en este caso “Wemos D1 Mini”

Guardar el Auth Token. Auth Token es un identificador único que se necesita para conectar su hardware a su smartphone. Cada nuevo proyecto que cree tendrá su propio Auth Token. Obtendrá Auth Token automáticamente en su correo electrónico después de la creación del proyecto. También se puede copiar manualmente.

Añadir 3 widgets:

  • Un botón (Conectado al Pin D4)
  • Dos Gauge en los pines Virtuales V0 y V1 para temperatura y humedad

Virtual Pin: http://help.blynk.cc/en/articles/512061-what-is-virtual-pins

Configuración del Gauge:

  • Temperatura pin virtual V0
  • Humedad pin virtual V1
  • Modo push
  • Label: C para temperatura y % para Humedad

Configuración del Botón. poner en modo switch:

Aspecto final de la APP:

Ejecutar el programa

 

Preparar IDE Arduino

Instalar el IDE de Arduino:

Instalar el soporte para las placas basadas en ESP8266 en el IDE de Arduino

Instalar librerías necesarias en IDE Arduino desde el gestor de librerías:

 Realizar montaje de Wemos D1 mini

Personalizar el Firmware y Ejecutarlo

Configurar la Vista Pública en Thingspeak

Crear una vista pública, para ello en el canal ir a “sharing” y seleccionar “Share channel view with everyone”

Configurar la vista pública de Thingspeak, es una especie de dashboard donde pondremos:

  • Gráfica de Temperatura (Tipo Spline)
  • Display numérico Temperatura
  • Gráfica de Humedad  (Tipo Spline)
  • Display numérico Humedad
  • Gráfica apertura de puerta (Tipo Step)
  • Lamp Indicator, para ver el estado de la puerta abierto/cerrado
  • Un histograma para ver la variación de la temperatura

La vista debe quedar como esta: https://thingspeak.com/channels/635134

Configurar las Notificaciones en Thingspeak

Configurar avisos en Thingspeak cuando la temperatura sea mayor de 24 grados y cuando se abra la puerta. Para ello usaremos estas utilidades de thingspeak.

Notificaciones posibles:

  • Mandar un mensaje al panel: https://www.aprendiendoarduino.com/servicios/mensajes/index.html, servicio de #aprendiendoarduino para hacer una demo.
  • Enviar un mensaje a Telegram mediante un bot al canal https://t.me/aprendiendoarduino. Para ello es necesario crear un bot, añadirlo al canal y usar su API KEY desde thingspeak con ThingHTTP
  • Enviar un mensaje al canal #arduino_iot de https://aprendiendoarduino.slack.com/
  • Mandar un tweet usando ThingTweet, para ello debemos enlazar nuestra cuenta de Twitter.
  • Mandar un email con mailgun https://www.mailgun.com/, para ello debemos darnos de alta en mailgun y usar la API Key para que dispare el webhook configurado en ThingHTTP y mande un email
  • Para cualquier otra interacción se puede usar IFTTT. Se crea un webhook que se usa desde ThingHTTP y desde IFTTT disparamos el servicio que queramos.
  • Y cualquier otra que disponga de un webhook o API

Primero debe configurarse ThingHTTP para que llame a una API o webhook que dispare la notificación que deseamos. Para ello deberemos darnos de alta en el servicio que deseemos.

Para mandar un mensaje al panel: https://www.aprendiendoarduino.com/servicios/mensajes/index.html debo llamar a esta API:

Crear un nuevo ThingHTTP llamado “Manda Mensaje Alta Temperatura” y poner:

Crear un nuevo ThingHTTP llamado “Manda Mensaje Puerta Abierta” y poner:

NOTA: si no funciona la llamada al servicio de mensajes, mandar un correo a aprendiendoarduino@gmail.com

Una vez creados los elementos ThingHTTP que dispara la notificación queda crear los react, que son las condiciones en la que se disparan las notificaciones, donde diremos en qué condiciones se mandan las notificaciones. En nuestro caso:

  • Temperatura > 24 grados solo la primera vez que pase (Run action only the first time the condition is met: Trigger the action if the condition was previously false and is currently true.)
  • El valor del canal es 1 (Puerta abierta) cada vez que pase.

Crear un nuevo react llamado “Alta Temperatura IoT 90 minutos” con los siguientes parámetros:

Crear un nuevo react llamado “Puerta Abierta IoT 90 minutos” con los siguientes parámetros:

Probar que se muestran los mensajes en el panel https://www.aprendiendoarduino.com/servicios/mensajes/index.html

Si quisiéramos mandar un tweet, simplemente seleccionar en Action “ThingTweet” y poner el texto del tweet.

Identificación Horizontales Demo

Las horizontales o Building Blocks usados en IoT:

Para la demo:

  • Devices: Wemos D1 mini + sensor temperatura + pulsador + led + relé
  • Infraestructura de comunicación: Wifi
  • Gateway: Punto de Acceso Wifi
  • Protocolo: API HTTP y MQTT (transparente al usar las librerías de Blynk y Thingspeak)
  • Plataforma: Thingspeak y Blynk
  • Servicios: Almacenamiento de datos, gráficas, disparo de eventos y análisis de datos por Thingspeak, monitorización móvil por Blynk, notificaciones por IFTTT o plataforma propia.

Limitaciones de la solución utilizada:

  • Máximo número de envíos a plataforma: 15 segundos
  • Datos almacenados solo hasta un año o 3 millones de registros
  • Límite en el cálculo de datos
  • Gráficas simples
  • Depender de terceros para las notificaciones