Como conectar o Display Oled ao Arduino 108

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. Fique atento pois alguns displays podem vir com os pinos de alimentação invertidos, ok?

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: MakerHero

#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? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

108 Comentários

  1. Olá pessoal, eu estava procurando um código para um relogio com arduino que usasse a biblioteca U8g2lib quando me deparei com esse artigo do Adilson Thomsen, gostei muito, acrescentei um RTC e adaptei a biblioteca para que funcionasse como a U8g2lib e implementei um relogio simples mas funcional.

    Posto agora as mudanças que fiz no código para que meu relogio funcionasse como eu queria.
    Se os senhores acharem por bem apagar esse post podem apagar sem problemas.

    Obrigado Adilson pela matéria.

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

    #include “U8g2lib.h”
    #include
    #include
    #include

    DS3231_Simple clock;
    DateTime t;
    Neotimer tempo = Neotimer(400);

    // 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);
    U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g(U8G2_R0);

    void draw()
    {
    t = clock.read();
    //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(u8g2_font_helvB08_tn);
    u8g.setFont(u8g2_font_ncenB18_tn);
    u8g.setCursor(10,48);
    u8g.print(t.Hour / 10);
    u8g.print(t.Hour % 10);
    u8g.drawStr( 40, 45, “:”);
    u8g.setCursor(50,48);
    u8g.print(t.Minute / 10);
    u8g.print(t.Minute % 10);
    u8g.drawStr( 80, 45, “:”);
    u8g.setCursor(90,48);
    u8g.print(t.Second / 10);
    u8g.print(t.Second % 10);
    //Texto – AM
    //u8g.setFont(u8g2_font_5x7_tn);
    //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);

    if(tempo.debounce(!digitalRead(7)))
    {
    t.Hour++;
    if(t.Hour > 23) t.Hour = 0;
    clock.write(t);
    }

    if(tempo.debounce(!digitalRead(8)))
    {
    t.Minute++;
    if(t.Minute > 59) t.Minute = 0;
    clock.write(t);
    }
    }

    void setup(void)
    {
    Serial.begin(9600);
    u8g.begin();
    clock.begin();
    tempo.start();
    pinMode(7,INPUT_PULLUP);
    pinMode(8,INPUT_PULLUP);
    }

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

    delay(50);
    }

  2. Boa tarde, fiz o upload desse código no arduino uno e montei corretamente o circuito, porém a tela não liga, o que pode ser?

    1. Olá.

      Verifique se você descomentou a linha correta referente ao display que está sendo usado.

      E verifique se não há algum mau contato nas ligações elétricas, preferencialmente pegue um multímetro em modo de continuidade e veja se está tudo dando contato.

      Att.
      Vitor Mattos.
      Suporte Técnico MakerHero.

  3. Boa tarde, esse display é compatível com O Arduino Uno SMD? Posso ligar e programar da mesma forma?

    1. Olá.

      É compatível sim. Na verdade é compatível com qualquer placa que tenha comunicação i2c.

      Att.

      Vitor Mattos.
      Suporte Técnico MakerHero.

  4. bom dia estou usando esse código para exibir no display o valor de um potenciômetro esse valor controla a velocidade de um motor de passo, tudo funciona bem porem quando eu coloco no void loop a linha de código q faz o Oled atualizar o motor de passo começa a engasgar, isso também esta acontecendo com a biblioteca da adafruit, quanto ao motor estou usando a biblioteca AccelStepper.h e um drive A4988

    1. Olá,

      As instruções de escrita e atualização da tela, dependendo de como são feitas, consomem tempo e causam esses engasgos no motor.
      Aqui um post a respeito(em inglês): https://forum.arduino.cc/t/stepper-motor-rotary-encoder-oled-display-while-stepper-turn/475754/3
      Duas alternativas são tentar aumentar a frequência da transmissão I2C, ou trocar para uma tela com interface SPI.

      Abraços!
      Vinícius – Equipe MakerHero

  5. Olá.
    Essa biblioteca é compatível com ESP8266?
    Obrigado!

    1. Olá,

      Não, ela não é compatível, porém a versão 2 do mesmo desenvolvedor é.
      Você pode encontrá-la aqui: https://github.com/olikraus/u8g2
      Ou no gerenciador de bibliotecas do Arduino buscando por u8g2.

      Abraços!
      Vinícius – Equipe MakerHero

  6. Como faço pra imprimir um valor variável, como o valor de um potenciômetro? Tentei de varias maneira mas não aparece no display. Meu display é um LCD 128×64 e estou usando essa biblioteca.

    1. Olá Felipe,

      Tente usar o comando ug8.println(variável)

      Abraços!
      Vinícius – Equipe MakerHero

  7. Primeiramente obrigado pela postagem, ajudou muito. Estou montando um leitor rpm para o carro, usei um lcd mas não gostei do resultado (esteticamente), comprei um oled deste com letras brancas, usei o seu código, ficou muito bom, mas a atualização da tela é um pouco lenda, dando alguns “errinhos” na sobreposição de números (ocasionalmente). Você saberia dizer a taxa de atualização deste tipo de tela? Obrigado.

    1. Thiago

      Isso acontece mais pelo código ser “pesado”, do que a taxa de atualização do display. O ideal é tentar enxugar o máximo o código para que fique mais fácil de processar.

      Abraços!
      Diogo – Equipe MakerHero

  8. Boa Noite professor!
    Estou tentando copilar o código e esta dando esse erro!

    ssd1306_128x64_i2c:4:10: fatal error: U8glib.h: No such file or directory

    #include “U8glib.h”

    ^~~~~~~~~~

    compilation terminated.

    exit status 1
    U8glib.h: No such file or directory

    1. Hideki,

      Você instalou a biblioteca U8glib.h? https://github.com/olikraus/U8glib_Arduino

      Abraços!
      Diogo – Equipe MakerHero

  9. Saudações,

    Como ligo esse display em um Arduino MEGA 2560, sou iniciante am Arduino, embora seja da área de TI rs

    Obrigado.

    1. Paulo,

      Para o pino SDA do display: Pino 20 ou 52 do MEGA.
      Para o pino SCL do display: Pino 21 ou 51 do MEGA

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

  10. Gostei muito do tutorial!

    1. Nilce,

      Que bom que curtiu! Ficamos extremamente felizes com isso 🙂

      Abraços!
      Diogo – Equipe MakerHero

  11. Tem como controlar o backlight do oled com a u8glib ou qualquer outra biblioteca

  12. Boa noite.
    desculpem mas da para usar a seguimte estrutura com o vosso exemplo?
    void setup() {
    // put your setup code here, to run once:

    }

    void loop() {
    // put your main code here, to run repeatedly:

    }

    sou iniciado e nao consigo inserir o vosso codigo usando apenas”void setup e void loop “.
    obrigado

    1. Olá, Vitor!

      Basta excluir todo o código que tem na sua IDE do Arduino e copiar todo o código aqui do site para lá.

      Abraços!
      Diogo – Equipe MakerHero

      1. Boa tarde, estou com o OLED ssd1306 128×32 e um ESP8266Wifi, o que eu mudaria no código para compilar e testar meu display?
        Desde já agradeço…

  13. um pequena dúvida: assim que o OLED é energizado ele deveria mostrar alguma coisa? Não consigo fazê-lo funcionar, estou com suspeita que esta com problema (ou o problema sou eu :-). Obrigado

    1. Olá, Fabricio.

      Para que apareça alguma coisa no display, é necessário que você programe seu Arduino para que ele envie algo para o display 😉

      Abraços!
      Diogo – Equipe MakerHero

  14. Boa tarde, fui testar o codigo e está dando o seguinte erro:

    C:\Users\Usuário\Desktop\Arduino\libraries\U8glib\utility\u8g_rot.c:48:1: warning: initialization from incompatible pointer type

    u8g_dev_t u8g_dev_rot = { u8g_dev_rot_dummy_fn, NULL, NULL };

    ^

    C:\Users\Usuário\Desktop\Arduino\libraries\U8glib\utility\u8g_rot.c:48:1: warning: (near initialization for ‘u8g_dev_rot.dev_fn’)

    alguém pode me ajudar?

    1. Olá Larissa,

      Você instalou a biblioteca U8Glib corretamente?

      Abraço!
      Rosana – Equipe MakerHero

  15. OLA,
    pode fazer um tutorial sobre o sensor de presença acendendo um LED?
    Obrigado!!

    azedas

    1. Olá Azedas!

      Só seguir este post aqui:
      https://www.makerhero.com/blog/acendendo-uma-lampada-com-sensor-de-presenca/

      E trocar o transistor pelo LED.

      Abraços!

      André – Equipe MakerHero

  16. Onde eu acho o DataSHeet dele ? quero ver as medidas entre os furos de fixação.

    1. Olá Antonio!

      Os furos têm aproximadamente 2 mm de diâmetro.

      Abraços!

      André – Equipe MakerHero

  17. Recebi meu display (Display OLED 0.96″ I2C Azul Amarelo, ref. 5LE01) ontem. Ao testar, vi que metade das linhas não acende. O vidro do display também veio quebrado em um dos cantos.

    Vejam aqui: https://drive.google.com/file/d/1N1WBwaxt0F_gjhLcW4jHeGensQr7wVec/

    Sabem dizer se isso é configuração ou se é um defeito?

    1. Olá!

      Parece que foi quebrado. Talvez pode ter acontecido durante o transporte?

      Abraços!

      André Rocha – Equipe MakerHero

  18. Boa noite,

    são 01h00 da madrugada, estou há mais de 05 horas tentando inserir o código do OLED de vocês nesse meu programa, e não tem como fazer funcionar, já tentei quase tudo, tem como dar uma luz? É um trabalho de escola e preciso entregar ainda essa semana, desde já agradeço: (estou fazendo um odometro, não consigo imprimir no OLED a variável (counter) — na tela da IDE está funcionando corretamente com o comando: Serial.println(counter);

    /* Simple Counter
    * ————
    *
    * This is a simple counter that takes a digital input
    *
    */

    int ledPin = 3; // choose the pin for the LED
    int switchPin = 2; // choose the input pin (for a pushbutton)
    int val = 0; // variable for reading the pin status
    int counter = 0;
    int currentState = 0;
    int previousState = 0;

    void setup() {
    pinMode(ledPin, OUTPUT); // declare LED as output
    pinMode(switchPin, INPUT); // declare pushbutton as input
    Serial.begin(115200);
    }

    void loop(){
    val = digitalRead(switchPin); // read input value
    if (val == HIGH) {
    // check if the input is HIGH (button released)
    //digitalWrite(ledPin, HIGH); // turn LED on
    digitalWrite(ledPin, LOW);/// led apaga devido a alteração do nível da porta lógica 3
    delay(10); /// tempo que o led fica aceso – em milisegundos
    digitalWrite(ledPin, HIGH); // turn LED off

    currentState = 1;
    }
    else {
    //digitalWrite(ledPin, LOW); // turn LED off
    //digitalWrite(ledPin, HIGH);
    currentState = 0;
    }
    if(currentState != previousState){
    if(currentState == 1){
    counter = counter + 1;
    Serial.println(counter);
    }
    }
    previousState = currentState;
    //delay(250);
    }

    1. Olá Alexandre!

      Para colocar no display, você deve transformar a sua informação (int) em uma string.

      Abraços!

      André – Equipe MakerHero

  19. alguem sabe me disser como eu faço pra conectar um display oled spi colorido em um arduino micro? pfvr me tirem essa duvida, não achei resposta em nenhum outro site…

  20. o que é#include “U8GLIh”
    ?e como faço para dar certo o meu codigo?

    1. Olá!

      Ele é uma biblioteca, você deve adicioná-la para seu projeto funcionar.

      Para adicionar uma biblioteca você deve ir em “Sketch -> Incluir Bibliotecas -> Gerenciar bibliotecas” no gerenciador de bibliotecas você pode buscar a biblioteca que deseja.

      Outra opção é baixá-la em .ZIP e adicionar na IDE do Arduino. Para isso, vá em “Sketch -> Incluir Bibliotecas -> Adicionar Biblioteca .ZIP”

      Abraços!

      André – Equipe MakerHero

  21. sou iniciante ainda, quero usar esse display no arduino mega, mas o A5 e A4 dele estão em uso, teria como trocar essas portas para o comunicação?

    1. Olá Emanuel!

      No Arduino MEGA as portas SDA e SCL são outras, está escrito na placa, são os pinos 20 e 21.

      Abraços!

      André – Equipe MakerHero

  22. Boa tarde
    Mensagem abaixo esta dando mensagem de erro: ‘u8g’ não foi declarado neste escopo
    was not declared in this scope
    void loop(void)
    {
    u8g.firstPage();
    do
    {

    Poderia me ajudar a solucionar?

    1. Olá Carlos!

      Você baixou e adicionou a biblioteca corretamente?

      Se sim, sugiro refazer mesmo assim, pois esse problema parece com a biblioteca.

      Abraços!

      André – Equipe MakerHero

      1. Baixei denovo e não funciona

        1. void loop(void)
          {
          u8g.firstPage();
          do
          ‘u8g’ was not declared in this scope

          A biblioteca está baixada de forma correta
          Esse comando está correto?

          1. Olá Carlos!

            Acabei de compilar o mesmo código e foi normalmente.

            Você já procurou essa biblioteca na própria IDE do arduino?

            Abraços!

            André – Equipe MakerHero

            Código copiado diretamente da minha IDE aqui:
            #include “U8glib.h”
            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);
            }

  23. Olá Adilson, antes de mais nada , PARABÉNS pelos temas tão bem abordados e explicados, só um comentário a respeito do display OLED, acredito que nem todos têm a mesma sequência de pinagem, por exemplo o que eu tenho aqui em relação ao q vc utilizou no projeto, os pinos de alimentação estão invertidos, ou seja, no meu OLED da esquerda para direita, os pinos são Vcc, Gnd, Scl, Sda.
    Abç.

    1. Boa tarde,

      Realmente alguns displays podem vir com a pinagem invertida. Como está bem visível na parte superior do display, não costuma ser um problema, mas vou modificar o texto para alertar os outros usuários.

      Abraço e obrigado!

      Adilson – Equipe MakerHero

  24. Olá, quando preciso mudar de tela, uma sobrepõe a outra. Tem alguma função clear?

  25. Parabéns pelo tutorial.
    Funcionou de primeira.

  26. Ola, eu gostaria de usar o display para mostrar uma valor lindo no potenciometro, ou seja , enquanto eu giro o potenciometro vai modificando o valor na tela do display, é possivel?

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

    1. 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 MakerHero

  28. Não funcionou.Deu o erro;

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

    #include "U8glib.h"

    ^

    exit status 1
    #include expects “FILENAME” or

  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. 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!

      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

  31. 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.

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

  33. Pessoal,

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

    Thanks!
    Tulius

  34. 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.

  35. Boa tarde, eu comprei esse display ontem no na loja MakerHero, 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 MakerHero

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

  37. 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.

  38. Boa tarde.

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

    obrigado.

  39. 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

  40. ola vc vende este display no seu site ?

    1. Boa tarde Daniel,

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

      Abraço!

      Adilson – Equipe MakerHero

  41. 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 MakerHero

      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!

  42. 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 .

  43. 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 MakerHero

      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 MakerHero

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

  45. 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

    1. 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 [email protected] para instruções sobre a troca.

      Abraço!

      Adilson – Equipe MakerHero

  46. 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 MakerHero

  47. 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 MakerHero

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

  49. 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

  50. 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?

  51. 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 MakerHero

  52. 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 MakerHero

      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?

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

    1. Boa tarde Joseph,

      Boa sugestão. Vamos providenciar.

      Abraço

      Adilson – Equipe MakerHero

  54. 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 MakerHero

  55. 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 MakerHero

  56. 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 MakerHero

  57. 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

Trackbacks and Pingbacks

  1. […] OLED 128×64, utilizando a mesma ligação via interface I2C e biblioteca que usamos no post Como conectar o display OLED ao Arduino. Já o pino AOUT do sensor MQ-3 será ligado à porta analógica A1 do […]