É uma placa de desenvolvimento que combina o chip ESP8266, uma interface usb-serial e um regulador de tensão 3.3V. A programação pode ser feita usando a linguagem LUA ou a IDE do Arduino, utilizando a comunicação via cabo micro-usb.
Especificações
Módulo: NodeMcu Lua ESP-12.
Wifi: Wireless padrão 802.11 b/g/n com antena embutida.
Conector: micro-usb.
Modos de operação: STA/AP/STA+AP.
Conexões TCP/IP: suporta 5 conexões.
Portas GPIO: 11 (Com funções de PWM, I2C, SPI, etc.)
Tensão de operação: 4,5 ~ 9V.
Taxa de transferência: 110-460800bps.
Firmware: suporta upgrade remota.
Distância entre pinos: 2,54mm.
Dimensões: 49 x 25,5 x 7 mm.
Pinagem
Biblioteca
O Módulo Wifi ESP8266 NodeMCU pode ser programado usando Lua ou na linguagem padrão do Arduino com a mesma IDE. Para tanto, a partir de 2016 a Arduino IDE foi adaptada para o ESP8266. Hoje existem inúmeras bibliotecas que já foram adaptadas e muitas aplicações já estão disponíveis. O link GitHub ESP8266 Arduino é o Repositório para ESP8266/Arduino, onde estão as Bibliotecas, códigos de exemplos e todos outros arquivos necessários para usar a Arduino IDE com o ESP8266.
Configuração da IDE do Arduino para o NodeMCU
Na Arduino IDE altere as preferências do sistema adicionando a URL "http://arduino.esp8266.com/stable/package_esp8266com_index.json" aos Gerenciadores de Placas da IDE. Após, é necessário instalar a placa através do Gerenciador de Placas (Menu » Ferramenta » Placa ... » Gerenciador de Placas). Procure na lista o título "esp8266 by ESP8266 Community" e instale.
O que é um Servidor Web?
Um computador responsável por fornecer e receber dados dos diversos clientes, atuando como centralizador de informação na Rede. Para tanto, utiliza um conjunto de protocolos de comunicação entre computadores chamado de TCP/IP (Protocolo de controle de transmissão): TCP (Transmission Control Protocol) e IP (Internet Protocol).
A relação Servidor/Cliente
A relação entre os computadores que hospedam sites (Servidores) e os navegadores que utilizamos em nossos computadores ou celulares (Clientes) é chamada de Servidor/Cliente. Neste tipo de relação, utiliza-se o procotolo o HTTP (Hypertext Transfer Protocol) para estabelecer a comunicação. Ele é responsável pelo tratamento dos pedidos e respostas entre cliente e servidor na World Wide Web. Nesse contexto, chamamos os servidores de Servidores Web.
/*
Programa: Servidor Web para uma estação Metereológica com sensor DHT11
Autor: André Luis Marques da Silveira
Data: 22/09/2019
*/
#include "Wire.h" // Biblioteca para enviar e receber dados TWI/I2C
#include "Adafruit_GFX.h" // Biblioteca para processamento gráfico
#include "Adafruit_SSD1306.h" // Biblioteca do controlador SSD1306
#include "ESP8266WiFi.h"
#include <DHT.h>
#define DHTPIN D5
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display(128, 64); // Cria objeto display
const char* ssid = "NOME DO SERVIDOR";
const char* password = "SENHA DO SERVIDOR";
int porta = 80;
// --- Caso ocorra problemas com a porta 80, utilize 8082 ou 8089 ---- //
// --- A chamada, por exemplo fica: http://192.168.0.15:8082 ---- //
WiFiServer server(porta);
void setup() {
// --- Inicializa Sensor DHT11 ---- //
dht.begin(); // Inicializa biblioteca WIRE
Wire.begin(); // Inicializa biblioteca sensor DHT11
pinMode(DHTPIN, INPUT); // Define pino do Sensor DHT11
// ---- Inicializa tela Oled ---- //
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Inicializa a tela com endereço I2C "0x3C"
display.setTextColor(WHITE); // Define cor do texto
display.setRotation(0); // Configura orientação
display.setTextWrap(false);
display.setTextSize(1); // Define tamanho da fonte do texto
display.dim(0); // Define brilho (0 é máximo)
display.clearDisplay(); // Limpa a tela
display.drawRect(0,0,128,15,WHITE); // Posição (x0,y0,x1,y1)
display.setCursor(4,4); // Posição do cursor na tela
display.print("Rede:"); // Escreve texto no display
display.println(ssid); // Escreve no da Rede Wifi
display.display(); // Mostra texto no display
// ---- Inicializa serial ---- //
Serial.begin(9600);
Serial.print("Conectando a rede Wifi ");
Serial.println(ssid); // Escreve nome da Rede Wifi na Serial
// --- Conecta Rede Wifi ---- //
int a = 0;
WiFi.begin(ssid, password); // Passa parâmetros para fazer conexão com a Rede sem fio
while (WiFi.status() != WL_CONNECTED) { // Testa status da conexão
a = a + 1;
if (a < 60) {
Serial.print(".");
} else {
Serial.println(".");
a = 0;
}
delay(100);
}
Serial.println("Conectado a rede");
Serial.println("");
Serial.println("Servidor iniciado");
// ---- Inicia Servidor Web para receber dados em "WiFiServer server(porta)" ---- //
server.begin();
// ---- Escreve na serial o IP recebido da rede sem fio (AUTOMÁTICO) ---- //
Serial.print("IP para se conectar ao NodeMCU: ");
Serial.print("http://");
Serial.println(WiFi.localIP());
// ---- Escreve na tela Oled o IP recebido da rede sem fio (AUTOMÁTICO) ---- //
display.setCursor(0,25);
display.print("IP:");
display.print(WiFi.localIP());
display.print(":");
display.println(porta);
display.display();
}
void loop() {
WiFiClient client = server.available(); // Verifica se algum cliente está conectado ao servidor
if (!client) { // Cliente não conectado, reexecuta processo
delay(10);
return;
}
// --- lê sensor DHT11 - temperatura e umidade --- //
float h = dht.readHumidity(); // Temperatura em Celsius
float t = dht.readTemperature(); // Temperatura em Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
Serial.println("Novo cliente se conectou!");
Serial.print(" Temperatura: ");
Serial.print(t);
Serial.print(" Umidade: ");
Serial.println(h);
display.fillRect(0,40,128,64,BLACK); // fillRect(x,y,width,height,color)
display.setCursor(11,42); // Posição do cursor na tela
display.print("Temperatura:"); // Escreve texto no display
display.setCursor(85,42); // Posição do cursor na tela
display.print(t); // Escreve texto no display
display.setCursor(24,52); // Posição do cursor na tela
display.print("Umidade:"); // Escreve texto no display
display.setCursor(76,52); // Posição do cursor na tela
display.print(h); // Escreve texto no display
display.display(); // Mostra texto no display
// ---- Enquanto cliente estiver conectado aguarda 1 milisegundo ---- //
while(!client.available()){
delay(1);
}
String request = client.readStringUntil('\r'); // Faz leitura da primeira linha da requisição Web
Serial.println(request); // Escreve requisição na Serial
client.flush(); // Aguarda até todos dados serem enviados ao cliente
// ---- Monta protocolo de comunicação HTTP e conteúdo HTML para cliente ---- //
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<HEAD>");
client.println("<TITLE>Leitura da temperatura</TITLE>");
client.println("<META http-equiv=Content-Type content='text/html; charset=iso-8859-1'>");
client.println("<META HTTP-EQUIV='refresh' CONTENT='5'>");
client.println("</HEAD>");
client.println("<body>");
client.println("<h1><center>Bom-dia!</center></h1>");
client.println("<h2><center>Data e Hora</center></h2>");
client.println("<p><center id='datetime'></center></p>");
client.println("<script>");
client.print("var dt = new Date();");
client.print("document.getElementById('datetime').innerHTML = (('0'+dt.getDate()).slice(-2))+'/'+");
client.print("(('0'+(dt.getMonth()+1)).slice(-2))+'/'+(dt.getFullYear())+' - ");
client.print("'+(('0'+dt.getHours()).slice(-2))+':'+(('0'+dt.getMinutes()).slice(-2));");
client.println("</script>");
client.println("<h2><center>Temperatura</center></h2>");
client.println("<p><center>");
client.println(t);
client.println("Celsius</center></p>");
client.println("<p><center>");
client.println(f);
client.println("Fahrenheit </center></p>");
client.println("<h2><center>Umidade</center></h2>");
client.println("<p><center>");
client.println(h);
client.println("</center></p>");
client.println("</body>");
client.println("</html>");
Serial.println("Cliente desconectado ");
Serial.println("");
delay(20);
}