Como usar display OLED com ESP8266 ESP-12E 31

Neste post vamos ver um tutorial de como utilizar o Display OLED I2C com o módulo wifi ESP8266 ESP-12E. Se você preferir, é possível seguir o passo a passo com os demais modelos do ESP8266.

Display OLED e ESP8266 ESP-12E

Antes de iniciar, eu sugiro a leitura do post Como programar o módulo ESP8266 NodeMCU pois iremos utilizar o firmware do NodeMCU.

Como ligar o display Oled no ESP8266 

O display OLED utiliza barramento I2C, e para tal vamos conectar o SCL no GPIO 12 (pino 6) e o SDA no GPIO 13 (pino 7). Na imagem abaixo é possível observar o circuito montado.

Circuito display Oled e ESP8266

Firmware NodeMCU

Como iremos utilizar o display OLED, o firmware instalado no NodeMCU deve possuir os módulos I2C e U8G habilitados. O módulo I2C é responsável pela comunicação com o display, já o módulo U8G é responsável pela parte gráfica, permitindo desenhar ou escrever no display.

Para maiores informações sobre como gravar o firmware no ESP8266, acesse este link.

É importante ressaltar que o controlador do display é o SSD1306 e o tamanho da tela é de 128×64 pixels, sendo assim, o módulo U8G deve ser compilado com esta versão. Versões customizadas do firmware NodeMCU podem ser conseguidas através do site NodeMCU custom builds. Nas imagens abaixo você pode observar quais módulos deve selecionar e como configurar o módulo U8G.

Módulos NodeMCU

Opções UG8

Programa display e ESP8266 ESP-12E

Nas linha 1 e 2 definimos os pinos onde estão conectados o SDA e o SCL respectivamente. Na linha 3 indicamos o endereço I2C do controlador SSD1306. Na linhas 5 configuramos o barramento I2C, já na linha 6 configuramos o display.

SDA = 7
SCL = 6
ADDRESS = 0x3c

i2c.setup(0, SDA, SCL, i2c.SLOW)
disp = u8g.ssd1306_128x64_i2c(ADDRESS)

function draw()
  disp:setFont(u8g.font_6x10)
  disp:drawStr(34, 10, "MakerHero")
  disp:drawLine(0, 25, 128, 25);
  disp:setFont(u8g.font_chikita)
  disp:drawStr(30, 40, "Blog MakerHero")
  disp:drawStr(20, 50, "Tutoriais e Projetos")
  disp:drawStr(38, 60, "com Arduino")
end

function loop()
  disp:firstPage()

  repeat
    draw()
  until disp:nextPage() == false

  -- devemos chamar tmr.wdclr() em um loop contínuo
  -- para evitar hardware reset causado pelo watchdog.
  tmr.wdclr()
  loop()
end

loop()

O programa contém uma seção chamada draw, onde ficam os comandos de acionamento do display. Dentro dele, temos os comandos para escrever na tela (drawStr), desenhar linha (drawLine), assim como selecionar a fonte utilizada para o texto (setFont).

A seção loop, é responsável por chamar a seção draw para desenhar a tela. Note que na linha 27 fazemos o reset do watchdog no NodeMCU. Isto é necessário quando criamos uma função recursiva ou quando fazemos um laço de repetição muito grande, pois evita que o hardware reset.

 Gostou? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

31 Comentários

  1. “ Para maiores informações sobre como gravar o firmware no ESP8266, ” – o link está quebrado 🙁

    Obrigado!

  2. Boa noite, desculpa a pergunta, mas gostaria de saber qual a tensão do nível lógico do esp 8266? Quero fazer um projeto usando um esp 8266 com um Lora, porém não sei se peciso de conversor de nível lógico para isso. Obrigado des de já

    1. Gustavo,

      A tensão lógica do ESP é de 3.3V.

      Abraços, e cuide-se com o COVID-19!
      Diogo – Equipe MakerHero

  3. comprei este kit de vcs (Placa ESP8266 com Sensor de Umidade e Temperatura DHT11 e Display OLED × 1) qual e nao da de usar esse codigo

  4. o meu da erro na linha 25.

    1. Olá,

      Qual erro está ocorrendo?

      Abraços!
      Diogo – Equipe MakerHero

      1. Arduino: 1.8.9 (Windows 10), Placa:”Generic ESP8266 Module, 80 MHz, Flash, Disabled, All SSL ciphers (most compatible), ck, 26 MHz, 40MHz, DOUT (compatible), 512K (no SPIFFS), 2, nonos-sdk 2.2.1 (legacy), v2 Lower Memory, Disabled, None, Only Sketch, 115200″

        sketch_sep21b:25:3: error: stray ‘\303’ in program

        — devemos chamar tmr.wdclr() em um loop contínuo

        ^

        sketch_sep21b:25:3: error: stray ‘\255’ in program

        sketch_sep21b:1:1: error: ‘SDA’ does not name a type

        SDA = 7

        ^

        sketch_sep21b:12:3: error: ‘disp’ does not name a type

        disp:setFont(u8g.font_chikita)

        ^

        exit status 1
        stray ‘\303’ in program

        Este relatório teria mais informações com
        “Mostrar a saida detalhada durante a compilação”
        opção pode ser ativada em “Arquivo -> Preferências”

        1. Olá,
          Esses erros ocorrem porque a IDE não está identificando as aspas (“”). Sendo assim, apague e digite as aspas em todo o código. Isso deve resolver o problema.

          Abraços!
          Diogo – Equipe MakerHero

          1. continua dando o mesmo erro!!
            consegue me mandar o código no meu e-mail [email protected]

  5. olá, comprei para um projeto o display aqui mas quero usar o node MCU 32S e usando um codigo de exemplo ele nen da sinal oque poderia ser?

    1. Olá Ivan,

      Basta você verificar se os pinos que você ligou correspondem com o código utilizado. Muitas vezes o problema está aí.

      Abraços!
      Diogo – Equipe MakerHero

  6. É possível trabalhar com um display LCD 16×2 utilizando o Módulo Serial I2C e operar com a tensão de 3,3V? Estou usando o módulo NodeMCU com o ESP8266 em meu projeto e quero ligar um display 16×2 nele, mas parece que o ESP8266 opera apenas com a tensão de 3,3V.
    Obrigado!

    1. Olá, Tiago!

      É possível sim, alimente o módulo I2C com a NodeMCU e então o LCD no módulo que o mesmo já vai alimentar o display 😉

      Abraços!
      Diogo – Equipe MakerHero

  7. Para maiores informações sobre como gravar o firmware no ESP8266, acesse este link. esse link está furado, o atual é :

    LUIS JORGE ALMEIDA BANDEIRA DE MELLO
  8. ola, primeiramente seu blog eh otimo!
    Gostaria de saber se voce pode me ajudar com o seguinte. Preciso mudar os pinos de sda e clk do i2c na ide do arduino. Meu projeto precisa dessa mudanca, quero mudar para as gpios 0 e gpio2. O default do arduino eh na gpio 5 e gpio 4 mas eu as utilizo em outra funcao.
    obrigado

  9. Olá. Não seria necessário ter resistores de pull-up para o barramento I2C ?

  10. É possível pegar a posição GPS somente com ele, ligado ao roteador de um celular?

    1. Não entendi a pergunta, você quer descobrir a posição baseada na rede, ou você quer ligar um GPS ao módulo e pedir para o ESP retornar a posição atual dele?

      Em ambos os casos é possível, porém descobrir a localização baseada na rede/IP é mais complicado.

      Se você conectar um GPS ao ESP e programar o ESP para retornar a posição é mais simples.

  11. Vocês tem algum manual para a configuração do módulo ESP8266 ESP-07, ou eu posso me basear no manual do ESP8266 ESP-12E mesmo?

    1. O 12E possui apenas alguns pinos a mais que o 07 e antena embutida. Ambos são compatíveis. Que tipo de manual você se refere?

      1. Seria um tutorial como esse do esp8266: https://www.makerhero.com/blog/esp8266-arduino-tutorial/, no qual você mostra como os pinos devem ser conectados e um código de exemplo.

  12. Olá, muito interessante adicionar um OLED a um ESP12.
    A primeira vez que testei deu bem. Testei várias vezes.
    Mas alguns dias depois voltei a testar o mesmo setup e o oled fica com pontos em vez de texto.

    Alguem me sabe dizer o que poderá causar isto?
    O oled é iniciado mas em vez de aparecer texto aparecem pontos.

    1. Os pinos I2C estão conectados corretamente?

      1. Já funciona bem. faltava loop() no final
        MakerHero testado em Portugal https://db.tt/u1vBNhHb

        Muito obrigado pelo tutorial Simples e funcional. *****

  13. Parabéns amigo. Ótimo post.
    Gostaria de saber se vc pode me ajudar com algo.
    Tenho um computador que recebe informações de outro computador pela porta serial. São 3 strings. Essas informações atualmente são exibidas em um programa no computador. Gostaria de saber se é possível enviar essas 3 strings para o arduino por wifi e exibir em um display. Se houver jeito, poderia me sugerir a melhor forma de conseguir fazer o envio dessa informação?.
    Desde já agradeço muito amigo

    1. Diego, é possível sim. Creio que a melhor forma seja utilizando o protocolo MQTT.

  14. Por favor, puedes poner la orden para seleccionar los colores del texto?
    Gracias

    Por favor, ¿você pode colocar a ordem para selecionar as cores do texto?
    Obrigado

    1. O display possui duas cores, na parte superior ele é amarelo, na inferior ele é azul. Não existe código para mudar a cor do texto.

  15. Alexandre, parabéns pela clareza e concisão do artigo. Mas gostaria de saber se (como) é possível descobrir que módulos compõem a versão pré-distribuída do binário NodeMCU para evitar retrabalho de reconfigurá-lo.
    A ferramenta ESPlorer tem algum recurso para isso?
    Antecipadamente agradecido.

    1. Alexandre:
      Já vi a resposta à minha pergunta.
      Era só observar a mensagem de inicialização do ESP8266 com nodeMCU.

      1. Sim, na hora do boot são exibidas algumas informações úteis.