Como conectar o Display Oled ao Arduino

Como conectar o Display Oled ao Arduino

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.

// Programa: Teste Display OLED SSD1306
// Autor: FILIPEFLOP

#include "U8glib.h"

// setup u8g object, please remove comment from one of the following constructor calls
// IMPORTANT NOTE: The following list is incomplete. The complete list of supported 
// devices with all constructor calls is here: http://code.google.com/p/u8glib/wiki/device

//U8GLIB_ST7920_192X32_4X u8g(10);		// SPI Com: SCK = en = 13, MOSI = rw = 11, CS = di = 10, HW SPI
//U8GLIB_ST7920_202X32_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_202X32_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16);   // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16
//U8GLIB_ST7920_202X32_1X u8g(18, 16, 17);	// SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17
//U8GLIB_DOGXL160_2X_GR u8g(13, 11, 10, 9);	// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_PCD8544 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//U8GLIB_PCF8812 u8g(13, 11, 10, 9, 8);		// SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, Reset = 8
//U8GLIB_ILI9325D_320x240 u8g(18,17,19,U8G_PIN_NONE,16 );  			// 8Bit Com: D0..D7: 0,1,2,3,4,5,6,7 en=wr=18, cs=17, rs=19, rd=U8G_PIN_NONE, reset = 16
//U8GLIB_SBN1661_122X32 u8g(8,9,10,11,4,5,6,7,14,15, 17, U8G_PIN_NONE, 16); 	// 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 cs1=14, cs2=15,di=17,rw=16,reset = 16
//U8GLIB_SSD1306_128X64 u8g(10, 9);		// HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);	// Fast I2C / TWI 
//U8GLIB_SSD1306_128X64_2X u8g(U8G_I2C_OPT_NONE);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);	// Display which does not send AC

void draw() 
{
  //Comandos graficos para o display devem ser colocados aqui
  //Seleciona a fonte de texto
  u8g.setFont(u8g_font_8x13B);
  //Linha superior - temperatura 
  u8g.drawStr( 5, 15, "23");
  u8g.drawCircle(28,8,3);
  u8g.drawStr( 34, 15, "C");
  //Hora
  u8g.setFont(u8g_font_fub30);
  u8g.drawStr( 10, 57, "09:35");
  //Texto - AM
  u8g.setFont(u8g_font_5x7);
  u8g.drawStr( 115, 33, "AM");
  //moldura relogio
  u8g.drawRFrame(0,18, 128, 46, 4);
  //Desenho bateria
  u8g.drawRFrame(105, 3, 20,12 , 0);
  u8g.drawBox(125, 6, 2,6);
  u8g.drawBox(107, 5, 4,8);
  u8g.drawBox(114, 5, 4,8);
  //Desenho linhas sinal
  u8g.drawVLine(99,0, 15);
  u8g.drawVLine(98,0, 15);
  u8g.drawVLine(96,4, 11);
  u8g.drawVLine(95,4, 11);
  u8g.drawVLine(93,8, 7);
  u8g.drawVLine(92,8, 7);
  u8g.drawVLine(90,12, 3);
  u8g.drawVLine(89,12, 3);
}

void setup(void) 
{
  Serial.begin(9600);
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255,255,255);
  }
}

void loop(void) 
{
  u8g.firstPage();  
  do 
  {
    draw();
  } while( u8g.nextPage() );
  
  delay(50);
}

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!

5
Como conectar o Display Oled ao Arduino
87 votos, 4.87 classificação média (97% 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

47 Comentários

  1. Gabriel - 5 de junho de 2017

    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.

  2. Cleiton - 21 de fevereiro de 2017

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

  3. Tulius Lima - 30 de janeiro de 2017

    Pessoal,

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

    Thanks!
    Tulius

  4. Flavio - 28 de janeiro de 2017

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

  5. PEDRO H - 18 de novembro de 2016

    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

    • Adilson Thomsen - 22 de novembro de 2016

      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

  6. fabiano - 14 de novembro de 2016

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

  7. vinicius may - 18 de outubro de 2016

    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.

  8. Lucas Godoy - 14 de outubro de 2016

    Boa tarde.

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

    obrigado.

  9. Izaque Ferreira Supino - 28 de setembro de 2016

    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)\Arduino\libraries\libraries: 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

  10. daniel - 30 de agosto de 2016

    ola vc vende este display no seu site ?

  11. Thiago Macedo - 16 de agosto de 2016

    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?

  12. Matheus - 22 de junho de 2016

    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 .

  13. José Antonio - 13 de junho de 2016

    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?

  14. arthur joseph - 10 de junho de 2016

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

  15. guilherme - 2 de maio de 2016

    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

    • Adilson Thomsen - 13 de maio de 2016

      Bom dia Guilherme,

      Por favor confira se as conexões estão corretas, e se por acaso os pinos SCL e SDA não estão com a ligação invertida.

      Caso realmente não funcione pode ser um problema no display e peço que entre em contato pelo email vendas@filipeflop.com para instruções sobre a troca.

      Abraço!

      Adilson – Equipe FILIPEFLOP

  16. Jaldomir - 29 de abril de 2016

    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.

  17. Roberto - 21 de abril de 2016

    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

    • Adilson Thomsen - 22 de abril de 2016

      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

  18. Arthur Laini - 22 de janeiro de 2016

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

  19. Fernando - 8 de agosto de 2015

    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

  20. marcelo - 4 de agosto de 2015

    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?

  21. Marcelo Cutin - 30 de julho de 2015

    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

  22. Alex - 24 de julho de 2015

    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!

    • FILIPEFLOP - 24 de julho de 2015

      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

  23. joseph - 23 de julho de 2015

    Tutorial para o raspberry pi, tem como fazer?

  24. Tomaz - 20 de julho de 2015

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

  25. marcos - 8 de julho de 2015

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

  26. carlos - 18 de junho de 2015

    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

  27. Renato Costa Mena Barreto - 15 de junho de 2015

    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

Deixe uma resposta