Desarrollo de aplicaciones IoT en la nube para Arduino y ESP8266 - Tomás Domínguez Mínguez - E-Book

Desarrollo de aplicaciones IoT en la nube para Arduino y ESP8266 E-Book

Tomás Domínguez Mínguez

0,0

Beschreibung

Internet de las cosas (IoT) ha llegado para quedarse. Su presencia se hace notar en campos como la medicina, la industria, el transporte, la energia, la agricultura, las ciudades inteligentes y, especialmente, en los hogares, ambito en el que se centra este libro. Si quiere conocer todo lo necesario para crear sus proyectos de IoT con dispositivos Arduino y ESP8266, este es el libro indicado. Sus explicaciones parten de un nivel basico en Arduino y aumentan su dificultad de forma gradual. Ademas, los conceptos teoricos para conocer los protocolos (HTTP y MQTT) y las arquitecturas utilizadas (cliente]servidor, publicacionsuscripcion y REST) se acompanan con multiples ejercicios practicos en los que se comenta, paso a paso, el codigo de cada programa y la configuracion de los servicios en la nube empleados. Con este libro, desarrollara multitud de aplicaciones IoT y empleara servicios en la nube como Ubidots, Beebotte, Pushbullet o IFTTT, con los que podra interactuar desde cualquier parte del mundo a traves de un navegador web, un telefono movil o los asistentes de voz de Google o Alexa: . Enchufe domotico que permite controlar el encendido o apagado de dispositivos electricos. . Clientes o servidores web con los que leer o escribir datos en los pines de Arduino y ESP8266 desde un navegador. . Aplicacion de visualizacion de datos de sensores o manejo de aparatos electricos desde un telefono movil. . Sistema de alarma por movimiento o apertura de puertas y ventanas, con envio de notificaciones al movil. . Sistema de control de riego con advertencias de humedad por correo electronico. . Boton de emergencia para personas mayores. . Sistema de control de presencia de personas con problemas de orientacion, capaz de enviar alertas al movil de forma automatica cuando salen de casa. . Aplicacion de Google Assitant para el encendido o apagado de luces. . Aplicacion de Amazon Alexa para la apertura de la puerta del garaje. . Control de un dispositivo domotico a traves de un icono de escritorio en el movil. Ademas, en la parte inferior de la primera pagina del libro encontrara el codigo de acceso que le permitira descargar de forma gratuita los contenidos adicionales en www.marcombo.info. Tanto si quiere iniciarse en el mundo del IoT como si es un profesional, este libro no le dejara indiferente. Consiga su ejemplar, haga realidad sus proyectos y vaya mas alla de lo que siempre habia imaginado. Tomas Dominguez es ingeniero de telecomunicacion y doctorado en inteligencia artificial. Su labor profesional se ha desarrollado en una multinacional de telecomunicaciones, donde ha ocupado diversos cargos relacionados con la tecnologia. Asimismo, ha ejercido como profesor universitario de ingenieria informatica en la Universidad Alfonso X el Sabio de Madrid.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern

Seitenzahl: 377

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



DESARROLLO DE APLICACIONES IoT EN LA NUBE PARA ARDUINO Y ESP8266

Tomás Domínguez Mínguez

DESARROLLO DE APLICACIONES IoT EN LA NUBE PARA ARDUINO Y ESP8266

Tomás Domínguez Mínguez

Desarrollo de aplicaciones IoT en la nube para Arduino y ESP8266

Primera edición, 2020

© 2020 Tomás Domínguez Mínguez

© 2020 MARCOMBO, S. L.

www.marcombo.com

Diseño de cubierta: ENEDENÚ DISEÑO GRÁFICO

Maquetación: cuantofalta.es

Asesor técnico: Rubén Beiroa

Correctora: Beatriz García

Directora de producción: M.a Rosa Castillo

«Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra solo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a CEDRO (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra».

ISBN: 978-8-4267-2975-0

Producción del ebook: booqlab.com

A todos aquellos que, de forma tan generosa, resuelven en foros nuestras dudas sobre el uso de las tecnologías software

TABLA DE CONTENIDO

1. INTERNET DE LAS COSAS

1.1 Componentes de IoT

2. COMUNICACIONES WEB

2.1 La familia de protocolos Internet

2.2 Comunicaciones web con ESP-01

2.2.1 Características del ESP-01

2.2.2 Programación del ESP-01 desde el IDE Arduino

2.2.3 Librería ESP8266WiFi

2.2.4 Integración del ESP-01 con Arduino

2.2.5 Prácticas

2.2.5.1 Cliente web

2.2.5.2 Servidor web

2.3 Protocolo HTTP

2.3.1 Peticiones HTTP

2.3.1.1 Tipos de peticiones HTTP

2.3.2 Respuestas HTTP

2.3.3 Prácticas

2.3.3.1 Servidor web avanzado

2.3.3.2 Asignación de valores a los pines del ESP-01 desde un navegador

2.3.3.3 Obtención del estado de los pines del ESP-01 desde un navegador

2.3.3.4 Asignación de valores a los pines PWM de Arduino desde un navegador

2.4 Utilidades del navegador Chrome para el análisis de mensajes HTTP

2.5 Herramienta Postman

2.5.1 Instalación de Postman

2.5.2 Creación de peticiones HTTP

2.5.2.1 Componentes generales de una petición HTTP

2.5.2.2 Realización de peticiones GET

2.5.2.3 Realización de peticiones POST

2.5.3 Obtención de respuestas

3. COMUNICACIONES MQTT

3.1 Protocolo MQTT

3.1.1 Conexión de un cliente a un bróker

3.1.2 Publicación y suscripción de mensajes

3.2 Comunicaciones MQTT con WEMOS D1 R1

3.2.1 Características del WEMOS D1 R1

3.2.2 Librería PubSubClient

3.3 Herramienta MQTTLens

3.3.1 Instalación de MQTTLens

3.3.2 Uso de MQTTLens

3.4 Prácticas

3.4.1 Enchufe domótico

3.4.2 Sensor de temperatura

3.4.2.1 Publicación sin pérdida de mensajes

3.4.2.2 Detección de la desconexión de un dispositivo

3.4.3 Termómetro digital

3.4.4 Alarma con sensor de movimiento

3.4.4.1 Sistema emisor - PIR

3.4.4.2 Sistema receptor – Timbre eléctrico

3.4.4.3 Sistema receptor – Sirena electrónica

3.4.5 Control de la calefacción desde un móvil con IoT MQTT panel

4. FORMATO DE DATOS JSON

5. COMUNICACIONES REST

5.1 Librería HTTP aRest

5.2 Prácticas

5.2.1 Control de la salida de pines digitales

5.2.2 Mando a distancia

5.2.3 Mando a distancia inteligente

5.2.4 Medición de la humedad del suelo

6. SERVICIO UBIDOTS

6.1 Acceso al servicio Ubidots

6.2 Componentes básicos de la plataforma

6.2.1 Dispositivos

6.2.2 Variables

6.2.3 Procesamiento de variables

6.2.4 Cuadro de mandos

6.2.5 Eventos

6.3 Librería MQTT UbidotsESPMQTT

6.4 API HTTP RESTful

6.5 API MQTT

6.6 Prácticas

6.6.1 Estación meteorológica con UbidotsESPMQTT

6.6.1.1 Desarrollo del programa WEMOS

6.6.1.2 Creación del cuadro de mandos en Ubidots

6.6.2 Estación meteorológica con HTTP RESTful

6.6.3 Estación meteorológica con MQTT

6.6.4 Sistema de control de riego

6.6.4.1 Desarrollo del programa WEMOS

6.6.4.2 Creación del cuadro de mandos en Ubidots

7. SERVICIO BEEBOTTE

7.1 Acceso al servicio Beebotte

7.2 Componentes básicos de la plataforma

7.3 API HTTP RESTful

7.4 API MQTT

7.5 Prácticas

7.5.1 Sistema de control de fugas de agua con MQTT

7.5.1.1 Creación del canal, el recurso y el panel de control en Beebotte

7.5.1.2 Desarrollo del programa WEMOS

7.5.1.3 Creación del interruptor en Beebotte

7.5.2 Sistema de control de fugas de agua con HTTP RESTful

8. SERVICIO PUSHBULLET

8.1 Acceso al servicio Pushbullet

8.2 API HTTP

8.3 Prácticas

8.3.1 Alarma por apertura de puertas o ventanas con sensor magnético

8.3.2 Botón de emergencia para personas con necesidades especiales

9. SERVICIO IFTTT

9.1 Acceso al servicio IFTTT

9.2 Componentes básicos de la plataforma

9.2.1 Servicios

9.2.2 Applets

9.2.3 Widgets

9.3 Tecnología webhook

9.4 Prácticas

9.4.1 Notificación de fuga de agua con Webhooks y Pushbullet

9.4.1.1 Creación del applet IFTTT

9.4.1.2 Desarrollo del programa WEMOS

9.4.2 Control de presencia con Beebotte, Webhooks y Pushbullet

9.4.2.1 Creación del applet IFTTT

9.4.2.2 Creación del canal y la regla en Beebotte

9.4.2.3 Desarrollo del programa WEMOS

9.4.3 Sistema buscapersonas con Google Assistant, Webhooks y Beebotte

9.4.3.1 Creación del canal y el recurso en Beebotte

9.4.3.2 Creación del applet IFTTT

9.4.3.3 Desarrollo del programa WEMOS

9.4.4 Control de luces con Google Assistant, Webhooks y Beebotte

9.4.4.1 Creación del canal y los recursos en Beebotte

9.4.4.2 Creación del applet IFTTT

9.4.4.3 Desarrollo del programa WEMOS

9.4.5 Apertura de la puerta del garaje con Alexa, Webhooks y Ubidots

9.4.5.1 Creación del applet IFTT

9.4.5.2 Desarrollo del programa WEMOS

9.4.5.3 Instalación y prueba de Alexa en el móvil

9.4.6 Mando a distancia en el móvil con Button Widget, Webhooks y Ubidots

9.4.6.1 Creación del applet IFTT

9.4.6.2 Instalación y prueba de IFTTT en el móvil

Unidad 1

INTERNET DE LAS COSAS

Internet de las cosas, también conocido por sus siglas en inglés IoT (Internet of Things), es un concepto propuesto por Kevin Ashton en 1999 para referirse a la conexión de objetos cotidianos a través de Internet. Su implantación es cada vez mayor y abarca, entre otros, los sectores de la medicina, la industria, el transporte, la energía, la agricultura, las ciudades inteligentes o los hogares, que es en el que nos centraremos. Hoy en día es más y más frecuente encontrar dispositivos en casa capaces de ser utilizados de forma remota a través de Internet, bien sea para su control o para obtener información de los sensores que lleven incorporados.

El éxito de la tecnología IoT se debe, en gran parte, a su capacidad para introducir objetos de uso diario en el mundo digital, al abrir un amplio abanico de nuevas posibilidades que incrementan enormemente su utilidad, ya que permiten el control de los objetos a distancia (p. ej., encender o apagar una luz), que estos informen de datos recogidos por sus sensores (p. ej., humedad o temperatura) o que envíen alertas (p. ej., alarmas, fallos de funcionamiento). Todo ello desde cualquier dispositivo en cualquier parte del mundo.

Pero la tecnología IoT no solo permite la comunicación entre personas y máquinas, sino que también abre la puerta a la comunicación entre los propios objetos, lo que da lugar a conceptos mucho más amplios como las comunicaciones máquina a máquina (M2M).

Desde el punto de vista técnico, la implantación de IoT es posible gracias a la expansión de las redes inalámbricas (especialmente WiFi) y a los bajos costes de los microcontroladores, los cuales, además, son cada vez más potentes y pequeños. Pero también por el auge de protocolos de comunicación específicos que consumen un menor ancho de banda y requieren menos capacidad de procesamiento y, por lo tanto, consumo de energía. En este sentido, a lo largo de las páginas de este libro se trabajará en el desarrollo de proyectos basados en el SoC ESP8266 y los protocolos de comunicación HTTP y MQTT (este último cada vez más relevante en el mundo IoT). Igualmente se utilizará la arquitectura basada en los principios REST.

Se hará especial énfasis en el mundo de los servicios web, es decir, aquellos que se ejecutan en Internet (en la nube), ya que su creciente oferta posibilita el desarrollo de dispositivos IoT cada vez más inteligentes, más seguros y más accesibles. El control y la recogida de la información ofrecida por dichos dispositivos podrán realizarse desde un ordenador o un móvil, y se mostrarán de forma vistosa, con indicaciones instantáneas o mediante evoluciones históricas. Todo ello utilizando herramientas de desarrollo gráfico que en la mayoría de los casos no implican aprender ningún nuevo lenguaje de programación porque no hay que editar código.

Los animo a adentrarse en este maravilloso mundo en el que podrán realizar proyectos IoT que hubieran pensado que solo estaban al alcance de los profesionales del sector.

1.1 COMPONENTES DE IoT

Un dispositivo IoT no es un elemento aislado, sino que forma parte de un ecosistema en el que se pueden destacar cuatro grandes componentes:

• Sensores/actuadores

• Conectividad

• Procesamiento de datos

• Interfaces de usuario

Los sensores son dispositivos que recogen información del entorno. Los hay de muchos tipos, como los de humedad, temperatura, movimiento, distancia, nivel de líquidos, etc. Los actuadores son elementos que modifican el entorno, como servos, motores, relés que activan cualquier dispositivo eléctrico, etc. Naturalmente, un mismo dispositivo IoT podrá tener uno o más sensores o actuadores. En las diferentes prácticas propuestas en este libro se utilizarán muchos de ellos.

Los sensores o actuadores podrán ser de muy distinta naturaleza o complejidad, pero todos ellos tendrán algo en común: la capacidad de conectividad. Ya sea a través de WiFi, Bluetooth, redes móviles o satélites, su existencia no tendría sentido si no fueran capaces de enviar los datos recogidos o recibir las órdenes que se les quiera dar. El uso de servicios en la nube supondrá su conexión a través de Internet con la infraestructura que, ubicada en la nube, deberán integrarse e interactuar.

El procesamiento de datos se realiza una vez recogida la información obtenida de los sensores. Este podrá ser desde el establecimiento de eventos mediante sencillas reglas, como el envío de notificaciones a móviles en caso de la subida de la temperatura por encima de un nivel establecido, o algo tan complejo como el análisis de las imágenes recogidas por una cámara mediante complicados algoritmos que identifiquen determinadas situaciones, objetos o personas.

Las interfaces de usuario son imprescindibles para mostrar la información transmitida por los dispositivos. Pueden ser de distinta naturaleza, desde controles gráficos que muestren los datos de los sensores, pasando por el envío de correos electrónicos o notificaciones a móviles, hasta interfaces por voz usando asistentes como el de Google o Alexa. A lo largo de las páginas de este libro aprenderán y experimentarán con todas ellas.

Unidad 2

COMUNICACIONES WEB

El término web se emplea en multitud de ocasiones, pero ¿a qué nos estamos refiriendo cuando lo utilizamos? A veces se hace para mencionar algo muy general como Internet, pero otras algo tan concreto como una página alojada en un servidor. Parece, por lo tanto, que se trata de un comodín para referirse a muchas cosas que, aunque están relacionadas entre sí, son ciertamente muy diferentes. Entonces ¿qué es realmente la web? Dicha palabra es una abreviatura de World Wide Web (WWW), que representa un sistema de distribución de documentos hipertexto (texto que contiene enlaces a otros textos) e hipermedia (no solo integra texto, sino también imágenes, vídeo, etc.) a través de Internet. La web fue creada por Tim Berners-Lee en el CERN en 1989 y dada a conocer en 1992. Desde entonces ha ido creciendo su uso hasta formar ya parte inseparable de nuestras vidas.

El CERN tiene sede en Ginebra (Suiza) y su nombre procede de las siglas francesas que significan Consejo Europeo para la Investigación Nuclear.

Las comunicaciones web tienen tres elementos clave: un cliente que solicita y recibe documentos, un canal de comunicación, y un servidor que almacena y sirve los documentos a los clientes que se lo soliciten.

El software cliente es el navegador, el canal de comunicación es Internet y el servidor es el sitio web que contiene los documentos visualizados en el navegador. Dichos documentos se conocen como páginas web y están escritas en HTML (HyperText Markup Language), cuyas siglas en español se pueden traducir como ‘lenguaje hipertexto de marcas’. Es hipertexto porque un documento se puede vincular a otro, al que se accedería pulsando en el enlace correspondiente. Y es de marcas porque se basa en el uso de marcas (etiquetas o tags) situadas entre los signos ‘<’ y ‘>’ que funcionan como comandos de formato de textos, imágenes, etc.

Para que un navegador web pueda visualizar una página, debe solicitarla a un servidor, pero antes debe saber dónde está. ¿Cómo localizarlo? Mediante su dirección o URL (Uniform Resource Locator). Las siglas inglesas que componen su nombre significan ‘localizador uniforme de recursos’ y es un conjunto de caracteres que identifica de forma exclusiva un recurso (p. ej., una página web) en Internet. El URL más conocido seguro que es http://www.google.com/. No voy a entrar en el detalle de los componentes de un URL, pero sí voy a referirme al primero de ellos, que es el que hace referencia al protocolo utilizado para la comunicación entre el cliente y el servidor. En el caso del URL anterior, es HTTP (HyperText Transfer Protocol, ‘protocolo de transferencia de hipertextos’), que es el más utilizado en Internet y la base de la comunicación entre clientes y servidores web. Es el lenguaje universal que nos permitirá acceder a cualquier servidor del mundo independientemente de donde nos encontremos.

2.1 LA FAMILIA DE PROTOCOLOS INTERNET

Aunque en el apartado anterior se haya nombrado solo a HTTP, Internet está basado en toda una familia de protocolos que, gracias a su arquitectura en capas, consigue abstraer las particularidades de cada computadora y su sistema operativo (sea cliente o servidor). Dicha arquitectura consta de cuatro niveles que se muestran gráficamente en la siguiente figura.

El motivo de establecer una arquitectura basada en capas para las comunicaciones web es porque el intercambio de datos entre un cliente y un servidor se debe realizar llevando a cabo múltiples procedimientos, cuyo resultado sería un software complejo, difícil de mantener y propenso a fallos. Al dividir esta complejidad en partes, cada capa se encargaría de desarrollar solo alguno de dichos procedimientos y ocultaría la dificultad de su implementación mediante servicios que serían invocados desde la capa superior. En este modelo, cada capa se relaciona solo con su nivel inmediatamente inferior, a quien solicita servicios, y el superior, a quien ofrece los desarrollados por ella misma.

Al ocultarse la complejidad de lo que se hace en cada capa, el desarrollador de aplicaciones no tendrá que preocuparse por cómo se realizan las comunicaciones, ya que únicamente hará uso de los servicios de aplicación (los de la última capa), sabiendo que las de abajo le asegurarán el envío y la recepción de los datos, independientemente del tipo de red y el hardware o sistema operativo de su interlocutor.

Veamos en detalle las funciones de cada una de estas capas.

La primera representa el nivel interfaz de red o acceso a la red. Es la que permite la conexión física de los elementos HW que intervienen en las comunicaciones (interfaces, cables, conectores, etc.).

A continuación vienen los niveles de Internet y de transporte. En dichos niveles se localizan los protocolos TCP/IP, cuyos acrónimos corresponden a Transmision Control Protocol/ Internet Protocol (Protocolo de Control de Transmisión/ Protocolo de Internet). Dichos protocolos son realmente los más importantes y fueron los primeros en definirse, por lo que se consideran el núcleo de lo que hoy conocemos como Internet. Se desarrollaron inicialmente en el año 1973 por Vincton Cerf como parte de un proyecto dirigido por Robert Khan, patrocinado por la agencia de programas avanzados de investigación (ARPA - Advanced Research Projects Agency) del departamento estadounidense de defensa (DoD – Department of Defense). Se ejecutó por primera vez en la red ARPANET, la cual conectaba varias universidades y laboratorios de investigación en Estados Unidos. La idea subyacente era crear una red descentralizada que, en caso de un hipotético ataque nuclear ruso, pudiera seguir en funcionamiento.

Pero ¿cuál es la función de cada uno de dichos protocolos? En el caso de IP, se trata de un protocolo de red que se encarga del direccionamiento y enrutamiento de los datos desde su origen al destino, para lo que debe diferenciar unívocamente todo lo que se conecte a Internet mediante una dirección IP. Como ya sabrán, las direcciones IPV4 se expresan mediante un número binario de 32 bits que se representa como cuatro octetos en formato decimal separados por puntos. Por ejemplo, dentro de la red WiFi de casa, la dirección IP de su ordenador podría ser 192.168.1.32.

Un octeto son 8 bits y representan un número entre 0 y 255.

Las direcciones IPV6 están compuestas por 128 bits y se expresan en una notación hexadecimal de 32 dígitos.

El protocolo TCP, situado en un nivel superior (el de transporte), se encarga de garantizar la entrega de datos y proporciona además un mecanismo para distinguir distintas aplicaciones o servicios dentro de una misma máquina mediante la utilización de puertos. El puerto es el punto de acceso a un servicio. Se coloca a continuación de la dirección IP separado por el carácter ‘:’. Por ejemplo, imaginen que en su red WiFi tienen un servidor web que escucha peticiones HTTP por el puerto 80. Si dicho servidor web se ejecutara en un ordenador con la dirección IP 192.168.1.99, para acceder a él deberían escribir 192.168.1.99:80 en la barra de direcciones del navegador.

El puerto estándar de escucha de peticiones HTTP de un servidor web es el 80, por lo que, en caso de no especificar nada, el navegador intentaría conectarse por ese puerto y devolvería error en caso de que estuviera escuchando por otro diferente.

El nivel de aplicación permite, como su propio nombre indica, el intercambio de datos entre aplicaciones. En dicho nivel se encuentran protocolos como el de correo electrónico (SMTP), la transferencia de archivos (FTP) o el caso que nos ocupa, el del servicio Web (HTTP).

Resumiendo todo lo dicho hasta ahora, la siguiente figura muestra los protocolos utilizados en las comunicaciones web usando este modelo de capas.

2.2 COMUNICACIONES WEB CON ESP-01

Actualmente, la forma más común de conexión a Internet es por WiFi. Pero Arduino no tiene capacidad para este tipo de conexiones, por lo que tendrán que conectarlo a un componente que realice dicha labor. En concreto, utilizarán el ESP-01, cuyo aspecto se puede ver en la siguiente imagen.

El ESP-01, fabricado por Espressif, es un módulo con un SoC (System on a Chip) ESP8266 cuyo microcontrolador trabaja a 80 MHz, un chip de memoria de 512 Kb o 1 Mb (según el modelo) y WiFi 802.11 b/g/n integrado. Aunque conectado con Arduino su función sea únicamente la de proporcionar conectividad WiFi, pueden imaginar que un componente con semejante potencia podría utilizarse de forma independiente en proyectos para los que se requiera un número pequeño de pines digitales, tal como se verá más adelante.

Un SoC es un término utilizado para referirse a un chip en el que se integran diversos componentes que forman parte de un ordenador o sistema informático (por ejemplo, CPU, memoria, WiFi, etc.).

2.2.1 Características del ESP-01

Desde el punto de vista electrónico, el ESP-01 tiene una tensión de alimentación de 3.3 V. Aunque parezca que pueda funcionar con 5 V, no lo conecten nunca a esta tensión, porque terminarían dañándolo. Además, tiene un consumo muy elevado de corriente que en algunas situaciones puede superar los 200 mA. Arduino solo puede proporcionar hasta 50 mA, por lo que se recomienda usar una fuente de alimentación independiente. En la siguiente imagen pueden ver una utilizada habitualmente en este tipo de proyectos.

Esta pequeña fuente de alimentación tiene dos salidas independientes que se pueden configurar a 5 o 3.3 V según la posición de sus jumpers. La corriente suministrada llega a los 700 mA, suficiente para alimentar el ESP-01. La entrada de energía puede venir de un puerto USB, de un adaptador de red o de una batería con una tensión entre 6.5 y 12 V. Además, dispone de un interruptor para encenderla y apagarla.

Siempre que se utilicen dos fuentes de alimentación independientes, como la de Arduino y la necesaria para el ESP-01, se han de conectar entre sí los pines GND para que ambas tengan la misma referencia de tensión y los circuitos funcionen correctamente.

El ESP-01 se compone de 8 pines.

Vean la función de cada uno de ellos:

• GND, VCC. Son los pines de alimentación. No olviden que funcionan a 3.3 V.

• GPIO0, GPIO2. Pines digitales de E/S. También trabajan con 3.3 V.

• RX, TX. Son los pines de recepción y transmisión serie del Soc. Sirven tanto para su programación como para la comunicación con otras placas, como Arduino. También pueden funcionar como pines digitales con el número 3 (RX) y 1 (TX). De nuevo, recuerden que dichos pines trabajan a 3.3 V, por lo que los componentes que conecten a ellos deberán estar adaptados a esta tensión.

• CH_PD. Si la tensión de dicho pin es 0V (nivel bajo), el ESP-01 se apaga, mientras que si lo conecta a 3.3 V (nivel alto), se enciende.

• RESET. Sirve para reiniciar el ESP-01 cuando lo conecte a GND.

En realidad, el SoC ESP8266 dispone de más puertos GPIO de los que únicamente se deben utilizar los indicados (GPIO0, GPIO1, GPIO2, GPIO3), ya que el resto nos son accesibles para su programación. Tratar de usarlos daría como resultado errores de ejecución.

2.2.2 Programación del ESP-01 desde el IDE Arduino

Tanto si utilizan el módulo ESP-01 de forma independiente o como interfaz WiFi para su Arduino, tendrán que programarlo. Pero no se preocupen, no tendrán que aprender ningún nuevo lenguaje de programación ni instalar un IDE adicional al de Arduino. El ESP-01 se programa igual que Arduino en su mismo IDE. Pero antes tendrán que instalar un plugin específico, para lo que es imprescindible tener una versión del IDE superior a la 1.6.4, a partir de la cual se permite incorporar las definiciones de nuevas placas.

Para instalar el plugin del ESP8266, pulsen en Archivo → Preferencias y, en el campo « Gestor de URLs Adicionales de Tarjetas» escriban el URL

http://arduino.esp8266.com/stable/package_esp8266com_index.json, tal como se muestra en la siguiente ventana.

No se olviden de pulsar Ok en la ventana para consolidar el cambio realizado.

Lo siguiente que tendrán que hacer es incorporar la nueva placa al IDE pulsando en Herramientas → Placa:”***” → Gestor de tarjetas… (Los asteriscos serían el nombre de la placa que actualmente tengan seleccionada). Finalizada la instalación, el resultado debe ser el mostrado en la siguiente pantalla.

A partir de ahora, cuando quieran programar esta placa, deberán seleccionarla en Herramientas → Placa: “***” → Generic ESP8266 Module, tal como aparece a continuación.

Con esta operativa ya tienen el IDE Arduino preparado para programar el módulo ESP-01. Ahora queda montar el circuito que permita dicha programación, en el que deberán incorporar necesariamente un adaptador FTDI que habilite la comunicación serie desde su ordenador al ESP-01 usando un cable USB. Esto es así porque, a diferencia de Arduino, este pequeño componente no viene con el adaptador incorporado, por lo que deberán conectarlo externamente. En la imagen se aprecia el aspecto de uno de ellos.

En uno de sus extremos se encuentra el conector utilizado para la conexión USB con el ordenador. En el otro extremo están los pines de alimentación (GND y VCC) y los de recepción y transmisión de datos (RX y TX). La conexión entre el ESP-01 y el adaptador será a través del protocolo serie.

A continuación se muestra la conexión del módulo ESP-01 con el adaptador en modo grabación.

Como pueden observar, se conectan los pines RX/TX de ambos elementos de forma cruzada, ya que lo que se envíe por el pin TX de uno de los componentes deberá ser recibido por el pin RX del otro.

Ahora sí, ya están en condiciones de cargar su primer programa en el ESP8266, pero antes es necesario hacer una última consideración. A diferencia de Arduino, al que no hay que indicarle de forma explícita si lo que se quiere es cargar un programa o ejecutarlo, en el caso del ESP-01 sí debe hacerse. Para ello, siempre que programen el módulo, tendrán que poner el pin GPIO0 a nivel bajo (0V).

Por el contrario, cuando lo que quieran es ejecutar un programa, lo deberán dejar desconectado. Además, en ejecución ya no es necesario el adaptador FTDI. El siguiente gráfico muestra el conexionado del módulo ESP-01 en modo ejecución.

Cuando se desconecta el pin GPIO0, realmente lo que está haciendo es dejarlo a nivel alto (3.3 V), ya que dicho pin tiene internamente una resistencia de pull up que lo mantiene en ese nivel.

2.2.3 Librería ESP8266WiFi

Como han comprobado en el apartado de introducción sobre las comunicaciones web, se requiere el manejo de una serie protocolos que aseguren el entendimiento entre clientes y servidores. Esa labor resultaría complicada si no hubiera librerías que la facilitaran. Existen varias, por lo que ha sido necesario decantarse por una de ellas: la ESP8266WiFi de Ivan Grokhotkov. Antes de ejecutar cualquier programa en el ESP-01, deberán haberla cargado en el IDE de Arduino pulsando Programa → Incluir Librería → Gestionar Librerías.

Esta librería se utilizará tanto para la conexión con la red WiFi como en las comunicaciones web. En el primer caso, harán uso de la clase Wifi (representa la conexión de un dispositivo ESP8266 a la red Wifi), y en concreto, de los siguientes métodos de clase:

•begin(SSID, contraseña): inicia el proceso de conexión a la red Wifi identificada con el SSID y la contraseña pasados como argumento al metodo.

•status(): devuelve un código cuyo valor indica lo que está sucediendo con la conexión Wifi. Si este fuera 3 (contenido en la constante WL_CONNECTED) significaría que la conexión se ha realizado con éxito.

En lo que respecta a las comunicaciones web, como saben, están basadas en un modelo petición/respuesta, en el que un cliente realiza la petición a un servidor que la atiende y devuelve una respuesta. Ambos roles quedarán reflejados en las dos clases principales de la librería ESP8266WiFi.

En el paradigma de programación orientada a objetos, una clase es la representación abstracta de algo, en este caso, un cliente o un servidor web. Un objeto es una instancia concreta de una clase. Siguiendo con el mismo ejemplo, el cliente o el servidor web que se crea en cada programa.

La clase que representa a un cliente web se llama WiFiClient. En ella se destacan los siguientes métodos.

•connect(servidor, puerto). Conecta el cliente a un servidor por un puerto determinado. El argumento servidor puede ser una dirección IP o un URL. El valor de retorno indica éxito o fracaso.

•connected(). Devuelve true si el cliente está conectado a un servidor y false en caso contrario.

•available(). Devuelve el número de bytes disponibles para leer, es decir, la cantidad de datos que el servidor ha dado como respuesta al cliente.

•readStringUntil(carácter terminador). A partir de la respuesta del servidor, retorna la cadena de caracteres pendientes de leer hasta encontrar el que se le pasa como argumento.

•print(datos) o println(datos). Envía al servidor los datos pasados como argumento. Dichos datos pueden ser de tipo char, byte, int, long, or string.

•flush(). Desecha los datos enviados por el servidor que aún no han sido leídos.

•stop(). Desconecta al cliente del servidor.

Cualquier clase u objeto puede contener funciones que realicen determinadas tareas o comportamientos. En terminología orientada a objetos, a dichas funciones se las llama métodos. La forma de invocar un método es la siguiente:

objeto.método (argumentos)

clase.método (argumentos)

En el primer caso el método es de objeto, mientras que en el segundo es de clase. La diferencia entre ambos es que el código que se ejecuta cuando se invoca un método de clase es el mismo para todos los objetos. En los métodos de objeto, cada uno de ellos tiene su propio código (aunque las sentencias sean las mismas), por lo que la ejecución del método de un objeto es independiente de la del mismo método de otro objeto.

La clase que representa a un servidor web se llama WiFiServer. En ella sobresalen los siguientes métodos:

•begin(). Le indica al servidor que comience a escuchar conexiones entrantes.

•available(). Devuelve a un cliente que está conectado al servidor y tiene datos disponibles para leer. Si no hubiera ninguno, devolvería null.

2.2.4 Integración del ESP-01 con Arduino

La integración del ESP-01 con Arduino se realiza implementando un código (su estructura será la misma en ambos dispositivos) consistente en la lectura y escritura de datos en el puerto serie. A nivel físico, esto supondrá la conexión de los pines Rx y Tx del ESP-01 con los pines Tx y Rx de Arduino. Es imprescindible que ambos se conecten de forma cruzada, porque lo que se envíe desde el pin Tx del ESP-01 se debe recibir por el Rx de Arduino y viceversa.

Para ejemplarizar dicha integración, realizará un circuito en el que tanto el ESP-01 como Arduino tendrán conectado un pulsador y un led. Cuando se presione el pulsador de Arduino, se encenderá el led del ESP-01 y viceversa. El circuito empleado será el siguiente:

En dicho circuito, cada uno de los leds se conectan al ESP-01/Arduino mediante una resistencia de 220 Ω. Por otra parte, se ha puesto una resistencia de 4.7 KΩ entre GND y el pin del pulsador que va al ESP-01/Arduino para mantenerlo a nivel bajo en estado de reposo. Al presionarlo, éste pasará a nivel alto, ya que el otro pin del pulsador está conectado a VCC. La resistencia de 4.7 KΩ evita que se produzca un cortocircuito, ya que sin ella estaríamos conectando directamente VCC a GND.

Observen que el ESP-01 utiliza una fuente de alimentación propia debido a que Arduino no sería capaz de aportar la corriente que necesita.

Recuerden que, siempre que utilicen fuentes de alimentación diferentes, deberán conectar los polos GND de ambas para tener una referencia de tensión única en el circuito.

El programa que se ejecutaría en el ESP-01 sería el siguiente:

Al principio del programa se declaran las variables que identifican los pines en los que se conectan el pulsador (pinPulsador) y el led (pinLed), que coinciden con los del circuito mostrado más arriba.

En el bloque setup() únicamente se determina la velocidad de conexión entre el dispositivo Arduino y el ESP-01 (9600 baudios), y se configuran los pines del pulsador y el led como entrada y salida, respectivamente.

En el bloque loop() lo primero que se hace es verificar si Arduino ha enviado algún dato por el puerto serie. Si fuera así, lo leería y asignaría el valor leído al estado del led. Puesto que Arduino solo enviará datos cuando quiera encender el led, de no haber ninguno, se procederá a apagarlo.

if (Serial.available()) digitalWrite(pinLed, (int)Serial.read()); else digitalWrite(pinLed, LOW);

Arduino solo enviará el valor HIGH al ESP-01, por lo que podría pensarse en utilizar la siguiente sentencia en vez de la anterior:

if (Serial.available()) digitalWrite(pinLed, HIGH);

Sin embargo, siempre será necesario leer el puerto serie con el método read() para eliminar dicho dato del búfer de entrada y dejar sitio al siguiente.

A continuación se comprueba si se ha presionado el pulsador, en cuyo caso se enviaría por el puerto serie el valor HIGH para que Arduino encendiera el led que tiene conectado.

if (digitalRead(pinPulsador)) Serial.print(HIGH);

Puesto que el monitor serie utiliza, como su nombre indica, el puerto serie y este se halla ocupado por la integración con Arduino, no podrá mostrarse ningún tipo de información de trazas con comandos del estilo Serial.println().

El programa que deberán cargar en Arduino es muy similar.

Lo único que cambia son los pines a los que está conectado el pulsador y el led. En el bloque setup() se debe prestar especial atención a que la velocidad del puerto serie sea la misma que la del ESP-01.

El bloque loop() es idéntico al de dicho dispositivo, ya que, al igual que este, únicamente escucha si se le ha enviado algún dato por el puerto serie, en cuyo caso encendería el led. De la misma manera, también comprobaría si se ha presionado el pulsador y, en caso afirmativo, enviaría al ESP-01 un valor alto para que encendiera el led que tiene conectado.

Puesto que la carga del programa se realiza por el puerto serie, no tengan nada conectado a los pines Rx y Tx de Arduino hasta no haber finalizado dicha carga. En una práctica posterior se enseñará el uso de la librería SoftwareSerial, que permitirá utilizar otros pines diferentes al Rx/Tx como puerto serie de entrada/salida. De esa forma, no solo podrán tener el circuito cableado en el momento de la carga del programa, sino que también podrán sacar por el monitor serie información de trazas.

2.2.5 Prácticas

Una vez que tienen configurado el IDE de Arduino para la programación del ESP-01, conocen la operativa para hacerlo y la librería necesaria para establecer comunicaciones HTTP, están en condiciones de realizar los dos elementos fundamentales de dicha comunicación: un cliente y un servidor web.

2.2.5.1 Cliente web

En esta práctica van a crear un cliente web que acceda cada 10 segundos a un servidor que proporcione su IP pública. El URL del servidor es www.vermiip.es. Si se conectaran a él desde un navegador web, este mostraría la siguiente página:

Ahora harán lo mismo desde un cliente web dentro de un programa que se ejecuta en el ESP-01, pero, en vez de mostrar la página HTML, analizarán su código para buscar el texto “Tu IP pública es: “, ya que la dirección IP que están buscando viene a continuación. Vean el resultado que obtendrían en el monitor serie de Arduino.

El código del programa ESP8266 es el siguiente:

Los tiempos de compilación y carga de programas en el ESP-01 son más altos que los de Arduino. Si ven que el proceso tarda algunos minutos, no significa que haya problemas en el IDE.

En primer lugar, deberán cargar la librería utilizada para gestionar las comunicaciones WiFi con el SoC ESP8266.

#include <ESP8266WiFi.h>

A continuación declararán las variables que contienen el nombre (SSID) y la contraseña de la red WiFi a la que van a conectar el ESP8266.

Si utilizan el código que acompaña al libro, no olviden actualizar los valores de dichas variables con los de su red WiFi.

Finalmente, declararán la variable con el URL del servidor web al que va a conectarse, en concreto www.vermiip.es.

En el bloque setup() establecerán la conexión con su red WiFi. Para ello, lo primero que harán será iniciar la conexión con el método begin() de la clase WiFi, cuyos argumentos son el nombre y la contraseña de la red a la que deben conectarse.

WiFi.begin(ssid, password);

A continuación tendrán que esperar a que se haya establecido dicha conexión y comprobar cada medio segundo en un bucle while si el método status() de la clase WiFi devuelve como resultado el valor de la constante WL_CONNECTED.

while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(“.”); } Serial.println(“ Conectado”);

Ya dentro del bloque loop(), lo primero que harán es declarar dicho cliente (clienteWeb) como un objeto de la clase WiFiClient.

WiFiClient clienteWeb;

Para que dicho cliente pueda efectuar peticiones a un servidor, es necesario haber establecido previamente una conexión con él. Eso se consigue con el método connect() de dicho objeto, al que le pasarán como argumento el URL del servidor y el número del puerto por el que está escuchando (generalmente el 80). Como este método devolverá true cuando se haya establecido dicha conexión, las peticiones se realizarán dentro de la condición if.

if (clienteWeb.connect(servidorWeb, 80)){ … }

Para hacer las peticiones, utilizarán el comando print() del objeto clienteWeb, al que pasarán como argumento el mensaje de solicitud HTTP, que en este caso será de tipo GET.

clienteWeb.print(String(“GET /”) + “ HTTP/1.1\n” + “Host: “ + servidorWeb + “\n” + “Connection: close\r\n” +”Connection: close\n\n”);

La comunicación entre el cliente y el servidor se realiza utilizando mensajes HTTP cuya estructura se explicará más adelante, por lo que ahora limítense únicamente a realizar las peticiones tal como aparece en la sentencia anterior.

Una vez hecha la petición, ya solo queda esperar la respuesta del servidor web, que será una página HTML. Pero antes de leer el contenido de dicha página, deberán asegurarse de que sigue conectado con el método connected(), que devolverá true en caso afirmativo. También tendrán que confirmar que el servidor haya enviado algún dato, para lo que se utilizará el método available(), que devolverá el número de bytes de la respuesta obtenida. Si es mayor que cero, significará que ha recibido datos, por lo que la segunda condición será cierta y podrán empezar la lectura de dicha información.

while (clienteWeb.connected()) { if (clienteWeb.available()) { … } }

La lectura de la página web la realizarán línea a línea.

Ahora, lo que tendrán que hacer es localizar su dirección IP pública en cada una de estas líneas. Para ello utilizarán una condición que busque el texto “(“<h2>Tu IP p&uacute;blica es: “ ya que su IP se encuentra entre dicho texto y la etiqueta HTML “</h2>”.

if(linea.indexOf(“<h2>Tu IP p&uacute;blica es: “) != -1) Serial.println(“Su IP p&uacute;blica es: “+ linea.substring(linea.indexOf(“<h2>Tu IP pública es: “)+28, linea.indexOf(“</h2>”)));

El número 28 que aparece en la sentencia de más arriba es la posición del carácter siguiente al del texto “<h2>Tu IP p&uacute;blica es: “ (empezando a contar desde 0).

Para entenderlo mejor, vean el código de la página HTML devuelta por el servidor.

Con una flecha se ha indicado la línea donde aparece el texto que busca en la condición para extraer su IP pública.

<h2>Tu IP p&uacute;blica es: xx.xx.xxx.xxx</h2>

La última sentencia relevante es la que finaliza la conexión con el servidor una vez leída la página HTML.

clienteWeb.stop();

2.2.5.2 Servidor web

En el apartado anterior han creado un cliente web que se conectaba a un servidor. Ahora se situarán en el lado opuesto de la comunicación y crearán un servidor web al que se pueda llegar desde cualquier cliente. El servidor web que desplegarán dará servicio dentro de su red WiFi en la dirección IP 192.168.1.99. Cuando accedan a él tecleando dicha IP en la barra de direcciones de su navegador, aparecerá la siguiente página web:

La dirección IP utilizada solo tiene sentido dentro de la red WiFi en la que está conectado el ESP-01. Por eso el navegador utilizado deberá ejecutarse en un ordenador o teléfono móvil previamente conectado a dicha red.

Si acceden al código HTML de dicha página, verán lo siguiente:

<!DOCTYPE html> <head> <meta charset=“UTF-8”> <title>Servidor Web ESP8266</title> </head> <html> <body> <h1>Bienvenido al servidor Web de mi ESP8266</h1> </body> </html>

Todos los navegadores ofrecen la posibilidad de ver el código HTML de una página web. Si, por ejemplo, utilizan Chrome, pulsen con el botón derecho del ratón sobre dicha página y seleccionen “Ver código fuente de la página”.

Dicho código deberá haber sido generado por el propio ESP-01. Para entenderlo, es necesario tener unas nociones básicas de HTML que trataré de dar a continuación. Como se dijo en la introducción de este capítulo, HTML es un lenguaje hipertexto de marcas. Las marcas son etiquetas o tags limitadas entre los caracteres ‘<’ y ‘>’. Se utilizan para estructurar el contenido de una página web. Generalmente cada etiqueta tiene su correspondiente de cierre (la misma, pero situada entre los caracteres ‘</’ y ‘>’), dentro de las cuales se enmarca el contenido al que afectan. Por ejemplo, la siguiente sentencia HTML utiliza la etiqueta h1 para indicarle al navegador que muestre el texto “Hola Mundo” como la cabecera más importante del documento (generalmente el título de la página).

<h1>Bienvenido al servidor Web de mi ESP8266</h1>

Si quisieran que dicho texto se mostrara como subtítulo de la página, se utilizaría la etiqueta h2.

<h2>Bienvenido al servidor Web de mi ESP8266</h2>

El texto sigue siendo el mismo, pero se visualiza de forma diferente dependiendo de las etiquetas dentro de las que se encuentre, que indicarán al navegador cómo mostrarlo.

La primera etiqueta que se encuentra en un documento HTML5 es la siguiente.

<!DOCTYPE html>

A continuación aparecen las que contienen la cabecera (head) y el cuerpo del documento (html), junto con las correspondientes de cierre.

<head> … </head> <html> … </html>

La cabecera contiene elementos generales de la página, en el caso que nos ocupa, la codificación de los caracteres (etiqueta meta que indica una codificación UTF-8) o el título de la pestaña donde se mostraría en el navegador (etiqueta title).

<meta charset=”UTF-8”> <title>Servidor Web ESP8266</title>

El cuerpo contiene todos los elementos visibles de la página, en este caso, el mensaje de bienvenida.

<h1>Bienvenido al servidor Web de mi ESP8266</h1>

HTML es un estándar y, por lo tanto, cualquier página expresada en este lenguaje podrá visualizarse en un navegador web. De todas formas, dependiendo de la versión HTML implementada o del tipo de navegador, la visualización de una misma página puede llegar a tener un aspecto diferente.

¿Cómo ha conseguido el ESP-01 atender la petición de un navegador y responder con una página HTML? Vean el código que lo ha permitido.

Como en el caso anterior, lo primero que se hace es importar la librería de comunicación web del ESP8266.

#include <ESP8266WiFi.h>

A continuación declararán las variables que serán utilizadas en el resto del programa. Además de la que contienen el SSID (ssid) y la contraseña (password) de la red WiFi, se observan otras tres nuevas.

La primera (ip) contendrá la dirección IP por la que el servidor web atenderá las peticiones, en concreto, la 192.168.1.99. De no hacerlo así, su router le asignaría una de acuerdo al protocolo DHCP (Dynamic Host Configuration Protocol).

Tengan cuidado de no elegir una IP ya utilizada en la WiFi de su casa, es decir, que haya sido asignada previamente por su router al ordenador, móvil, TV o cualquier otro dispositivo con capacidades WiFi que tenga conectado a la red.

Tampoco use la dirección 192.168.1.1 porque es la empleada generalmente para la administración del propio router.

La segunda variable (gateway) contendrá la dirección IP del gateway (puerta de enlace). Un gateway es un dispositivo que permite interconectar redes diferentes. Su propósito es hacer de traductor entre los lenguajes empleados por los protocolos de ambas redes.

En sus casas, el router es el responsable de realizar dicha función, haciendo de pasarela entre la red externa del proveedor de comunicaciones que haya contratado y su red local, a la que se conectan todos sus dispositivos. Generalmente, dicha dirección IP es la 192.168.1.1. Si no funcionara con esa, tendrían que consultar la información de su router o al proveedor.

Finalmente, se encontrarán con la tercera variable (subnet). Representa la máscara de subred y, sin entrar en detalles, solo les diré que sirve para conocer qué números de una dirección IP identifican la red local y cuáles el dispositivo conectado a ella. Una máscara de subred 255.255.255.0, como la de la variable de su programa, indica que en la dirección 192.168.1.99, la red está formada por los dígitos 192.168.1 y el servidor web es el dispositivo número 99 dentro de dicha red.

IPAddress ip(192, 168, 1, 99); IPAddress gateway(192, 168, 1, 1); IPAddress subnet(255, 255, 255, 0);

La última variable representa el servidor web que han creado perteneciente a la clase WiFiServer. Éste atenderá las peticiones de los clientes por el puerto 80.

WiFiServer servidorWeb(80);

En el bloque setup() realizarán las mismas operaciones de conexión a la red WiFi que en la práctica del cliente pero, además, arrancarán el servidor web.

servidorWeb.begin();

En el bucle loop() lo primero que harán es ver si el servidor web tiene algún cliente conectado. Para ello utilizarán el método available(), que, de haberlo, devolverá dicho cliente como un objeto de la clase WiFiClient (clienteWeb). En ese caso, la condición de la sentencia if se evaluaría como true y esperaría a recibir la petición que quisiera hacerle. Si no hubiera ningún cliente, el método available() devolvería null y la condición no se cumpliría.

El bloque de control while asegura, utilizando el método connected() del cliente, que este siga conectado mientras se lee la información transmitida. Sabrán que hay datos pendientes de ser leídos mientras el método available() del cliente (utilizado en la condición if) devuelva true. La lectura de la petición realizada por el cliente se hará carácter a carácter con el método read().

Dicha lectura finalizará cuando se encuentre una línea en blanco (lineaEnBlanco), es decir, cuando se cumpla la condición del siguiente if.

El valor de la variable lineaEnBlanco vendrá determinado por las siguientes sentencias (la estructura de los mensajes de solicitud se estudia en detalle más adelante).

Finalizada la lectura del mensaje de solicitud, solo queda enviar, línea a línea, la respuesta al cliente con el método println