Utilização de NodeMCU em projetos IoT
Desde o princípio a tecnologia vem passando por crescente transformação. O que antes eram computadores gigantes que ocupavam salas inteiras apenas para fazer simples cálculos, se transformou em dispositivos indispensáveis para o dia-a-dia. São eles: celulares, notebooks, o computador de bordo do carro, a TV smart, o aspirador de pó inteligente, entre muitos outros. Esta grande massa de dispositivos geralmente está conectada à internet. Mas você já parou para pensar como isso funciona? Quais dispositivos podem ser conectados? Eu posso montar um projeto IoT? Aí está mais uma palavra que ouvimos muito hoje em dia. IoT significa Internet of Things (Internet das Coisas), que podemos entender como coisas conectadas na internet.
Já é possível termos um sistema de aquecimento que altera a temperatura de acordo com o clima, ou um medidor que avisa quando o gás está acabando. Para você que gosta de tecnologia, assim como eu, e quer conectar seu projeto na internet, este post é para você. Vamos falar sobre uma placa chamada NodeMCU, que pode ser conectada no Wi-Fi e é de fácil usabilidade.
O que é?
Antes de falar sobre a NodeMCU precisamos entender o que é módulo ESP-8266. Este módulo é fabricado pela Espressif Systems e contém vários elementos poderosos como CPU, RAM e Wi-Fi. A parte ruim é que para utilizá-lo, você precisa programá-lo enviando comandos com instruções de máquina de baixo nível. É aí que entra a NodeMCU.
A NodeMCU (Node MicroController Unit) é uma placa, criada para facilitar o desenvolvimento com o módulo ESP-8266. Ela já possui vários componentes que facilitarão sua vida: reguladores de tensão, leds, botão de reset, interface Serial-USB. Além disso, é possível fazer upload de sketchs do Arduino.
Como a placa tem acesso à internet, é possível fazer OTA (Over the Air) Upload, o que significa que você pode utilizar a rede Wi-Fi para atualizar o firmware da NodeMCU.
Abaixo, as principais características:
- Processador ESP8266-12E
- Arquitetura RISC de 32 bits
- Processador pode operar em 80MHz / 160MHz
- 4Mb de memória flash
- 64Kb para instruções
- 96Kb para dados
- Wi-Fi nativo padrão 802.11b/g/n
- Opera em modo AP, Station ou AP + Station
- Pode ser alimentada com 5VDC através do conector micro USB
- Possui 11 pinos digitais
- Possui 1 pino analógico com resolução de 10 bits
- Pinos digitais, exceto o D0, possuem interrupção, PWM, I2C e one wire
- Pinos operam em nível lógico de 3.3V
- Pinos não tolerantes a 5V
- Possui conversor USB Serial integrado
- Programável via USB ou WiFi (OTA)
- Compatível com a IDE do Arduino
- Compatível com módulos e sensores utilizados no Arduino
Como utilizar
A utilização da NodeMCU é muito simples. Neste exemplo vamos utilizar o Platform.IO, que é uma plataforma para desenvolvimento de dispositivos embarcados. Antes de utilizar, você precisará instalar o Visual Studio Code, que é uma IDE muito utilizada hoje em dia por desenvolvedores. Aqui você encontra o passo a passo para instalar em seu computador.
Utilizando como Access Point
Um access point (ponto de acesso) é um dispositivo de rede usado no qual podemos nos conectar como se fosse um roteador wi-fi. Para utilizar a NodeMCU dessa maneira, precisaremos de duas bibliotecas: ESP8266WiFi.h e ESP8266WebServer.h. Por padrão, no Platform.io estas libs já estão instaladas.
Segue um código de exemplo que comanda dois leds de cores diferentes por meio de uma página web disponibilizada pelo access point da NodeMCU:
#include "Arduino.h"
#include "ESP8266WiFi.h"
#include "ESP8266WebServer.h"
#define PIN_LED_GREEN D4
bool ledGreenIsOn = false;
#define PIN_LED_RED D5
bool ledRedIsOn = false;
// declare server with port 80
ESP8266WebServer server(80);
// server main page html
const char serverPage[] PROGMEM = R"=====(
<html>
<button onclick="toggleLed('green')">
toggle GREEN led
</button>
<button onclick="toggleLed('red')">
toggle RED led
</button>
<script>
function toggleLed(led) {
console.log(`toggle led ${led}`);
fetch("/toggleLed", {
method: 'POST',
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: `led=${led}`
});
}
</script>
</html>
)=====";
void setup()
{
Serial.println(115200);
Serial.println("init wi-fi ap mode...");
// init pins
pinMode(PIN_LED_GREEN, OUTPUT);
pinMode(PIN_LED_RED, OUTPUT);
// set wifi mode
WiFi.mode(WIFI_AP);
// define wifi configs
IPAddress ip(10, 0, 0, 1);
IPAddress gateway(10, 0, 0, 254);
IPAddress subnet(255, 255, 255, 0);
// set wifi configs
WiFi.softAPConfig(ip, gateway, subnet);
// init access point
bool result = WiFi.softAP("My Network", "12345678");
Serial.printf(result ? "Ready" : "Failed");
Serial.println(WiFi.softAPIP());
// define server routes
server.on("/", HTTP_GET, []() {
server.send(200, "text/html", serverPage);
});
server.on("/toggleLed", HTTP_POST, []() {
String led = server.arg("led");
Serial.println("toggle led \"" + led + "\"");
uint8_t pinLed;
bool state = false;
if (led == "green")
{
pinLed = PIN_LED_GREEN;
ledGreenIsOn = !ledGreenIsOn;
state = ledGreenIsOn;
}
else if (led == "red")
{
pinLed = PIN_LED_RED;
ledRedIsOn = !ledRedIsOn;
state = ledRedIsOn;
}
digitalWrite(pinLed, state);
server.send(200, "application/json", "{\"ok\":true}");
});
// init server
server.begin();
}
void loop()
{
server.handleClient();
}
Utilizando como Station
O modo station faz com que a NodeMCU se comporte como um outro dispositivo (celular, computador etc) conectado na rede. Assim é possível, por exemplo, fazer requisições HTTP para um servidor hospedado na web.
No exemplo vamos utilizar um LDR (Light Dependent Resistor). Segue o esquema se você quiser montar com sua NodeMCU:
O código de exemplo irá, a cada segundo, fazer uma requisição enviando a intensidade de luz no local:
#include "Arduino.h"
#include "ESP8266WiFi.h"
#include "ESP8266WiFiMulti.h"
#include "ESP8266HTTPClient.h"
#define PIN_LDR A0
ESP8266WiFiMulti wiFiMulti;
HTTPClient http;
void setup()
{
Serial.println(115200);
Serial.println("init wi-fi station mode...");
// init pins
pinMode(PIN_LDR, INPUT);
// set wifi mode
WiFi.mode(WIFI_STA);
// connect to wi-fi network
wiFiMulti.addAP("<network ssid>", "<network password>");
// wait for connection
int count = 0;
while (wiFiMulti.run() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
if (count >= 20)
{
Serial.println("wi-fi connection time out");
return;
}
count++;
}
Serial.print("\nConnected as ");
Serial.println(WiFi.localIP());
}
void loop()
{
// run every 1000 miliseconds
if (millis() % 1000 == 0)
{
int ldrValue = analogRead(PIN_LDR);
float lightPercentage = 100 / 1024 * ldrValue;
if (WiFi.isConnected())
{
String url = "<api end-point>";
// init url
http.begin(url);
Serial.println("[HTTP] begin in " + url);
// add headers
http.addHeader("Content-Type", "application/json");
// define json body
String body = "";
body += "{";
body += "\"lightPercentage\": " + String(lightPercentage) + ",";
body += "}";
Serial.println("[HTTP] request body: " + body);
// make http post
int httpCode = http.POST(body);
if (httpCode > 0)
{
Serial.println("[HTTP] POST " + String(httpCode));
String response = http.getString();
Serial.println("[HTTP] response: " + response);
}
else
{
Serial.println("[HTTP] POST failed, error: (" + String(httpCode) + ") " + http.errorToString(httpCode));
}
// end http
http.end();
}
else
{
Serial.println("wi-fi not connected");
}
}
}
Considerações finais
A NodeMCU é uma excelente opção para ser utilizada em um projeto que necessita acesso à internet. A utilização é muito simples, o que proporciona um desenvolvimento bastante ágil. O preço médio fica um pouco acima o que um Arduino ou outra placa semelhante, mas o valor agregado do produto supera o seu preço.
Fontes
CURVELLO, André. Apresentando o módulo ESP8266. Embarcados. Disponível em: https://www.embarcados.com.br/modulo-esp8266. Acesso em 20 de junho de 2020.
GARRETT, Filipe. O que é access point? Veja para que serve o ponto de acesso de Wi-Fi. Embarcados. Disponível em: https://www.techtudo.com.br/noticias/2018/06/o-que-e-access-point-veja-para-que-serve-o-ponto-de-acesso-de-wi-fi.ghtml. Acesso em 20 de junho de 2020.
MURTA, Gustavo. NodeMCU – ESP12: Guia completo – Introdução (Parte 1). Blog Eletrogate. Disponível em: https://blog.eletrogate.com/nodemcu-esp12-introducao-1. Acesso em 20 de junho de 2020.
OLIVEIRA, Greici. NodeMCU – Uma plataforma com características singulares para o seu projeto ioT. Embarcados. Disponível em: https://blogmasterwalkershop.com.br/embarcados/nodemcu/nodemcu-uma-plataforma-com-caracteristicas-singulares-para-o-seu-projeto-iot. Acesso em 20 de junho de 2020.
YUAN, Michael. Conhecendo o NodeMCU e sua placa DEVKIT. IBM. Disponível em: https://www.ibm.com/developerworks/br/library/iot-nodemcu-open-why-use. Acesso em 20 de junho de 2020.
ESP8266. Espressif. Disponível em: https://www.espressif.com/en/products/socs/esp8266/overview. Acesso em 20 de junho de 2020.
Sensor de Luminosidade LDR 5mm. Filipe Flop. Disponível em: https://www.filipeflop.com/produto/sensor-de-luminosidade-ldr-5mm. Acesso em 20 de junho de 2020.
Como a tecnologia impacta nossas vidas?. Toikos Blog. Disponível em: http://toikos.com.br/blog/post/tecnologia. Acesso em 20 de junho de 2020.
Casas Inteligentes: como faço minha casa mais inteligente?. Toikos Blog. Disponível em: http://toikos.com.br/blog/post/casas-inteligentes-como-fao-minha-casa-mais-inteligente. Acesso em 20 de junho de 2020.