Como conectar o Display Oled ao Arduino 55

Neste tutorial vamos ver um outro tipo de display, o display OLED I2C com controlador SSD1306 e resolução de 128×64 pixels, onde é possível mostrar com muita nitidez imagens e caracteres em amarelo, na faixa superior, ou em azul, na parte inferior do display.

Com o uso da tecnologia OLED, não há necessidade de utilização de luz de fundo (backlight), o que torna esse display extremamente econômico em termos de consumo de energia, e nesse post vamos ver como utilizar esse módulo com o Arduino.

Display Oled I2C 128x64

OLED significa Organic Light-Emiting Diode, ou Diodo Emissor de Luz Orgânico. Esse tipo de display é composto por uma camada de material orgânico que é colocado entre dois eletrodos sendo que um deles geralmente é transparente. Esse material orgânico, ao ser estimulado por um campo eletromagnético, emite luz, dispensando assim o uso do backlight.

Conexão display OLED e Arduino

Vamos testar o display OLED com o Arduino Uno, realizando a comunicação via interface I2C por meio dos pinos analógicos A4 (SDA) e A5 (SCL):

Display OLED - Pinagem

O display aceita alimentação entre 3 e 5V, e não são utilizados componentes adicionais para conexão ao Arduino:

Circuito Arduino e Display Oled

Programa e biblioteca u8glib

No programa vamos utilizar a biblioteca U8Glib (download) para acionamento do display. Ela possui uma grande variedade de configurações para os mais diversos tipos de controladores e displays, bastando incluir a linha correspondente ao display que você está utilizando.

Na linha 22, selecionamos a linha referente ao controlador SSD1306 com interface I2C (U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK)), correspondente ao nosso display. Entre as linhas 10 e 21 temos outros exemplos de controladores suportados. Para uma lista completa desses controladores, verifique este link.

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 (u8g.drawStr()), desenhar retângulos (u8g.drawRFrame()), círculos (u8g.drawCircle()), assim como selecionar a fonte utilizada para o texto.

Utilizamos esses comandos para desenhar na parte superior da tela símbolos de bateria e sinal. Na parte inferior, mostramos uma sugestão de utilização para mostrar a hora atual, caso você queira utilizar o display com um módulo de relógio de tempo real como o DS1307, que abordamos neste artigo.

Arduino Uno e Display Oled

Também é possível utilizar os comandos disponíveis na biblioteca U8glib para desenhar retângulos preenchidos, triângulos, linhas, exibir imagens, etc. Uma lista completa dos comandos disponíveis na biblioteca você encontra aqui.

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

Posts Relacionados

55 Comentários

  1. Sou Professor com Licenciatura Plena em Física, estou trabalhando em experimentos ligados ao arduino na plataforma linux (de preferência) , este display é uma ótima sugestão para informação de tempo, temperatura, intensidade de luz, solar… Estou estudando aplicações do arduino no laboratório de física.
    Cordialmente, Renato

  2. Boa noite,
    Sou iniciante e estou tentando aprender do tipo copia cola, na tentativa de acerto, rsrsrs, é um pouco de exagero mas é quase isso, rsrsr,
    Bom como eu substituo esse por lcd nessa rotina.
    Ja alterei os dados no display, mas nao consigo mudar para essa rotina;;;;;
    usei este comando ” U8GLIB :: print (…) ” no lugar “lcd.print(Tempo)”

    if (SW1 10000) Tempo = 10000; // Se variável tempo for maior que 10000, faça igual a 10000
    lcd.print(” Delay de “); // Imprime no LCD
    lcd.print(Tempo); // Imprime no LCD
    lcd.print(” ms “); // Imprime no LCD
    delay(500); // Tempo de display do tempo
    }
    if (SW2 <500) // verifica se o switch2 está apertado
    { // Se estiver..
    lcd.setCursor(0, 1); // Posiciona curso do LCD posicão 1 (0) da linha 2 (1)
    Tempo = Tempo – 50; // Decrementa variável tempo em 50
    if (Tempo < 50) Tempo = 50; // Se variável tempo for menor que 50, faça igual a 50
    lcd.print(" Delay de "); // Imprime no LCD
    lcd.print(Tempo); // Imprime no LCD
    lcd.print(" ms "); // Imprime no LCD
    delay(500); // Tempo de display do tempo
    }
    if (SW3 <500) // verifica se o switch3 está apertado

    OBRIGADO

    1. Bom dia Carlos,

      Use o comando u8g.drawStr(x, y, “texto”), onde x e y são as coordenadas da tela onde o texto será posicionado, e texto é o que você quer escrever. Exemplo:

      u8g.drawStr( 115, 33, “Seu Texto Aqui”);

      Abraço.

      Adilson – Equipe FILIPEFLOP

      1. Obrigado

  3. boa tarde, você consigue montar algum tutorial para raspberry pi?

    1. Bom dia Marcos,

      Obrigado, é uma ótima sugestão para um post futuro.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  4. Boa tarde, queria saber se o display que é comprado neste site ja vem com a pinagem soldada na placa ??

    1. Bom dia Tomaz,

      Sim, ele já vai com os pinos soldados. Aguardamos sua compra.

      Abraço !

      Adilson – Equipe FILIPEFLOP

  5. Tutorial para o raspberry pi, tem como fazer?

    1. Boa tarde Joseph,

      Boa sugestão. Vamos providenciar.

      Abraço

      Adilson – Equipe FILIPEFLOP

  6. O comando u8g.drawStr(,,) exige que o argumento de texto seja uma constante. Procurei na biblioteca U8glib algum comando, e não achei nada que conseguisse referenciar à um parâmentro variável, por exemplo, a leitura de um sensor de temperatura. Como posso fazer isso? Obrigado!

    1. Bom dia Alex,

      Use o comando u8g.setPrintPos e u8g.print. Por exemplo:

      //Obtem os dados do sensor
      temperatura = analogRead(A0)
      //Define a posicao na tela
      u8g.setPrintPos(30, 50);
      //Mostra o valor da variavel Temperatura na posicao especificada
      u8g.print(temperatura);

      Abraço !

      Adilson – Equipe FILIPEFLOP

      1. Deu certo! Criei uma variável do tipo float que recebia o parâmetro de uma função getTemp(). Daí referenciei usando os comandos que indicou. Obrigado!

      2. É possível alterar o tamanha do texto, quando se imprime uma variável?

  7. Pessoal,

    Os links desse artigo para a página da biblioteca U8GLib são para o site do desenvolvedor no Google Code que, em breve, será desativado. O Google já anunciou o fim do serviço e a partir de 28/08/2015 todos os sites passarão a ser “read-only”, ou seja, não poderão mais ser atualizados.

    Com isso, o desenvolvedor do U8GLib já iniciou a migração de todo o conteúdo disponível no Google Code para o Github. Segue o novo link:

    https://github.com/olikraus/u8glib

    1. Excelente informação, obrigado Marcelo !

      Abraço

      Adilson – Equipe FILIPEFLOP

  8. olá, boa noite, eu estou pensando em fazer meu projeto de tcc, sobre comunicação do arduino com o comando de voz, mas não estou conseguindo entender a lógica.
    Alguém poderia me ajudar ou me indicar posts?

  9. comprei esse display e quero fazer com que imprima letras conforme eu aperte um botao. por exemplo botao 1 soma de 1 ate 24 e cada numero corresponde uma letra…botao 2 seria o enter, dai passaria para a proxima letra…mas to boiando em como fazer

  10. Gostaria de saber se é possível rotacionar as exibições principais e secundárias entre elas.

  11. Prezados,

    Conseguii rodar o código exemplo, porem a parte superior nao é mostrado em amarelo, apenas em azul
    Alguma ideia ? Seria um defeito do modulo ?

    ATt

    1. Bom dia Roberto,

      Provavelmente o display que você está utilizando tem somente a cor azul. Esse utilizado no post tem uma faixa amarela na parte superior e o restante em azul.

      Abraço.

      Adilson – Equipe FILIPEFLOP

  12. Adilson, boas!

    Desculpe o incômodo, mas já tentei utilizar esta biblioteca para o controle de um display OLED quase idêntico ao seu, mas utiliza comunicação SPI (4 pinos, D0,D1,RES e DC, além dos dois pinos de alimentação e do pino de CS, que é clear screen). Tentei utilizar algumas configurações específicas da biblioteca U8GLIB, mas nenhuma delas funcionou.
    Você tem conhecimento de qual configuração utilizar?

    Obrigado.

    1. Bom dia,

      Por favor veja este post, tem o que você precisa: http://www.arduinoecia.com.br/2015/01/display-oled-arduino-ssd1306.html

      Abraço!

      Adilson – Equipe FILIPEFLOP

  13. Bom dia, acabei de adquirir esse display de vocês, mas conectei como indicado e o display não acendeu.
    Tem alguma ideia do que possa estar ocorrendo? Liguei ele nos 5V do Arduino

  14. podia fazer um tutorial pra colocar bitmap, pois ta complicado kk

  15. Boa noite. Eu usei o tutorial acima, exatamente igual como está. Mas recebo um erro relacionado à linha 22.

    ‘U8G_I2C_OPT_NO_ACK’ was not declared in this scope

    Posso usar o construtor da linha 21?

    1. Bom dia José,

      Tente usar esse: U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);

      Abraço!

      Adilson – Equipe FILIPEFLOP

      1. Resolvido, obrigado.

        Aproveitando a boa vontade, como faço para conectar este display com o sensor HMC5883L ? Ambos usam os mesmos pinos ANALOG 4 e 5.

        Att

        José Antonio

        1. Boa tarde José,

          Você pode ligar os dois no mesmo barramento. É o mesmo esquema usado nesse post, com um módulo I2C de display e o DS1307: http://www.arduinoecia.com.br/2015/04/arduino-lcd-16×2-modulo-i2c-rtc-ds1307.html

          Abraço!

          Adilson – Equipe FILIPEFLOP

  16. Boa tarde,

    Queria saber sobre duas questões: se vocês tem disponível o datasheet deste display e se apresenta biblioteca para o LPC11u14.

    E desde já muito obrigado .

  17. Olá Pessoal , estou usando o mesmo display e um NANO + um BMP085 . o BMP e o display ambos usam a A4 e A5, e sempre que ligo ambos tenho erro na leitura do BMP … não posso ligar ambos na mesma porta ? Li a resposta dada ao José Antonio ali em cima dizendo que é possível usar o mesmo barramento .. no NANO também ? seria então algum problema no sensor?

    1. Boa tarde Thiago,

      Você usou resistores Pull-up ? Dê uma olhada neste artigo, por favor: http://electronics.stackexchange.com/questions/102611/what-happens-if-i-omit-the-pullup-resistors-on-i2c-lines

      Abraço!

      Adilson – Equipe FILIPEFLOP

      1. Olá Adilson. Eu também estou tentando ligar um arduino Uno rev. 3 + OLed 128×64 + bmp180. Consigo ligar o dislplay e imprimir na tela, porém não acesso o bmp180. Só se eu ligar somente o bmp180 sozinho ai funciona. Já coloquei resistores pull-up de 10K e 4k7, ambos sem sucesso. Se puder me dar uma ajuda fico feliz. Abraço!

  18. ola vc vende este display no seu site ?

    1. Boa tarde Daniel,

      Temos 3 tipos de display Oled, por favor entre no site https://www.filipeflop.com e faça uma procura por “oled”.

      Abraço!

      Adilson – Equipe FILIPEFLOP

  19. Boa noite Adilson,
    Estou começando com o arduino, já fiz algumas experiências bem sucedidas, outras mal sucedidas e assim vamos. Acontece que eu comprei o Display oled e estou aqui quebrando a cabeça para fazê-lo funcionar. Faço tudo direitinho mas ao compilar da sempre o mesmo erro:
    Arduino: 1.6.7 (Windows 7), Placa:”Arduino/Genuino Uno”

    open C:Program Files (x86)Arduinolibrarieslibraries: O sistema não pode encontrar o arquivo especificado.

    Erro compilando.

    Este relatório deveria ter mais informações
    “Mostrar saída verbosa durante a compilação”
    habilitado em Arquivo > Preferências.
    Se possível gostaria de ter a sua ajuda ou a ajuda dos demais colegas.
    Obrigado Um grande abraço

    Izaque Ferreira Supino
  20. Boa tarde.

    As ligações desse display com o arduino mega são as mesmas?

    obrigado.

  21. Boa noite. Com este display é poíssvel construir gráficos (plano cartesiano x e y). Gostaria de fazer um gráfico relacionando tempo x temperatura.

  22. qual o endereço i2c do display? onde está essa informação no código?

  23. Boa tarde, eu comprei esse display ontem no na loja FilipeFlop, e funcionou perfeitamente.
    No entanto, não consigo integrar ele no meu projeto, porque a U8glib.h é muito grande, e ao todo ocupa-se 114% da capacidade do espaço do programa.

    Existe como reduzir o tamanho da lib? Eu utilizo essas, mas a que mais ocupa realmente é a u8glib

    #include “U8glib.h” //Display
    #include //RFID
    #include //RFID
    #include “SoftwareSerial.h” // Preciso dele

    1. Boa tarde Pedro,

      O que eu notei é que quando você usa várias fontes com essa lib o consumo de memória cresce bastante. Tente utilizar apenas uma fonte no programa (pelo menos para testar).

      Abraço!

      Adilson – Equipe FILIPEFLOP

  24. Para ligar no MEGA 2560 R3, quais 0s procedimentos, tem que mudar a pinagem ou alguma coisa no código?

    1. coloque conforme as indicações do display em concordância com os pinos SCL e SDA próximos das saídas PWM.

  25. Pessoal,

    Quero usar esse display com o Particle Photon. Existe alguma biblioteca pra usar com ele?

    Thanks!
    Tulius

  26. Olá, estou usando o NodeMcu e gostaria de saber em quais pinos devo ligar o display?

  27. Boa tarde, estou iniciando agora na faculdade e estou fazendo um projeto, gostaria de saber qual botão posso utilizar c o display para mudar as opções de resultados. Por exemplo:

    Estou projetando uma bancada para aquisição de dados de corrente, tensão e torque de servo motores, e queria ter as 3 opções no display.

    Obrigado.

  28. Boa noite,
    Achei muito bom o Display e muito boa qualidade.
    Se possível, gostaria de tirar uma dúvida: Comprei o display Oled Amarelo Azul (456539), mas estou com dificuldade de mudar as cores. Você teria algum código de exemplo para enviar ?

    Grato pela atenção,

    1. Olá Jean,

      Não é possível mudar as cores do display OLED Amarelo Azul.
      Ele tem uma faixa na parte de cima que é sempre amarela e o restante do display é azul.

      Abraço!

      Giovanni Bauermeister
      1. Obrigado pelo retorno. Se as cores são fixas, então possivelmente o Display chegou errado, pois o que tenho aqui mostra tudo na cor branca.

        Abraço e obrigado novamente pelo esclarecimento
        Jean

  29. Eu testei o display com o arduino uno e funcionou normal porem com o mega ela não consegue identifica-lo . Utilizei o código do site: https://playground.arduino.cc/Main/I2cScanner
    Existe alguma diferença no uso com o mega ?
    Obrigado!

    1. Como sempre falta de observação, arduino mega 20 sda e 21 scl.

  30. Não funcionou.Deu o erro;

    sketch_aug07a:4: error: #include expects “FILENAME” or

    #include "U8glib.h"

    ^

    exit status 1
    #include expects “FILENAME” or

  31. BOa tarde. Preciso de Ajuda… A IDE NÃO RECONHECE A BIBLIOTECA COMO SENDO VÁLIDA.

    1. mm

      Boa tarde Leandro,

      Tente instalar a biblioteca à partir da própria IDE, no menu Sketch => Incluir Biblioteca => Gerenciar Bibliotecas. Procure por U8GLIB.

      Abraço!

      Adilson – Equipe FILIPEFLOP

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *