Usar um display Oled Arduino é uma tarefa muito tranquila quando você tem a biblioteca certa. Neste post, vamos mostrar como usar um display Oled SSD1306 com Arduino Uno.
Você já deve ter ouvido falar em telas OLED. Esse tipo de tela é utilizada principalmente em televisores, monitores de computador e telefones celulares/smartphones.
Oferecem várias vantagens por serem mais finas, leves e flexíveis do que as tradicionais telas de LED, além de consumirem menos energia.
Felizmente, no Arduino também podemos utilizar esse tipo de display. Antes de mostrar como fazer isso, vamos ver um pequeno resumo sobre a tecnologia OLED.
Como funciona a tecnologia OLED ?
OLED significa Organic Light-Emitting Diode, ou Diodo Emissor de Luz Orgânico. Consiste basicamente em uma camada de semicondutor orgânico, situado entre dois eletrodos, sendo que um deles geralmente é transparente.
Essa camada orgânica, ao ser estimulada por um campo eletromagnético, emite luz nas cores vermelho, verde e azul (o nosso conhecido RGB), que é a base de cores que os displays utilizam para gerar imagens.
Uma das vantagens do OLED, que resulta em uma economia considerável de energia, é que ele não precisa de uma luz traseira (backlight) como as telas de LCD/LED convencionais.
O próprio material orgânico tem uma propriedade chamada Eletroluminescência (EL), que faz com que o material “brilhe” ao ser estimulado por uma corrente ou um campo elétrico.
Por fim, sua estrutura permite que sejam construídas telas flexíveis com ótima resolução e qualidade de cor.
Display OLED SSD1306 no Arduino
Um dos displays OLED disponíveis para Arduino é mostrado na imagem inicial do post, que possui controlador SSD1306 (datasheet).
A tela tem 0,96 polegadas e resolução de 128×64 pixels. Apesar de parecer pequena, ela é perfeita para mostrar dados como data, hora, temperatura, pressão e outras informações de forma clara e com excelente qualidade.
Esse display tem a cor amarela na parte superior (uma pequena faixa), e o restante na cor azul.
A conexão com o Arduino, segundo o fabricante, pode ser feita por meio da interface SPI ou da interface I2C, alterando-se a configuração de resistores na parte traseira da placa.
Ligação do display Oled ao Arduino
Vamos ligar esse display ao Arduino utilizando a interface SPI, que é o modo padrão de funcionamento do display. A alimentação da placa pode ser feita tanto com 3.3V como 5V.
Se o seu display Oled tem a conexão I2C, não tem problema: temos vários posts sobre display Oled com esse tipo de conexão, ok?
Antes de ligar o seu display ao Arduino, verifique se o mesmo utiliza nível de sinal de 3.3 ou 5V, já que eu encontrei na internet várias informações de displays desse modelo que trabalham com 3.3V e não podem ser ligados diretamente, por exemplo, ao Arduino Uno.
Utilize o seguinte esquema para conectar os pinos do display ao Arduino :
- Pino GND do módulo ao GND do Arduino
- VCC do módulo ao 5V do Arduino
- D0 ao pino 10 do Arduino
- D1 ao pino 9 do Arduino
- RES (Reset) ao pino 13 do Arduino
- DC ao pino 11 do Arduino
- CS ao pino 12 do Arduino
Bibliotecas e programa
Testei algumas bibliotecas mas a que funcionou melhor foi a da Adafruit, que na verdade são 2 bibliotecas , a Adafruit_SSD1306 e a Adafruit_GFX. Elas permitem que você trabalhe tanto com texto como com gráficos.
Dúvidas na instalação da biblioteca? Confira o post Como instalar uma biblioteca na IDE Arduino.
O programa abaixo utiliza como base o programa de exemplo ssd1306_128x64_spi, que já vem nessa biblioteca.
Separei algumas funções de texto e gráficos apenas para montar o programa exemplo, mas recomendo que você utilize o exemplo da própria biblioteca para verificar os outros recursos que estão inclusos.
// Programa : Display OLED Arduino // Autor : Arduino e Cia // // Baseado no programa exemplo da biblioteca Adafruit #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // Definicao de pinos interface SPI #define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 13 Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif void setup() { Serial.begin(9600); // Inicializa o display display.begin(SSD1306_SWITCHCAPVCC); // Apaga o display display.clearDisplay(); } void loop() { texto_inicial(); delay(5000); display.clearDisplay(); texto_scroll(); delay(2000); display.clearDisplay(); retangulo_preenchido(); delay(2000); display.clearDisplay(); retangulo(); delay(2000); display.clearDisplay(); barras(); delay(2000); display.clearDisplay(); led_exemplo(); delay(2000); display.clearDisplay(); } void texto_inicial(void) { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println(" arduinoecia.com.br"); display.println(); display.setTextSize(2); display.print(" Arduino"); display.println(" e"); display.println(" Cia "); display.display(); } void texto_scroll(void) { display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(10,0); display.clearDisplay(); display.print(" Arduino"); display.println(" e"); display.println(" Cia "); display.display(); display.startscrollright(0x00, 0x0F); delay(1000); display.stopscroll(); delay(1000); display.startscrollleft(0x00, 0x0F); delay(1000); display.stopscroll(); delay(1000); display.startscrolldiagright(0x00, 0x07); delay(2000); display.startscrolldiagleft(0x00, 0x07); delay(2000); display.stopscroll(); } void retangulo_preenchido(void) { uint8_t color = WHITE; for (int16_t i=0; i<display.height()/2-2; i+=2) { display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i, display.height()/4, color); if (color == WHITE) color = BLACK; else color = WHITE; display.display(); } } void retangulo(void) { for (int16_t i=0; i<display.height()/2; i+=2) { display.drawRect(i, i, display.width()-2*i, display.height()-2*i, WHITE); display.display(); } } void barras(void) { display.setTextSize(2); // Texto fundo invertido display.setTextColor(BLACK,WHITE); display.setCursor(0,0); display.println("SINAL"); int numero = 5; for (int i = 0 ; i <10 ; i++) { display.fillRect(numero, 40-(i*2), 10, 64-(40-(i*2)), WHITE); numero = numero + 12; } display.display(); } void led_exemplo(void) { display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(30,0); display.println("STATUS"); display.drawLine(0, 15, 128, 15, WHITE); display.setCursor(0,17); display.println("Sensor 1"); display.drawCircle(121,24, 6, WHITE); display.println("Sensor 2"); display.fillCircle(121,39, 6, WHITE); display.println("Sensor 3"); display.drawCircle(121,54, 6, WHITE); display.display(); }
A linha display.display(), que aparece várias vezes no programa, mostra os resultados dos comandos na tela.
Assim, se você utilizar um comando para escrever um texto, use em seguida o display.display(). Isso faz com que o comando seja efetivamente executado e mostrará o que você quer no display. A mesma coisa depois que desenhar um quadrado, um círculo, etc.
Neste vídeo, o programa acima em funcionamento :
Gostou? Confira outros posts com display aqui mesmo no Arduino e Cia!