24 fevereiro 2016

Web Server com o módulo ESP8266 NodeMCU e DHT22

O módulo ESP8266 NodeMCU é uma placa da família ESP8266, sendo umas das mais completas e simples de usar. Neste post vamos mostrar como utilizar essa placa para criar um web server e enviar dados do sensor de temperatura DHT22.

Módulo Wifi ESP8266 NodeMCU

O módulo ESP8266 NodeMCU já tem incorporado um módulo ESP12-E com antena embutida, e ainda conta com um conversor USB-TTL (CH340), facilitando a comunicação e transferência de programas.

Além disso tem um formato que facilita o uso em uma protoboard, permitindo acesso às 11 portas (GPIO) do módulo. Tudo isso significa que você não vai precisar de um microcontrolador adicional como o Arduino, PIC ou Raspberry para criar os seus projetos.

Pinagem módulo NodeMCU


A imagem abaixo ilustra a pinagem do módulo ESP8266 NodeMCU. Com ele podemos usar os pinos da mesma maneira que usamos, por exemplo, no Arduino, com interface SPI, I2C, PWM, etc. Temos ainda os botões RST (Reset) e o Flash, utilizado para upgrade de firmware do módulo.

NodeMCU - Pinagem


O conector de alimentação é micro-usb, e serve também para comunicação com o computador. A programação pode tanto ser feita em Lua, como também com a própria IDE do Arduino, com algumas modificações na parte de gerenciamento da placa.

A instalação do módulo ESP8266 NodeMCU no Windows foi feita de forma automática, com o módulo sendo reconhecido na porta COM13 como um dispositivo USB-Serial CH340. Caso seja necessário, você encontra os drivers para o CH340 neste link.

Instalação do ESPlorer


O programa que vamos utilizar neste post foi feito em Lua, e para enviar este programa para o ESP8266 NodeMCU vamos precisar de um aplicativo que faça essa comunicação com o módulo. Um dos mais usados é o ESPlorer, que você pode baixar neste link. Com o ESPlorer a criação e transferência de programas para o módulo ESP8266 é bastante simplificada, e você tem a opção de salvar programas, enviar comandos especiais ao módulo, resetar, formatar, etc.

O programa não precisa de instalação, e basta você executar o arquivo ESPlorer.bat para que a interface seja carregada. A única exigência é a presença do java (download) na máquina.

Na tela principal, temos do lado esquerdo a área de programação, e do lado direito uma console, onde é mostrado o status de comunicação com o módulo, assim como eventuais avisos e mensagens de erro.

ESPlorer - Tela Principal

Para fazer a comunicação com o módulo NodeMCU selecione a porta COM na parte superior do ESPlorer (no nosso caso, a COM13), selecione a velocidade de comunicação (padrão 9600) e clique em Open:

ESPlorer - Conexão Serial

Pressione o botão RST do módulo e, se estiver tudo ok, o mesmo deve responder com as informações básicas referentes ao firmware instalado:

ESPlorer - ESP8266 conectado

Com o ESPlorer configurado e o módulo funcionando, podemos agora montar o circuito que vai coletar as informações de um sensor de temperatura DHT22 e enviar para uma página web.

Circuito módulo ESP8266 NodeMCU


Monte o circuito abaixo, conectando o pino de dados do DHT22 à porta 4 do NodeMCU (GPIO02). A alimentação do sensor de temperatura será feita pelos pinos 3.3V e GND do módulo.

NodeMCU sensor de temperatura DHT22


Isso é tudo que precisamos na parte do hardware. Conecte agora o cabo micro-usb ao NodeMCU para ligar o circuito e iniciar o processo de transferência de programas.

Instalação biblioteca DHT22 Lua


Antes de transferir o programa que vai criar o webserver no módulo NodeMCU, precisamos da biblioteca do DHT22 para o Lua. Para instalar a biblioteca, acesse este link, e clique sobre o arquivo dht22_min.lua:


Biblioteca DHT22 Lua

Na tela seguinte, selecione a opção RAW, no canto direito da página

O código da biblioteca, "limpo", será exibido no browser. Copie todo o código e cole no ESPlorer, de preferência em uma nova aba. Em seguida, clique em Save to ESP:

DHT22 Lua Library

Na janela seguinte, coloque o nome do arquivo como dht22_min.lua e clique em Save.

Biblioteca - Save

O programa será então gravado localmente na sua máquina, e também transferido para o ESP8266 NodeMCU.

Vamos conferir para ver se o arquivo está lá mesmo ? No ESPlorer, acesse a aba Commands, depois clique em List files:

ESPlorer - Listar arquivos

Acompanhe o resultado na console, indicando que o arquivo dht22_min.lua foi transferido corretamente:

NodeMCU - Arquivos

Programa Web Server com DHT22


Agora copie o programa abaixo em uma nova aba do ESPlorer. Ele faz a leitura dos dados do DHT22 e cria um web server para exibição de uma página com as informações de temperatura e umidade. Na linha 7, troque os campos NOME_REDESENHA_REDE pelas informações da rede wifi à qual o módulo vai se conectar.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
-- Programa: Web Server com ESP8266 NodeMCU e DHT22
-- Autor: Arduino e Cia
-- Baseado no programa original de www.beerandchips.net

-- Define as configuracoes de rede
wifi.setmode(wifi.STATION)
wifi.sta.config("NOME_REDE","SENHA_REDE")
wifi.sta.connect()

-- Definicao de pino do DHT22
PIN = 4 --  data pin, GPIO2
dht22 = require("dht22_min")
chipserial = node.chipid()

-- Cria e roda o web server
srv=net.createServer(net.TCP, 4)
print("Server created on " .. wifi.sta.getip())
srv:listen(80,function(conn)
conn:on("receive",function(conn,request)
print(request)

-- Le as informacoes do sensor de temperatura
dht22.read(PIN)
t = dht22.getTemperature()
h = dht22.getHumidity()

conn:send('<html>')
conn:send('<title>NodeMCU - Arduino e Cia</title></head>')
conn:send('<meta http-equiv="refresh" content="5">')
conn:send('<body bgcolor=\"#ffffff\">')
conn:send('<center>')
conn:send('<table bgcolor=\"#0000ff\" width=\"90%\" border=\"0\">')
conn:send('<tr>')
conn:send('  <td><font size=\"3\" face=\"arial, helvetica\" color=\"#ffffff\"><center>Temperatura</center></font></td>')
conn:send('</tr>')
conn:send('<tr>')
conn:send('  <td><font size=\"7\" face=\"arial, helvetica\" color=\"#ffffff\"><center>'..((t-(t % 10)) / 10).."."..(t % 10)..'&deg;C</center></font></td>')
conn:send('</tr>')
conn:send('<tr>')
conn:send('  <td><font size=\"3\" face=\"arial, helvetica\" color=\"#ffffff\"><center>Umidade</center></font></td>')
conn:send('</tr>')
conn:send('<tr>')
conn:send('  <td><font size=\"5\" face=\"arial, helvetica\" color=\"#ffffff\"><center>'..((h - (h % 10)) / 10).."."..(h % 10)..'%</center></font></td>')
conn:send('</tr>')
conn:send('</table>')
conn:send('</center>')
conn:send('</body></html>')
end)

Pressione a tecla Send to ESP e aguarde até que o programa seja transferido.

Para a parte final, que é o teste em um browser, vamos precisar do endereço IP atribuído ao módulo. Na caixa de seleção do lado direito, abaixo da console, escolhe a opção =wifi.sta.getip() e clique em Send. O endereço IP será exibido na console. No nosso caso, o endereço IP recebido foi 10.0.0.110:

ESPlorer - wifi.sta.getip

Utilize este IP em um browser, digitando-o na barra de endereços. Em poucos instantes as informações de temperatura e umidade do DHT22 serão enviadas pela placa:

Browser Temperatura e Umidade NodeMCU DHT22

38 comentários:

  1. Bom dia, muito bom o artigo! É possivel adicionar um relé shield e o mesmo ser acionado caso atinja determinada temperatura?

    Obrigado!

    ResponderExcluir
    Respostas
    1. Boa noite,

      É possível sim. Estou desenvolvendo um post exatamente sobre isso. :)

      Abraço!

      Excluir
    2. Muito bacana, minha intenção é justamente essa, eu vi alguns tutoriais, pelo que entendi, daria para fazer um termostato usando esp-01, visto que são necessarios apenas dois pinos digitais, na hora que sobrar um tempo quero fazer esse teste.

      Excluir
    3. Bom dia!

      Publiquei recentemente um post sobre o assunto, que apesar de não usar o ESP8266 (ainda), faz o acionamento do relé de acordo com a temperatura:

      http://www.arduinoecia.com.br/2016/06/arduino-dht11-controle-de-rele-temperatura.html

      Abraço!

      Adilson

      Excluir
  2. Boa noite! ótimo post, mas fiquei com uma dúvida, como faria para acessar essa temperatura de a outra rede(sem estar na mesma rede) usando por exemplo a internet do celular.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Você pode criar uma "regra" no seu roteador, apontando a porta 80 para o módulo NodeMCU, por exemplo.

      Abraço!

      Excluir
  3. Está dando erro na hora de upar o servidor para o nodemcu:

    SERVER.lua:49: 'end' expected (to close 'function' at line 18) near ''

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Mas o programa funciona ? O meu ESPlorer também apresenta alguns alertas quando eu vou transferir o programa.

      Abraço!

      Excluir
  4. Uma dúvida: qual a faixa de temperatura medida com este componente?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      A faixa é de -40 a 125°C. Eu tenho um post sobre o DHT22, dê uma olhada, por favor:

      http://www.arduinoecia.com.br/2015/02/sensor-de-temperatura-e-umidade-dht22.html

      Abraço!

      Excluir
  5. Obrigado pelo ótimo conteúdo , porém encontrei alguns erros que não estão permitindo chegar ao resultado final que esta aqui.
    Primeiro estou usando a versão do ESPlorer V0.2.0 rd3 (a sua é rc2).
    Após copiar o texto do DHT22_min.lua para uma aba nova, e clicar em SAVE TO ESP, aparece uma msg de erro informando que é necessário um nome antes de salvar, ao invés de abrir um box para escolher ou digitar o nome.
    Para ultrapassar este ponto, fui em SAVE TO DISK , salvei o mesmo com o nome dht22_min.lua, e depois cliquei em SAVE to ESP, e funcionou, e conferi que estava salvo no módulo.
    Mesma coisa acontece com o webserver, que precisa de um nome para ser salvo no módulo. fiz a mesma coisa dando o nome de webserverdht.lua , salvando no disco e depois no módulo, e conferindo
    Depois deste passo, tento conseguir o ip e recebo a resposta NIL.
    Acredito que o modulo não tenha executado o programa enviado, e não conectando na minha rede.
    Como indicar ao módulo que deve executar o programa?

    Grato

    Luiz

    ResponderExcluir
    Respostas
    1. Oi Luiz,

      Envie o programa para o NodeMCU e depois clique no botão RUN dentro do ESPlorer.

      Abraço!

      Excluir
  6. tentei refazer os passos , e percebi o seguinte erro:
    webserverdht22.lua:49: 'end' expected (to close 'function' at line 18) near ''

    ResponderExcluir
  7. Também a parte da biblioteca do dht22 dá uma msg
    dht22_min.lua:1: table index is nil

    ResponderExcluir
    Respostas
    1. Oi Luiz,

      Veja se não há algum conflito com algum programa que já esteja rodando no NodeMCU. Recomendo apagar tudo e começar do zero.

      Abraço!

      Excluir
  8. Will your software work for a DTH11?

    Thanks
    Joe

    ResponderExcluir
    Respostas
    1. Hi !

      No, only for DHT22 and DHT21. For DHT11, please use this one: http://www.barissanli.com/electronics/nodemcu.php#_Toc424446169

      Best regards!

      Excluir
  9. Ha possibilidade de acessar as leitura em SNMP sem o arduino, somente o nodemcu ?

    ResponderExcluir
    Respostas
    1. Oi Celso,

      Dependendo do que você precisa, pode "dispensar" o Arduino sim, e utilizar só o NodeMCU.

      Eu não fiz nenhum projeto com SNMP e NodeMCU, mas creio que esse artigo aqui pode te ajudar: https://bigdanzblog.wordpress.com/2015/04/29/snmp-environmental-monitoring-using-esp8266-based-sensors/

      Abraço!

      Adilson

      Excluir
  10. Boa tarde amigo, passei o programa para o modulo. Porem quando copio o IP para o browser aparece esse erro.

    o dispositivo ou recurso ( 192.168.1.11) não esta configurado para aceitar conexões na porta " O serviço World Wide Web(HTTP)"

    Você sabe como resolver isso ??? obrigado

    ResponderExcluir
  11. Boa noite, parabéns pelo post.
    Uma curiosidade, é possivel configurar o ESP para que usuário antes de configurar a rede, conecte-se em um IP de configuracao, para que possa entrar com a rede e senha em que o dispositivo ira rodar? Isso de forma que o usuário não tenha acesso ao código, entendeu?
    Obrigado

    ResponderExcluir
    Respostas
    1. Bom dia,

      Essa configuração seria feita via monitor serial ? Pq se você for criar uma tela de configuração, para acessar você já precisaria da comunicação TCP/IP com o ESP.

      Mas eu acho que entendi a sua pergunta. Você quer utilizar o ESP em várias redes diferentes, sem ter que mudar o programa para cada uma delas.

      Uma sugestão é você usar o comando do ESP para rastrear as redes existentes, e então mostrar essas redes, por exemplo, em um display LCD.

      Dessa forma, o usuário seleciona a rede e entra com a senha. Dá um certo trabalho mas é possível.

      Abraço e obrigado!

      Excluir
  12. Oi,
    É possível aplicar no ESP-01 ?

    ResponderExcluir
    Respostas
    1. Olá,

      É possível sim, vc provavelmente só terá que mudar algo em relação ás portas.

      Abraço!

      Excluir
  13. Boa noite!
    Qual o comando no ESPlorer para apagar todos os arquivos do Esp826-E12 e recomeçar do zero?

    ResponderExcluir
    Respostas
    1. Oi Roberto,

      Utilize o botão "format" no lado direito do ESPlorer, ao lado da console.

      Abraço!

      Excluir
  14. Olá... É possivel simultaneamente gravar os dados em um cartao SD e enviar as informações via wireless?

    ResponderExcluir
    Respostas
    1. Oi Luis,

      Sim, os pinos de ligação são completamente diferentes, então nada impede que você coloque um adaptador para cartão SD no circuito e grave esses dados.

      Abraço!

      Excluir
  15. Boa noite,

    estou com um problema na minha implementação. Na minha implementação, o sistema liga um led de a temperatura for maior que 20ºC. O Problema é que o sistema aciona o led somente se tiver com a página do navegador acessando á página web do esp. Caso não esteja, o led não acende. Tem como fazer essa validação: realizar a leitura do sensor e acender o led mesmo que não esteja com á página aberta?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Estranho isso. Posta o código pra gente dar uma olhada.

      Abraço!

      Excluir
    2. O MEU ACONTECE A MESMA COISA E A CONEXÃO FICA MUITO INSTAVEL TENHO QUE DESLIGAR E RELIGAR NOVAMENTE

      Excluir
  16. Olha eu denovo! rs
    Devido ao meu trabalho fiquei 08 meses sem mexer nos brinquedos...
    Até voltei a comprar algumas peças, e estou esperando chegar para te enviar...
    Você testou a distância que consegue com este? Soldar uma antena nele seria loucura?

    ResponderExcluir
    Respostas
    1. Fala kbecao!! :)

      Não sei se soldar uma antena seria uma boa ideia.. rs... ainda não testei, mas geralmente não tenho problemas de conexão.

      Abraço!

      Excluir
  17. Bom dia, gostaria de saber por que minha placa nodemcu não consegue se comunicar com o esplorer?

    ResponderExcluir
  18. Boa noite, já estou a um tempo pesquisando uma maneira de ligar o NodeMCU esp8266 no arduíno MEGA, e não estou achando tópicos que quero, alguém sabe como fazer a ligação?

    ResponderExcluir
  19. Olá. Dado a possibilidade de subir programas neste módulo, haveria necessidade de comprar tambem uma placa UNO/MEGA/NANO para iniciantes em Arduíno? Ou se recomenda uso apenas para projetos definitivos?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Não há necessidade, você pode programar tudo direto no NodeMCU... mas... se você for iniciante, eu recomendo sim um Arduino Uno.

      Abraço!

      Excluir