Como programar o módulo ESP8266 NodeMCU

Como programar o módulo ESP8266 NodeMCU

O módulo Wifi ESP8266 NodeMCU ESP-12E  é uma das placas mais interessantes da família ESP8266, já que pode ser facilmente ligada à um computador e programada com a linguagem Lua e também utilizando a IDE do Arduino. Neste post vamos mostrar como utilizar Lua para programar o módulo.

Módulo wifi ESP8266 NodeMCU

Essa placa possui 10 pinos GPIO (entrada/saída), suportando funções como PWM, I2C e 1-wire. Tem antena embutida, conversor USB-TLL integrado e o seu formato é ideal para ambientes de prototipação, encaixando facilmente em uma protoboard.

Hardware Módulo Wifi ESP8266 NodeMCU 

O módulo Wifi ESP8266 NodeMCU tem dois botões, conforme mostrado na imagem abaixo: Flash (utilizado na gravação do firmware) e RST (Reset).  No mesmo lado temos o conector micro usb para alimentação e conexão com o computador.

Pinagem ESP8266 NodeMCU

No lado oposto, temos o ESP-12E e sua antena embutida, já soldado na placa. Nas laterais temos os pinos de GPIO, alimentação externa, comunicação, etc.

No Windows 7, a instalação e download de drivers foi feita de forma automática, e um dispositivo USB-TTL CH340 foi adicionado ao gerenciador de dispositivos. No nosso caso, foi atribuida a porta COM29:

Gerenciador de dispositivos

Vamos programar o módulo utilizando o Lua, e isso pode ser feito, à princípio, de duas maneiras.

Programando o ESP8266 NodeMCU pela serial

Nesse método, vc pode utilizar um programa de terminal, como o Termite (download), para enviar os comandos diretamente para o módulo. Vamos montar primeiro um pequeno circuito para teste, que servirá para todos os exemplos deste post:

Circuito Arduino Nodemcu

Conecte o módulo ao computador utilizando o cabo USB e entre no Termite (ou outro programa à sua escolha), selecionando a velocidade de 9600. Pressione o botão de reset no módulo e aguarde a exibição das informações sobre o firmware da placa:

Comunicação NodeMCU - Termite

Em seguida, digite no terminal o seguinte comando, que vai definir a porta 5 como saída. Pressione ENTER após cada comando para que ele seja enviado ao NodeMCU:

gpio.mode(1, gpio.OUTPUT)

Para acender o led, envie o comando

gpio.write(1, gpio.HIGH)

Para piscar o led, crie um pequeno loop com essa série de comandos:

while 1 do
gpio.write(1, gpio.HIGH)
tmr.delay(1000000)
gpio.write(1, gpio.LOW)
tmr.delay(1000000)
end

Essa rotina vai fazer com que o led pisque a cada 1 segundo. Você logo vai notar que não é possível parar o programa por meio de comandos, e essa rotina vai rodar continuamente. Para parar o loop e reiniciar o módulo, pressione o botão RST.

Programando o Nodemcu utilizando ESPlorer

Programar o módulo pela serial pode ser interessante, mas podemos melhorar esse processo utilizando um programa como o ESPlorer (download).

Com o ESPlorer você pode abrir diversas abas e programas ao mesmo tempo, salvar os programas em disco, formatar (zerar) o módulo, e muitas outras funções.

Ao abrir o ESPlorer, temos no lado esquerdo uma área onde vamos escrever o(s) programa(s), e na direita o/a console, onde podemos acompanhar em tempo real a comunicação com o NodeMCU:

ESPlorer Tela Principal

Utilizando o exemplo do loop feito anteriormente, copie os comandos para a janela do lado esquerdo da tela, e em seguida clique no botão Send to ESP para enviar a programação para o NodeMCU:

ESPlorer-blink

Agora além de controlar o módulo, você tem a opção de salvar o programa para uso posterior.

Conectando o NodeMCU na rede wireless

Até agora só vimos como acionar as portas do NodeMCU por meio de programas, e já que temos um chip wireless ESP8266 no módulo, nada melhor do que acionar as portas do Nodemcu utilizando a rede sem fio. Para isso, carregue o programa abaixo no ESPlorer, colocando o nome da sua rede wifi e a senha nos campos NOME_DA_REDE e SENHA_DA_REDE, respectivamente:

-- Programa: Web Server com ESP8266 Nodemcu
-- Autor: FILIPEFLOP

-- Conexao na rede Wifi
wifi.setmode(wifi.STATION)
wifi.sta.config("NOME_DA_REDE","SENHA_DA_REDE")
print(wifi.sta.getip())
-- Definicoes do pino do led
led1 = 1
gpio.mode(led1, gpio.OUTPUT)
-- Definicoes do Web Server
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive", function(client,request)
        local buf = "";
        local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
        if(method == nil)then
            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
        end
        local _GET = {}
        if (vars ~= nil)then
            for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
                _GET[k] = v
            end
        end
        buf = buf.."<h1><u>FILIPEFLOP</u></h1>";
        buf = buf.."<h2><i>ESP8266 Web Server</i></h2>";
        buf = buf.."<p><a href=\"?pin=LIGA1\"><button><b>LED 1 LIG</b></button></a> <br/><br/><a href=\"?pin=DESLIGA1\"><button><b>LED 1 DES</b></button></a></p>";
                local _on,_off = "",""
        if(_GET.pin == "LIGA1")then
              gpio.write(led1, gpio.HIGH);
        elseif(_GET.pin == "DESLIGA1")then
              gpio.write(led1, gpio.LOW);
        end
        client:send(buf);
        client:close();
        collectgarbage();
    end)
end)

O programa configura o módulo para o modo station (estação) na linha 5, depois configura a GPIO como saída utilizando o comando gpio.mode. Para acessar a página web, você vai precisar do endereço IP atribuído ao módulo. No nosso caso o IP foi o 192.168.0.25.

Para descobrir o endereço IP, acesse o ESPplorer , selecione a opção =wifi.sta.getip() conforme a imagem abaixo e clique em SEND para que o endereço IP do módulo seja mostrado na console.

 Endereço IP

Acesse então o browser, digite o endereço IP e a página web do ESP8266 será exibida:

NodeMCU - Browser

Gostou ? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo), comente e visite nossa loja FILIPEFLOP!

4
Como programar o módulo ESP8266 NodeMCU
104 votos, 4.65 classificação média (93% pontuação)

Formado em Ciência da Computação pela Universidade de Mogi das Cruzes, atualmente responsável pelo departamento técnico da FILIPEFLOP.

Compartilhe este Post

69 Comentários

  1. Rosalvo Da Silva Marcelino - 17 de julho de 2017

    Olá, tenho duas duvidas, tem como eu colocar um controle de portao para ser acionado pelo modulo relé? tem outra forma?
    o controle usa 12v preciso ultilizar uma fonte ou pode ser a pilha dele mesmo para alimentalo?

  2. Francisco Secco - 8 de junho de 2017

    Bom dia Adilson. Sou iniciante no NodeMCU, e gostaria de alguns esclarecimentos:
    – para usar o ESPlorer necessito estar com o firmware carregado no ESP8266?
    – quando uso a IDE Arduino, ela compila e grava por cima do endereço do firmware, certo?
    – quando uso o gravador de firmware, existe a possibilidade de gravar em diferentes endereços. o que posso grava além do firmware?
    Desculpe pelo tamanho do questionamento.
    Abraços

  3. JEAN G P SILVA - 2 de maio de 2017

    galera. Eu consigo enviar os codigos para a placa, pega o ip certinho, eu até consigo pingar na placa.. mas quando acesso via browser nada acontece. Alguma ideia? Só recebo ERR_CONNECTION_REFUSED =/

  4. Gonçalo - 26 de abril de 2017

    O primeiro código funcionou tudo direito mas o segundo dá sempre erro ao compilar. Ou dá nil ou dá:
    dofile(“ConectarRedeWireless.lua”);
    192.168.137.57 255.255.255.0 192.168.137.1
    ConectarRedeWireless.lua:13: address in use
    stack traceback:
    [C]: in function ‘listen’
    ConectarRedeWireless.lua:13: in main chunk
    [C]: in function ‘dofile’
    stdin:1: in main chunk

  5. SCHEIBER - 22 de março de 2017

    pode me ajudar não consigo programar no meu modemcu ,a porta não abre , sera que tenho que fazer alguma coisa para configura-lá ?
    ainda dá esse erro error: Failed to open COM3

    desde já agradeço !!!

  6. Felipe - 19 de março de 2017

    No programa ESPlorer o botão ‘Send to ESP’ está oculto, ou seja, não posso cliclar. Há algum procedimento além de colocar o código loop na tela esquerda?

  7. Paulo Sergio Simões - 15 de fevereiro de 2017

    Boa tarde pessoal tudo bem?

    Eu tenho uma placa esp8266 conectada a um modulo j2me via serial, consegui fazer essa placa comunicar com um servidor de socket na internet utilizando comandos AT em seu modulo transparente.

    Bom o problema de utilizar a placa dessa forma é que eu acabo tendo que configurar o ssid e password na mão dentro da midlet , o que para um usuário é extremamente ruim.

    Para contornar esse problema eu carreguei o firmware do nodemcu no esp8266 e montei na linguagem lua um webservice que o usuário vai escolher uma rede disponível e digitar a sua senha via browser, isso ja esta funcionando.

    A minha pergunta é, eu consigo abrir uma conexão socket via comando serial utilizando o nodemcu? Se sim alguém teria algum exemplo para me passar.

    Desde ja agradeço pela atenção dispensada.

  8. João Eduardo - 4 de fevereiro de 2017

    Só aparece isto no Termite e não aceita nenhum comando.

    wdt reset
    load 0x40100000, len 27528, room 16
    tail 8
    chksum 0x7f
    load 0x3ffe8000, len 2184, room 0
    tail 8
    chksum 0xa8
    load 0x3ffe8888, len 8, room 0
    tail 8
    chksum 0xfb
    csum 0xfb
    slƒ{lŒŸã„c[0C]þ
    mac 1005

  9. Fabio Andrei Lorentz - 26 de janeiro de 2017

    Boa tarde,

    Primeiramente parabéns pelo Blog, conteúdo muito interessante e de simples compreensão. Porém, eu trabalho com programação e não intendo muito de eletrônica, e gostaria de programar alguns sensores do esp8266 nodemcu. Eu vi que alguns você pode conectar direto na placa sem o protoboard.

    Segue um que eu vi na internet (RGB SMD LED Module 5050): http://www.ebay.com/itm/181307916806?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

    Gostaria de saber, o que eu deveria levar em consideração, quando for comprar algum sensor pra conectar direto no esp8266 nodemcu? Somente sensores com 3.3V para a alimentação são possíveis?

  10. Kleber Gobbo - 28 de novembro de 2016

    Olá Adilson, tudo bom?
    Gostaria de saber se o ESP8266 possui algum pino de entrada com interrupção/contador.

  11. Mauro Sergio - 7 de outubro de 2016

    Bom dia Adilson.

    Gostaria de saber se há como conectar uma antena externa nesta placa para o sinal sempre estar estável.

    Abraços, Mauro .

    • tercio - 5 de novembro de 2016

      olá amigo acho q vc deve estar com o mesmo problema que eu , o meu nodemcu perde conexao com a internet direto e nao volta tenho que resetar ele pra continuar, se tiver a resposta me avisa

  12. Cassiano - 27 de setembro de 2016

    Adilson,
    eu consigo ligar um sensor PIR ou Umidade/temperatura nessa placa e enviar os dados via wifi ?

  13. Matheus Pereira - 24 de setembro de 2016

    Olá Adilson,

    Fiz tudo certo como você descreveu acima, mas quando vou requerir o IP pelo exemplo que você fez nao aparece, tem outra forma de descobrir o IP?

    Somente aparece:
    =wifi.sta.getip()
    =wifi.sta.getip()
    nil
    >

  14. Agostinho Neto - 15 de setembro de 2016

    Como ligar esse módulo no rede 220v?

    Vi alguns artigos que mostram que deve ser ligado a um regulador de tensão, alguém recomenda algum? E te algum esquema de ligação?

  15. Alex - 20 de agosto de 2016

    Gostaria que voce me ajudasse na comunicação. Nao consigo fazer a comunica de minha placa com o esplorer..

  16. Edilson Maia Favero - 20 de agosto de 2016

    Estou louco que saia um tutorial do ESP-14
    Descobri que é possível atualizar a bios dele para trabalhar com linguagem C
    Mas o material sobre a Pinagem dele é bem escasso ainda.

  17. Tercio - 12 de agosto de 2016

    Bom dia
    Fiz todos os codigos funcionou perfeitamente e acesso de qualquer lugar, so q precisaria de uma resposta pra saber se realmente meu led acendei. Quando acesso de algum lugar q eu nao tenha contato visual com saber se realmente ligou ou apagou? Ja fiz de tudo e nao consegui slguem tem algima sugestão?
    Obrigado

  18. isael - 11 de agosto de 2016

    ola, e possivel utilizar o nodemcu numa rede externa?

  19. tercio - 9 de agosto de 2016

    boa noite tenho uma duvida quando tiro o meu nodeMcu do pc e religo ele ele ja perdeu toda programaçao o que eu faço?

  20. Antonio Marin Neto - 7 de agosto de 2016

    Olá,

    Pra testar, eu criei um código usando a IDE do Arduino, mas agora quero usar Lua.
    Preciso fazer o flash novamente?
    Pq eu conecto na USB e o led fica piscando (código arduino) e quando conecto pelo Esplorer, aparece a mensagem:
    Communication with MCU…
    Got answer! AutoDetect firmware…
    Communication with MCU established.
    Can’t autodetect firmware, because proper answer not received (may be unknown firmware).
    Please, reset module or continue.

    E quando tento enviar um código:
    Waiting answer from ESP – Timeout reached.

    Além disso, nenhum dos comandos funcionam. Sempre retornam Waiting answer from ESP – Timeout reached.

    Obrigado

  21. Victor - 1 de agosto de 2016

    Waiting answer from ESP – Timeout reached. Command aborted.

    ;(

  22. Everson - 26 de julho de 2016

    Boa Tarde, estou com uma dúvida quanto a alimentação do ESP8266 NadeMcu, é possível alimenta-lo com uma fonte chaveada de 5V? Minha dúvida esta em relação ao controle de 4 relés, preciso acionar 4 relés com o ESP8266, e preciso fornecer aos relés 5V, GND e o Sinal, isso é possível?

    • Adilson Thomsen - 29 de julho de 2016

      Boa tarde Everson,

      Nesse caso, recomendo usar o módulo relé com fonte externa.

      Abraço!

      Adilson – Equipe FILIPEFLOP

      • Everson - 29 de julho de 2016

        Obrigado Adilson pelo retorno.

        Você poderia me orientar como ligar a fonte externa no modulo relé? Se não me engano o GND da fonte tem que estar ligado no mesmo GND do Arduino (ESP8266) é isso? Porém tem dois GNDs na placa e não sei exatamente qual usar, se da alimentação externa ou o GND no lado dos pinos de Sinal.

        Eu posso alimentar o ESP8266 NodeMcu com uma fonte normal de celular 5V, via mini usb?

        Abç

  23. paulo - 24 de julho de 2016

    Eu gostaria que alguém pudesse me explicar melhor cada linha dessa parte do código. O brigado!

    — Definicoes do Web Server
    srv=net.createServer(net.TCP)
    srv:listen(80,function(conn)
    conn:on(“receive”, function(client,request)
    local buf = “”;
    local _, _, method, path, vars = string.find(request, “([A-Z]+) (.+)?(.+) HTTP”);
    if(method == nil)then
    _, _, method, path = string.find(request, “([A-Z]+) (.+) HTTP”);
    end
    local _GET = {}
    if (vars ~= nil)then
    for k, v in string.gmatch(vars, “(%w+)=(%w+)&*”) do
    _GET[k] = v
    end
    end

  24. Neilon - 21 de julho de 2016

    Ola, é possivel usar o modulo nRF24l01 com o nodemcu?

  25. Roberto Carlos - 16 de julho de 2016

    Boa noite Adilson!
    Qual o comando para remover todos os arquivos do Esp8266-E12, usando ESPlorer?
    Tipo, deixar ele zerado.

  26. Naldo - 15 de julho de 2016

    Ola, Obrigado pela informações !!! Funcionou de primeira.
    Mas agora estou tentando transformar esse código lua para usar na IDE do arduino.
    Poderia me dar uma dica de como ficaria essa parte :

    — Definicoes do Web Server
    srv=net.createServer(net.TCP)
    srv:listen(80,function(conn)
    conn:on(“receive”, function(client,request)
    local buf = “”;
    local _, _, method, path, vars = string.find(request, “([A-Z]+) (.+)?(.+) HTTP”);
    if(method == nil)then
    _, _, method, path = string.find(request, “([A-Z]+) (.+) HTTP”);
    end
    local _GET = {}
    if (vars ~= nil)then
    for k, v in string.gmatch(vars, “(%w+)=(%w+)&*”) do
    _GET[k] = v
    end
    end

  27. Paulo - 13 de julho de 2016

    Bom dia Adilson,

    cara estou com uma dúvida aqui….
    existe alguma maneira de aumentar o número de conexões em um módulo (SOFTAP) ?
    Verifiquei que o nodemcu limita a 4 conexões simultâneas.
    Tens alguma ideia se é possível aumentar este número e como fazer isso?
    Fico no aguardo.

    • Adilson Thomsen - 29 de julho de 2016

      Boa tarde Paulo,

      Bem difícil, a não ser que você pudesse reprogramar o “core” do ESP, mas aí temos outras variáveis como quantidade de memória no módulo, por exemplo.

      A princípio, minha resposta seria: “não é possível”.

      abraço!

      Adilson – Equipe FILIPEFLOP

  28. Igor Menin - 10 de julho de 2016

    Alguém ai sabe me dizer, se tem alguma bateria na voltagem do NODEMCU, ou tenho mesmo que usar um regulador de tensão? E também gostaria de saber qual a amperagem que essa placa precisa no mínimo, pois estou a comprar uma bateria do ALI, http://goo.gl/k329Ah

  29. marcio de jesus - 21 de junho de 2016

    Para ligaro nodeMcu 12 E , no Arduino mega como devo proceder? eu estava pensando em um CI 4050 que é um buffer inversor para fazer a conexão com o Merga e o nodeMcu 8266. Porque o no arduino mega a pwm é de 0 a 5v e o nodemcu deve ser de 0 a 3.3v
    Ou você tem outra solução para me indicar?

  30. Ivanildo Lima Bandeira - 6 de junho de 2016

    Boa noite! Comprei um NodeMcu ESP8266 e começei a testar uns programas nele..Entretanto estou percebendo que toda vez que desligo o módulo e ligo novamente o programa não executa, como se não tivesse sido gravado na memória…Alguém sabe me dizer porque esta acontecendo isso e como resolver? Grato!

    • Adilson Thomsen - 7 de junho de 2016

      Bom dia Ivanildo,

      O NodeMCU não funciona da mesma maneira que o Arduino, por exemplo. No NodeMCU, você precisa dizer qual dos programas na memória serão executados quando você ligar o módulo, isso você faz criando um arquivo chamado init.lua.

      Ao ligar o NodeMCU, ele procura o init.lua e executa os comandos que estiverem ali dentro. Então se você tem um programa chamado teste_nodemcu.lua que você quer executar toda vez que o módulo liga, você deve criar um init.lua mais ou menos assim:

      function startup()
      print(‘in startup’)
      dofile(‘test_nodemcu.lua’)
      end

      tmr.alarm(0,5000,0,startup)

      O programa acima executa o test_nodemcu.lua depois de 5 segundos do boot do módulo.

      Abraço!

      Adilson – Equipe FILIPEFLOP

      • Jairo - 30 de julho de 2016

        Muito bom Adilson.
        Só que no meu teste, usei o código acima e não funcionou, modifiquei, trocando os apóstrofos (‘) por aspas (“) , o código ficou assim:
        function startup()
        print(“in startup”)
        dofile(“test_nodemcu.lua”)
        end

        tmr.alarm(0,5000,0,startup)

        Desta maneira funcionou perfeitamente, estou usando um powerbank na alimentação para testes e posso conectar e desconectar que ele sempre inicia o programa normalmente.
        Muito bom o post.
        Um Abraço.

  31. Bruno Aguiar - 24 de maio de 2016

    Bom dia,

    Estou tendo uma mensagem de “ERROR” quando tento mandar o comando gpio.mode(1, gpio.OUTPUT) pela serial, sabe qual pode ser o motivo?

    • Bruno Aguiar - 24 de maio de 2016

      Consegui resolver, gravando a firmware mais atualizada do NodeMCU, creio que algumas placas compradas na china não venham com o firmware correto instalado, fica a dica para todos.

  32. Marcelo - 19 de maio de 2016

    Estou utilizando o ESP8266 NodeMcu V3 e o módulo está ocupando toda a protoboard. Não sobram espaços para conectar os fios. Vocês utilizaram algum modelo especial de protoboard ou o módulo é mais atual e, consequentemente, menor?

    Abs

  33. Matheus - 19 de maio de 2016

    Parabens pelo trabalho, gostaria de saber se tem alguma maneira de programar o ESP8266 para WiFi direct(P2P)…. Valeu !

    • Adilson Thomsen - 19 de maio de 2016

      Boa tarde Matheus,

      Você pode configurar um módulo para o modo STA (station), e o outro para o modo AP (access point), com o comando AT+CWMODE, e conectando os dois diretamente… é mais ou menos isso ?

      Abraço!

      Adilson – Equipe FILIPEFLOP

      • Matheus - 20 de maio de 2016

        Não meu caro, no datasheet diz que o módulo é compatível com WIfI Direct, que seria comunicação P2P, a maioria dos celulares tem essa tecnologia. O Wi-Fi direct permite que você comunique com outro dispositivos diretamente. Já implementei o Wi-Fi direct em uma aplicação Android, agora falta fazê-la no módulo.

        • Adilson Thomsen - 20 de maio de 2016

          Boa tarde Matheus,

          Pois é. eu não achei nada relacionado à wifi direct nos comandos AT do módulo, o que você tem é o modo AP, o modo STA e o “both”… vou pesquisar mais um pouco e se achar algo posto aqui.

          Abraço.

          Adilson – Equipe FILIPEFLOP

  34. Lucas - 5 de abril de 2016

    Olá Adilson

    nesse caso eu somente consigo acessar localmente.

    como faço pra controlar o led via internet?

  35. jorge garcia - 25 de março de 2016

    parabens , deu quase tudo certo , apenas me apareceu este erro , alguem me pode dizer o que e :
    > dofile(‘script2.lua’)
    script2.lua:9: ‘=’ expected near ‘do’
    > =wifi.sta.getip()
    10.0.0.109 255.255.255.0 10.0.0.1

  36. João Roberto Gabbardo - 22 de março de 2016

    Olá Adilson,
    parabéns pela excelente explicação sobre com programar o NODEMCU e pelo exemplo de programação em linguagem LUA. Eu tenho alguma experiência em programação em C, ( embora esteja um tanto enferrujado) mas a linguagem LUA, a qual estou tentando aprender, aparenta ter uma sintaxe muito estranha! Seria possível adicionar mais comentários no programa-exemplo detalhando-o melhor?

    Abraços,

    João Roberto Gabbardo

  37. Rafael - 29 de fevereiro de 2016

    Parabéns pelo texto, ainda há pouco material sobre a programação do módulo com LUA em português. Vocês tem alguma lista dos comando em LUA que podem ser utilizados com o ESP?

  38. Fernando - 28 de fevereiro de 2016

    Parabéns. Posso programar este módulo com comandos AT através de um terminal ou tenho que utilizar a Lua?

  39. Rafael - 25 de fevereiro de 2016

    Qual a velocidade de comunicação utilizada neste exemplo?

  40. Rafael - 25 de fevereiro de 2016

    Este programa ESPlorer é instalado na máquina ou é só executável? É necessário instalar o java antes de instalar o ESPlorer?

  41. Claudio - 22 de fevereiro de 2016

    Parabens, excelente matéria.

Deixe uma resposta