¿Qué aprenderá?
¿Qué hará?
¿Cuáles son los prerrequisitos?
Conexión a internet.
Este tutorial ha sido construido para que el estudiante se familiarice con el funcionamiento de los dispositivos físicos desplegados en la Capa de Dispositivos de un Sistemas IoT. El tutorial brinda una guía para realizar el montaje y configuración de un sistema de monitoreo y actuación que le permitirá capturar los datos de dos variables físicas (temperatura y humedad) y realizar en primera instancia un control local de un actuador (led) y posteriormente realizar dicho control de manera remota. Por último, aprenderá a conectar el dispositivo IoT a Internet con la finalidad de poder realizar el almacenamiento de los datos recogidos para un posterior análisis.
En este punto es importante resaltar que las prácticas fueron desarrolladas utilizando un kit OSOYOO NodeMCU IOT Starter kit; sin embargo los dispositivos incluidos en el kit o los comprados por aparte pueden variar levemente en su manera de conexión; por tanto no se puede garantizar que al desarrollar esta práctica todo estará exactamente igual a cuando se elaboró el tutorial. Esta es una realidad que se vive en el desarrollo de los proyectos de IoT y es muy importante desarrollar la habilidad de adaptarse a estos posibles cambios; así que los invitamos a que estén preparados para buscar información adicional que les permita llevar a buen término el trabajo propuesto. El equipo docente estará pendiente para ayudarlos.
NodeMCU ESP8266 es una plataforma de desarrollo similar a Arduino especialmente orientada al Internet de las cosas (IoT). La plataforma ESP8266 permite el desarrollo de aplicaciones en diferentes lenguajes como Arduino, Lua, MicroPython, C/C++, Scratch.
La distribución de las entradas y salidas del Node MCU V3 se especifican a continuación:
Figura 1. Tarjeta de desarrollo ESP-12E
Como se ve en la Figura 1, hay dos nomenclaturas para nombrar los pines: los que aparecen marcados en la placa (Dx) y el nombre asociado a cada pin del propio ESP8266 (GPIOx).
Pines digitales de NodeMCU: se utilizan para enviar y recibir datos, controlando la entrada y salida de la placa. Para dicho propósito, es recomendable utilizar solamente los pines digitales del D0 al D8, ya que los demás pueden estar reservados para otras funciones, lo cual puede ocasionar interferencias a la hora de cargar un programa.
Pin analógico de NodeMCU: a diferencia de los pines digitales que solo admiten dos valores, el pin analógico maneja un rango de valores que viene determinado por la resolución del Conversor Analógico Digital. El NodeMCU maneja solo un pin analógico (A1) que admite un rango de valores de 0 a 3,3V con una resolución de 10-bit. Esto implica que dentro del código se pueden manejar valores entre 0 y 1023, mapeados con el voltaje entre 0 y 3,3V.
Pines de alimentación de NodeMCU: tienen como función alimentar sensores y componentes. Estos están marcados como "3V3" en la placa.
Pines de tierra: son denominados "GND" en la placa y hacen la función de tierra en el circuito eléctrico.
A continuación se presentan los pasos requeridos para instalar y configurar las herramientas necesarias para el desarrollo del tutorial.
Use el cable USB para conectar el NodeMCU a la computadora, verá que el LED azul integrado parpadea cuando se enciende, pero no permanecerá encendido.
La nueva versión NodeMCU v1.0 incluye el chip serial CP2102. Puede descargar driver en el sitio web de Silicon Labs. Siga las instrucciones de instalación adjuntas con el driver.
Puede descargar el IDE de Arduino en el sitio web de Arduino. Siga las instrucciones de instalación disponibles en el sitio web.
En el IDE de Arduino, diríjase a "
File–>Perferences–>Settings
"; luego, en el campo "A
dditional boards manager URLs
", pegue el siguiente recurso http://arduino.esp8266.com/stable/package_esp8266com_index.json. Haga clic en "
Ok
" (Ver Figura 2).
A continuación, en el IDE de Arduino, diríjase a "Tools-> Board-> BoardsManager
". En el campo de búsqueda, ingrese "esp8266
". Deberá ver un módulo denominado "esp8266 by esp8266 Community
". Seleccione la última versión y haga clic en instalar (Ver Figura 3). Finalmente, reinicie el IDE.
Figura 2. Especificación del paquete ESP8266
Figura 3. Instalación del paquete ESP8266
Diríjase a "
Tools->Board
" y seleccione el módulo "NodeMCU 1.0
" como se puede observar en la Figura 4.
Figura 4. Selección del módulo de la tarjeta
Para el desarrollo de este tutorial utilizaremos el IDE de Arduino, a continuación se dará una breve explicación de la estructura de un programa en Arduino, el monitor serial, y el despliegue del programa en el dispositivo.
Los programas de Arduino están compuestos por un solo fichero con extensión ".ino"
, que presentan la siguiente estructura:
A continuación se muestra la estructura básica de un programa en Arduino:
// Código que se repite solamente una vez
// Inicialización de librerías
// Declaración de variables
void setup() {
// Código que se repite solamente una vez
// Declaración de pines y apertura de la comunicación serial
}
void loop() {
// Código ejecutado en continuación
}
El siguiente código presenta una implementación de la estructura vista a manera de ejemplificación.
int i=0;
void setup(void)
{
Serial.begin(9600);
}
void loop() {
i=i+2;
i=i-1;
Serial.println(i);
delay(1000);
}
El monitor serial es la ventana para la comunicación entre Arduino y el ordenador, que se hace a través del cable USB; este permite enviar y recibir mensajes de texto, útiles para la depuración y también control de Arduino.
El monitor se puede acceder a través del botón "Serial Monitor
" de la interfaz del IDE, como se puede ver en la Figura 5.
Figura 5. Monitor serial en el IDE de Arduino
El monitor serial dispone de los siguientes métodos:
Para compilar y verificar errores de sintaxis, haga clic en el botón "Verify
" (). En caso de que su programa presente un error, este será indicado en la consola del IDE.
Para desplegar el código al NodeMCU, haga clic en el botón "Upload
" (). Una vez se complete el despliegue, para verificar el funcionamiento del programa en el dispositivo acceda a la visualización del monitor serial.
El objetivo de este apartado es presentar cómo se puede controlar localmente y de forma remota un actuador a partir de la señal capturada por un sensor. Se trata de un sistema automático ya que es el dispositivo el que prende y apaga el actuador y no un controlador que toma la decisión basándose en heurísticas.
Los jumpers son cables que permiten hacer la conexión entre dos dispositivos, cerrando el circuito eléctrico entre estos. Existen diversos tipos de cables de conexión que se pueden utilizar en el desarrollo del prototipo, a continuación se presentan algunos de estos:
Figura 6. Cable jumper tipo macho-macho
Figura 7. Cables jumper tipo hembra-hembra
Figura 8. Cables jumper tipo macho-hembra
El DHT11 es un sensor digital que permite medir la temperatura (en un rango de 0 ºC a 50 ºC) y la humedad relativa (con un rango de 20% RH a 90% RH). Existen dos versiones de dicho sensor: una con 4 pines y otra con 3 pines. En cualquier caso, si se mira el sensor con los pines hacia abajo, el primero corresponde a alimentación, el segundo a datos y el último a tierra, tal como se muestra en la Figura 9.
Figura 9. Sensor DHT11
A continuación se presenta el esquema de control local a implementar en este tutorial, este control busca controlar localmente un actuador (diodo LED) a partir de la señal capturada por un sensor de temperatura y humedad (DHT11).
El esquema de control inicia a partir de un evento físico captado por un sensor, cuyos datos digitalizados son enviados a la computadora a través del controlador, teniendo en cuenta las reglas definidas en el computador se genera un código de control el cual es enviado al controlador y este a su vez genera una acción sobre el actuador; es importante resaltar en este punto que la alimentación del controlador está proveída por la computadora (ver Figura 10).
Figura 10. Esquema de control local
A continuación se especifican los pasos a seguir para implementar el esquema de control anteriormente descrito.
Para el presente tutorial se va a utilizar un diodo LED como actuador. Para ello, conecte el LED a la protoboard; posteriormente conecte, también en la protoboard, una resistencia de 220 Ω haciendo coincidir uno de los terminales con el ánodo del led (terminal larga) imagen. Finalmente, utilizando dos jumpers macho - hembra conecte el cátodo del led (terminal corta) al pin GND del NodeMCU y el otro terminal de la resistencia al pin D1 del NodeMCU, como se puede observar en la Figura 11.
Figura 11. Conexión del LED
A continuación, conecte el sensor DHT11 al NodeMCU de la siguiente manera, utilizando los jumpers hembra-hembra conecte el primer pin de alimentación del sensor (VCC) al pin 3V3 del nodeMCU, el pin de datos (DATA) del sensor conéctelo con el pin D2 del NodeMCU, y el pin de tierra (GND) del sensor conéctelo con un pin GND del NodeMCU. Por último, coloque una resistencia pull-up de 10KΩ entre VCC y la línea de datos para mantenerla ALTA para una correcta comunicación entre el sensor y la NodeMCU. (Ver Figura 12)
Figura 12. Conexión del sensor DHT11
Copie y pegue el siguiente código en el IDE de Arduino:
#include "DHT.h"
#define DHTTYPE DHT11 // DHT 11
#define dht_dpin 4
DHT dht(dht_dpin, DHTTYPE);
#define LED D1 // LED
int ValueRead=2;
int myflag=0;
void setup()
{
Serial.begin(9600);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW); //LED comienza apagado
}
void loop()
{
if (Serial.available()){
ValueRead=Serial.parseInt();
}
if (((ValueRead==1 && myflag==0)|| myflag==1)&!(ValueRead==2 && myflag==1)){
digitalWrite(LED, HIGH); // Se prende el LED
Serial.println("Prendido");
myflag=1;
}
else{
digitalWrite(LED, LOW); // Se apaga el LED
Serial.println("Apagado");
myflag=0;
}
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Current humidity = ");
Serial.print(h);
Serial.print("% ");
Serial.print("temperature = ");
Serial.print(t);
Serial.println("C ");
}
Digite 1 en el monitor serial y revise que el LED se prenda; posteriormente escriba 2 para apagarlo.
Ahora se pretende controlar remotamente el actuador del sistema (diodo LED) a partir de la señal capturada por el sensor (DHT11). Para este fin debemos modificar el esquema de control local propuesto anteriormente de manera que el controlador se conecte utilizando el protocolo 802.11 (WiFi) a Internet. Para tal fin se debe conectar el controlador a una batería para garantizar su alimentación y realizar la configuración de conectividad en el código fuente que se ejecutará en el controlador.
Figura 15. Esquema de control remoto en etapa de despliegue
A continuación se especifican los pasos a seguir para implementar el esquema de control anteriormente descrito (los videos presentados al inicio de este tutorial pueden guiarlo con algunos aspectos técnicos):
#include <ESP8266WiFi.h>
#include "DHT.h"
#define DHTTYPE DHT11 // DHT 11
const char* ssid = "INVERCIONES.GILALF";
const char* password = "Rafa0524";
#define LED D1 // LED
// DHT Sensor
uint8_t DHTPin = 4;
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);
float Temperature;
float Humidity;
WiFiServer server(80);
void setup() {
Serial.begin(115200);
delay(10);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW); //LED apagado
// Connect to WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
Temperature = dht.readTemperature(); // Gets the values of the temperature
Humidity = dht.readHumidity(); // Gets the values of the humidity
// Check if a client has connected
WiFiClient client = server.available();
if (!client) {
return;
}
// Wait until the client sends some data
Serial.println("new client");
while(!client.available()){
delay(1);
}
// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Match the request
int value = HIGH;
if (request.indexOf("/LED=ON") != -1) {
digitalWrite(LED, HIGH);
value = HIGH;
}
if (request.indexOf("/LED=OFF") != -1) {
digitalWrite(LED, LOW);
value = LOW;
}
// Return the response
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // do not forget this one
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("LED is now: ");
if(value == LOW) {
client.print("Off");
} else {
client.print("On");
}
client.println("<br><br>");
client.println("<a href=\"/LED=ON\"\"><button>Turn On </button></a>");
client.println("<a href=\"/LED=OFF\"\"><button>Turn Off </button></a><br />");
client.println("</html>");
client.println("<br><br>");
client.print("Temperature: ");
client.print(Temperature);
client.print("C");
client.println("<br><br>");
client.print("Humidity: ");
client.print(Humidity);
client.print("%");
delay(1);
Serial.println("Client disconnected");
Serial.println("");
}
ssid
y password
, ubicadas al inicio del código, con el nombre y la contraseña de la red wifi que va a utilizar.Serial.begin(115200);
" Para poder visualizar la información en el monitor serial, asegúrese de configurarlo en 115.200 baudios en la parte de abajo a la derecha.Finalmente se quiere enviar los datos capturados a un sistema web que permita realizar el monitoreo de los datos en el tiempo. Para este fin, se conectará el esquema de control propuesto al sistema REMA, con la finalidad de visualizar los datos recogidos de forma estructurada, con el fin de analizarlos posteriormente; es decir, procesarlos para soportar la toma de decisiones.
A continuación se especifican los pasos a seguir para implementar el esquema de monitoreo anteriormente descrito:
ssid
y password
, ubicadas al inicio del código, con el nombre y la contraseña de la red wifi que va a utilizar.HOSTNAME
y MQTT_USER
por su usuario uniandes (sin @uniandes.edu.co). MQTT_PASS
por la contraseña de MQTT la cual debe ser su código de estudiante Uniandes.Figura 16. Ejemplo de código para la ciudad Bogotá en Arduino.
Al finalizar este tutorial, se espera que haya aprendido a realizar la configuración de una placa de desarrollo IoT (NodeMCU) para poder capturar los valores de variables físicas, realizar la configuración de una actuación en el sistema y transmitir los datos capturados a un sistema de almacenamiento en la nube.
Barbieri G, Rosas A, España A., Sanchez-Londoño D. (2022) A Taxonomy for Levels of Automation based on the Industrial Revolutions. IFAC-PapersOnLine (ISSN 2405-8963) - (-), pp. ---.
Descripción del problema | Ideas de solución |
El monitor Arduino muestra que los datos se están enviando pero no se ven en la pantalla de datos en tiempo real de REMA | Verificar que la URI del tópico esté especificada como sigue: <<variable>>/<<ciudad>>/<<usuario uniandes>> |
No puede acceder a REMA porque no es un usuario registrado | Contactar al equipo docente |
El monitor muestra valores NaN |
|
Giacomo Barbieri Carlos Andrés Lozano Garzón | Autores |
Kelly Garcés Andrés Bayona Rocío Héndez | Revisores |