NodeMCU nuestro gran aliado en IoT

¿IoT por 2€? Si quisiéramos desarrollar soluciones para interactuar con elementos fisicos seguramente nos vendría a la cabeza Arduino. Si quisiéramos darle conectividad por WiFi se nos complica el asunto… ¿Te imaginas una solución un 90% más barata que Arduino para jugar y desarrollar nuestras propias soluciones IoT?

Os lo presento, aquí tenemos NodeMCU.

Historia

En el año 2013, el fabricante de microcontroladores espressif creó el microchip ESP8266 con un módulo WiFi integrado y con compatibilidad con el protocolo TCP/IP. El objetivo del ESP8266 era dar acceso a cualquier microcontrolador a la red.

Poco tiempo después, su uso se extendió y se empezó a utilizar como alternativa al Shield WiFi oficial de Arduino.

¿Su ventaja? Su precio. Proveer de WiFi un Arduino puede variar entre 1.3€ vs 26.5€ en función de qué shield/módulo montemos.

¿Su gran ventaja? El bajo consumo de electricidad del ESP8266 lo hace un módulo ideal para weareables y dispositivos IoT.

ESP-01 con el microchip ESP8266

Con el ESP8266 el fabricante AI-Thinker lanzó al mercado diferentes módulos que tenían como “core” el ESP8266. Desarrolló diferentes series “ESP-” con la finalidad de ofrecer diferentes usos. Un ejemplo, es el que podemos ver en la imagen, el ESP-01.

El ESP-01 “juega” con tener memoria flash integrada de manera que además de funcionar como un complemento de Arduino, el ESP-01 puede ser autónomo y tener su propio código. Puede ser utilizado para soluciones independientes pequeñas. Podemos encontrarlo por un precio muy económico (1.3€).

En los diferentes modelos diseñados por AI-Thinker nos centraremos en el ESP-12, este fue el modelo TOP de la compañia (actualmente está siendo desbancado una evolución muy potente llamada ESP-32).  El ESP-12 dispone de hasta 11 puertos GPIO (General Purpose Input/Output) con la “gracia” de que las entradas tienen una resolución de 10 bits (1024 valores posibles) que permiten simular y leer diferentes rangos de entrada o bien emitir diferentes valores de salida.

Entonces… ¿Qué hacemos con un microchip?

IMG_20200524_115409

Es el turno NodeMCU. Originalmente NodeMCU era el nombre del Firmware aunque con el tiempo la gente se refiere a NodeMCU a la placa electrónica. NodeMCU está basado en el ESP-12 y está pensado para que podamos desarrollar diferentes proyectos (ambiciosos o no) de forma fácil. 

El interfaz microUSB integrado en su placa simplifica “subir” código.  El código de programación es LUA pero actualmente puedes programar el NodeMCU a través de la suite de Arduino gracias a diferentes librerías muy fáciles de instalar.

Se puede encontrar por 1.7-2.5 euros en diferentes tiendas.

Con NodeMCU puedes lanzarte a desarrollar tus propios programas/soluciones con conectividad a la red. Montar tu propio “IoT”.

Utilidades

NodeMCU no deja de ser una placa electrónica de desarrollo, este hecho provoca que existan una infinidad de aplicaciones a implementar (mi opinión, puedes implementar cualquier idea).

Sus 11 entradas/salidas permiten integrar diferentes tipos de sensores (temperatura, humedad, PIR, on/off…) junto con una infinidad de actuadores (relés, leds, emisor de sonidos, emisor de RF…). 

Una de las ventajas de NodeMCU frente a un Arduino normal es el hecho de tener conexión WiFi. Con NodeMCU seremos capaces de levantar un punto de acceso para tener clientes conectados, por otro lado podemos conectar el NodeMCU en una red WiFi existente o incluso crear una red de nodos tipo malla.

En esta publicación veremos como levantar un servidor WEB en el NodeMCU para leer la temperatura de un sensor. En un futuro me gustaría enseñar la integración del NodeMCU con Hassio utilizando el protocolo MQTT.

IMG_20200525_191812

En las imágenes superiores podemos observar diferentes pruebas realizadas con diferentes NodeMCU. Lector RFID, emisor y receptor de RF, sensor de temperatura. 

¿Cómo preparamos nuestro entorno?

El NodeMCU se puede utilizar y programar de diferentes maneras. En mi caso me centraré en aprovechar el IDE de arduino para poder programar el NodeMCU.

Actualmente podemos descargar el IDE de Arduino del siguiente enlace:

Instalado el IDE de Arduino en nuestro ordenador, es necesario añadir la tarjeta de NodeMCU en el IDE ya que por defecto no hay compatibilidad. Para hacerlo es necesario ir a las preferencias del IDE y añadir el siguiente enlace en el “Gestor de Tarjetas adicionales”.

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Añadida la URL en el Gestor de Tarjetas adicionales podremos “instalar” la tarjeta NodeMCU en nustro IDE.

A continuación podremos observar las capturas de pantalla a seguir para tener la compatibilidad con el NodeMCU.

Consejo: Instalad la versión 1.5, he detectado problemas en la función attachinterrput() en las versiones más nuevas.

En este punto se debe seleccionar la version 2.5.0

Instalada la placa NodeMCU podremos seleccionar la placa en Herramientas > Placa

Ejemplo:

Lector de temperatura en WebServer

En la captura anterior podemos ver el resultado final. Un WebServer que indica la temperatura y la humedad. En la captura de la derecha podemos ver la Consola de Arduino.

  • Elementos necesarios para nuestro ejemplo:
  • NodeMCU
  • Cable MicroUSB
  • Sensor DHT11 o DHT22 (si no hay un resistor incorporado en la placa se debe añadir: ej 4.7KΩ
  • Placa protoboard y 3 cables
 
Para la realización de este ejemplo es necesario instalar las siguientes dos librerías en el Gestor de Librerías:
 
  • DHT sensor library  (by Adafruit)
  • Adafruit Unified Sensor (by Adafruit)
 

A continuación adjuntaré el código utilizado para este ejemplo.

Comentar:

  • En el pin D2 hemos conectado el pin Data del sensor DHT.
  • En el pin 3V hemos conectado el pin VCC del sensor DHT
  • En el pin GND hemos conectado el pin GND del sensor DHT
IMG_20200607_203142
// Load Wi-Fi library
#include
#include
#include "DHT.h"

// DHT sensor definition (Temperature sensor)
#define DHTTYPE DHT11 // DHT 11

// Replace with your network credentials
const char* ssid = "Your SSID";
const char* password = "Your WiFi password";

// Replace with your configuration if you don't want static IP, please comment next 3 lines
IPAddress ip(192, 168, 1, 236); // IP Static
IPAddress gateway(192, 168, 1, 1); // GateWay
IPAddress subnet(255, 255, 255, 0); // Subnet

// We just define WebServer
ESP8266WebServer server(80);

// Create DHT sensor in our case we've connected to D2 (GPIO4)
uint8_t DHTPin = 4;
DHT dht(DHTPin, DHTTYPE);

// Define variables to save values from sensors
float Temperature;
float Humidity;

// wifi config + start web server + declare DHT sensor
void setup()
{ Serial.begin(115200);
pinMode(DHTPin, INPUT);
dht.begin();
Serial.println(ssid);
WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{ delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected..!");
Serial.print("IP Server: ");
Serial.println(WiFi.localIP());

server.on("/", handle_OnConnect);
server.onNotFound(handle_NotFound);

server.begin();
Serial.println("HTTP server started");
}

void loop()
{
// Waiting clients
server.handleClient();
}

void handle_OnConnect()
{
delay(1000);
Temperature = dht.readTemperature(); // Read temp sensor
delay(1000);
Humidity = dht.readHumidity(); // Read hum sensor
Serial.println(Temperature);
Serial.println(Humidity);
server.send(200, "text/html", SendHTML(Temperature,Humidity));
}

void handle_NotFound()
{
server.send(404, "text/plain", "Not avaiable");
}
// Function to print Temp and Hum in our web server

String SendHTML(float Temperaturestat,float Humiditystat){
String ptr = "<!DOCTYPE html> <html>\n";
ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr +="<title>ESP8266 Weather Report</title>\n";
ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
ptr +="</style>\n";
ptr +="</head>\n";
ptr +="<body>\n";
ptr +="<div id=\"webpage\">\n";
ptr +="<h1>ESP8266 Weather Report</h1>\n";
ptr +="<p>Temperature: ";
ptr +=(float)Temperaturestat;
ptr +=" C</p>";
ptr +="<p>Humidity: ";
ptr +=(float)Humiditystat;
ptr +="%</p>";
ptr +="</div>\n";
ptr +="</body>\n";
ptr +="</html>\n";
return ptr;

Con NodeMCU se pueden hacer maravillas, siempre va a depender de nuestra imaginación.

Cualquier duda no dudéis en contactar conmigo.

Jordi Auladell

 

07/06/2020