Projeto 90 - Como controlar um Display OLED SSD1306 com Arduino - biblioteca Adafruit

Básico - Projeto 90

Controlando um display Oled SSD1306 - bibliotecas Adafruit

Objetivo

Neste projeto vamos mostrar como utilizar um display OLED SSD1306 com Arduino. No projeto mostraremos como instalar e utilizar o display para visualizar caracteres, símbolos e desenhos através das bibliotecas Adafruit_GFX e Adafruit_SSD1306 via comunicação I2C ou SPI. Utilizamos no projeto um Display OLED 0.96″ I2C Azul Amarelo com controlador SSD1306, mas você poderá utilizar qualquer display Oled SSD1306.

Definições

Atenção: Não utilize o display em locais molhados ou úmidos, pois a água pode danificar o componente.

Display OLED (Organic Light-Emitting Diode, ou Diodo Emissor de Luz Orgânico): Display gráfico com alto contraste, excelente nitidez, leve e muito econômico, pois como possui luz própria não precisa de backlight utilizado nas telas de LCD ou LED, por exemplo. Outra grande vantagem do display OLED é possibilidade de gerar imagens. Como desvantagens, o display possui uma vida útil menor (entre 10mil e 40mil horas de uso) e não deve ser utilizado em locais úmidos, pois a água danifica facilmente o componente.

Funcionamento: O display OLED é formado por camadas de material orgânico posicionadas entre eletrodos. O material orgânico tem uma propriedade denominada de eletroluminescência (EL) que faz com que o material "ilumine" ao ser estimulada por uma corrente elétrica ou por um campo eletromagnético. Portanto, essa camada orgânica quando estimulada emite luz nas cores vermelho, verde e azul (RGB), que é o padrão utilizado nos displays gráficos.

Display OLED SSD1306: É um display OLED que possui um controlador SSD1306. Este chip é responsável por fazer o controle entre o dispositivo e algum microcontrolador ou CPU. No caso, vamos utilizar o ATmega328 como microcontrolador (Arduino UNO).

a) Comunicação com o microcontrolador: O poderoso controlador CMOS OLED SSD1306 pode se comunicar com o microcontrolador Arduino de várias formas, incluindo I2C e SPI (as mais comuns). O protocolo de comunicação I2C requer apenas 2 pinos de conexão, enquanto que o SPI requer mais pinos de conexão, porém é geralmente mais rápido.

 b) Resolução, tamanho e cores: Graças a versatilidade do controlador SSD1306, o display pode ser fornecido em diferentes tamanhos e cores. Por exemplo, temos os OLEDs com resolução 128X64 (0,96") e OLEDs 128X32 (0,91") nas cores branco, azul, dual color (azul com uma faixa amarela na parte superior) ou colorido.

 c) Alimentação: Como já mencionamos anteriormente, o display OLED funciona sem a necessidade de luz de fundo porque produz a sua própria luz. Isto explica o seu alto contraste, nitidez e o seu baixo consumo de energia. Em média, o display usa no máximo 20mA de corrente. O display poderá ser conectado perfeitamente em qualquer microcontrolador lógico de 3.3V a 5V sem a necessidade de nenhum conversor.

d) Mapa de memória OLED: Independente do tamanho do display OLED, o driver SSD1306 possui 1KB de memória RAM embutida. Esta área de memória de 1K é organizada em 8 faixas (páginas de 0 a 7). Cada página contém 128 colunas (blocos de 0 a 127) e cada coluna pode armazenar 8 bits de dados (de 0 a 7). Portanto, temos 8 páginas X 128 colunas X 8 bits = 1024 bytes = 1kB de memória.

Obs.: A tela OLED 128 X 64 poderá exibir todo o conteúdo da RAM (8 páginas = 1Kb), enquanto que a tela OLED 128 X 32 exibe apenas a metade (4 páginas = 512bytes)

e) Especificação geral:

 Resolução  128 X 64 pixels  128 X 32 pixels
 Tamanho da tela  0.96 Inch Across  0.91 Inch Across
 Comunicação  I2C ou SPI  I2C ou SPI
 Controlador  SSD1306  SSD1306
 Tensão de operação  3.3V – 5V  3.3V – 5V
 Corrente de operação  20mA max   20mA max
 Ângulo de visão  160°   160°
 Caracteres por linha  21   21
 Número de faixas  8   4
 Dimensão do módulo  30 x 27 X 2,5mm  38 x 12 x 2,5 mm

Aplicação

Para fins didáticos e projetos onde é necessária a exibição de dados. Ideal para projetos que precisam exibir figuras geométricas, textos com fontes e tamanhos variados, caracteres especiais e figuras plotadas a partir de uma imagem em bitmap ou que exijam baixo consumo de energia.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 830 pontos

Jumpers Kit cabos ligação macho / macho 1  
Display OLED

Display OLED SSD1306

1 Tarzan Componentes Eletrônicos | Shield Arduino| Display Oled 1.3 Polegadas  Branco 125x64 I2c - R$ 51,90

 

– Tensão de operação: 3,3-5V
– Controlador: SSD1306
– Cor: Azul e Amarelo
– Comunicação: I2C
– Resolução: 128×64
– Dimensões: 30 x 27mm

Você também poderá utilizar na cor azul, branco ou colorido.

A comunicação poderá ser I2C ou SPI

 

Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo (display OLED com comunicação I2C). Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.


Atenção

Comunicação I2C

1. Para a montagem do display OLED SSD1306 via protocolo I2C, verifique a "pinagem" do módulo com comunicação I2C:

Obs.: Em algumas marcas os pino Vcc e GND estão invertidos. Portanto, preste atenção fazer a conexão correta.

 

 1.1. Faça a conexão dos pinos SCL e SDA com o Arduino da seguinte forma:

 MICROCONTROLADOR  SCL  SDA
 Arduino Uno  A5  A4
 Arduino Nano  A5  A4
 Arduino Mega  21  20
 Leonardo/Micro  3  2

1.2. No nosso projeto utilizamos um display OLED SSD1306 I2C e Arduino Uno. Veja abaixo como fizemos a conexão.

Comunicação serial SPI

2. Para a montagem do display OLED com comunicação SPI, temos os seguintes pinos: GND, VCC, (CLK ou D0), (MOSI ou D1), RES e DC.

2.1. Abaixo temos os modelos mais comuns de display OLE com comunicação serial SPI:

Obs.:  O modelo mais à esquerda possui 6 pinos e pode ser ligado nas 2 formas (I2C e SPI)

2.1. Recomendamos para uso nos projetos deste tutorial, a seguinte configuração com o microcontrolador Arduino UNO (usar a mesma ordem dos pinos nos modelos com 7 pinos acima):

 

3. A montagem do nosso exemplo foi realizada em um protoboard com 400 pontos e com um display OLED SSD1306 com comunicação via protocolo I2C. Verifique sempre se o seu protoboard possui linhas de alimentação contínuas ou separadas - saiba mais em protoboard.

Incluindo as bibliotecas Adafruit SSD1306 e Adafruit GFX

Para utilizar o controlador SSD1306 vamos incluir a biblioteca Adafruit SSD1306. Esta biblioteca foi escrita para resolver a complexidade do controlador SSD1306, oferecendo comandos simples para facilitar o controle de operação do display OLED.

Para obtermos uma experiência completa, precisamos instalar também a biblioteca Adafruit GFX para exibir elementos gráficos primitivos como pontos, linhas, círculos, retângulos, etc.

Instalação das bibliotecas

1. No IDE do Arduino, acesse a aba Sketch, selecione [Incluir Biblioteca] e depois [Gerenciar Bibliotecas...].

 

 2. No campo de pesquisa digite ssd1306 adafruit. Localizada a biblioteca Adafruit SSD1306 clique no botão [Instalar].

3. Na janela "Dependencies for library Adafruit SSD1306..." clique no botão [Install all]. Desta forma, instalaremos as bibliotecas Adafruit SSD1306, Adafruit GFX library e Adafruit BusIO todas juntas automaticamente.

 4. Após a instalação, observe que aparecerá a informação que as bibliotecas foram instaladas. (Lembre-se que precisaremos das bibliotecas Adafruit SSD1306 e Adafruit GFX Library para controlar nosso display OLED)>

 5. Para mais informações sobre as bibliotecas, acesse: Adafruit SSD1306 e Adafruit GFX library.

Iniciando "Hello Word!" no display OLED

Para termos a compreensão completa sobre como usar o display OLED controlado pelo Arduino vamos iniciar nosso projeto imprimindo a famosa frase "Hello Word!". Desta forma, veremos toda a configuração inicial, bibliotecas, comunicação e comandos obrigatórios, que servirá como base para todas as aplicações com o seu módulo OLED.

Sketch - Comunicação I2C

 /*******************************************************************************
*
*    Projeto: Hello Word! - COMUNICAÇÃO I2C
*    Data: 30/09/2020
*            http://squids.com.br/arduino
*
*******************************************************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

const byte SCREEN_WIDTH = 128; // OLED display width, in pixels
const byte SCREEN_HEIGHT = 64; // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
const int OLED_RESET = -1; // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {

// initialize with the I2C addr 0x3C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  

// Clear the buffer.
display.clearDisplay();
  
// Display Text "Hello Word"
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,28);
display.println("Hello Word!");
display.display();
}

void loop() {}

a) Observe que o scketch acima foi iniciado com a inclusão das quatro bibliotecas obrigatórias para o controle do OLED: SPI.h, Wire.h, Adafruit_GFX.h e Adafruit_SSD1306.h

Obs1: Embora a biblioteca SPI.h não seja necessária para exibições via protocolo I2C, precisamos adicioná-la para compilar o programa corretamente.

Obs2: As bibliotecas SPI.h e Wire.h não precisam ser instaladas, pois fazem parte do rol de bibliotecas nativas do IDE do Arduino.

b) Definimos em seguida a resolução do nosso display OLED, informando a largura (width) e a altura (height) da tela em pixels. Lembre-se que estamos utilizando um display OLED 128 X 64.

c) Continuando, vamos agora criar o objeto display() identificando a resolução e a forma de comunicação, que neste caso é via I2C.

Obs.: Como o OLED que estamos utilizando não possui um pino RESET, enviamos -1 ao construtor para que nenhum dos pinos do Arduino seja utilizado como um reset para o display.

d) Dentro da estrutura void setup() precisamos inicializar o objeto OLED usando a função begin() que possui 2 parâmetros, sendo eles:

  • O primeiro parâmetro SSD1306_SWITCHCAPVCC liga os circuitos internos.
  • O segundo parâmetro define o endereço I2C do display OLED utilizado. Este endereço é fixo e não pode ser alterado. Geralmente os módulos I2C OLED possuem como padrão o endereço 0x3C.

 Atenção:  A seleção de endereço I2C para display OLED, na maioria dos módulos fornecidos no mercado já vêm configurados com o com o endereço 0x3C. Se você não sabe qual endereço que o seu módulo display OLED I2C está configurado, baixe o seguinte "sketch":

DOWNLOAD - I2C_scanner.ino

2.3.1 Após instalar e rodar o sketch acima, abra o monitor serial que mostrará qual é o endereço que o seu módulo I2C está configurado:

e) É recomendável limpar o buffer de memória do módulo display OLED antes de qualquer comando de exibição. Na estrutura void setup() ainda, utilize a função clearDisplay() para fazer a limpeza no buffer e apagar tudo na tela. Isso é muito útil no caso de você desligar e ligar o Arduino novamente.

f) os comandos para a exibição da frase "Hello Word" no display OLED nós abordaremos mais para a frente.

Sketch - Comunicação SPI

 /*******************************************************************************
*
*    Projeto: Hello Word! - COMUNICAÇÃO SPI
*    Data: 30/09/2020
*            http://squids.com.br/arduino
*
*******************************************************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

const byte SCREEN_WIDTH = 128; // OLED display width, in pixels
const byte SCREEN_HEIGHT = 64; // OLED display height, in pixels

// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI  11
#define OLED_CLK   13
#define OLED_DC     9
#define OLED_CS    10
#define OLED_RESET  8
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup() {

// initialize with the SPI pins
display.begin(SSD1306_SWITCHCAPVCC); 

// Clear the buffer.
display.clearDisplay();
  
// Display Text "Hello Word"
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,28);
display.println("Hello Word!");
display.display();
}

void loop() {}

 a) Como no exemplo anterior, o scketch acima foi iniciado com a inclusão das quatro bibliotecas obrigatórias para o controle do OLED: SPI.h, Wire.h, Adafruit_GFX.h e Adafruit_SSD1306.h

Obs1: Embora a biblioteca SPI.h não seja necessária para exibições via protocolo I2C, precisamos adicioná-la para compilar o programa corretamente.

Obs2: As bibliotecas SPI.h e Wire.h não precisam ser instaladas, pois fazem parte do rol de bibliotecas nativas do IDE do Arduino.

b) Definimos em seguida a resolução do nosso display OLED, informando a largura (width) e a altura (height) da tela em pixels. Lembre-se que estamos utilizando um display OLED 128 X 64.

c) Continuando, vamos agora criar o objeto display() identificando a resolução e a forma de comunicação, que neste caso é via SPI

Obs.: O código utilizado acima foi desenvolvido a partir da montagem do display OLED SPI com o Arduino, como mostra a imagem abaixo.

Atenção: Caso você altere a montagem do display OLED, não esqueça de alterar o Sketch de acordo com a nova configuração.

d) Dentro da estrutura void setup() precisamos inicializar o objeto OLED usando a função begin() com apenas o parâmetro SSD1306_SWITCHCAPVCC definido para ligar os circuitos internos do display.

e) É recomendável limpar o buffer de memória do módulo display OLED antes de qualquer comando de exibição. Na estrutura void setup() ainda, utilize a função clearDisplay() para fazer a limpeza no buffer e apagar tudo na tela. Isso é muito útil no caso de você desligar e ligar o Arduino novamente.

Comandos para a exibição da frase "Hello Word"

a) Primeiro limpamos o display através da função clearDisplay().

b) Definimos o tamanho da fonte através da função setTextSize(). O tamanho da fonte começa em 1, onde os caracteres são renderizados na proporção de 7:10. (Nesta configuração, temos 21 caracteres na horizontal e 8 caracteres na vertical).

c) Definimos a cor da fonte e do fundo através da função setTextColor(). O parâmetro WHITE define o fundo escuro e o parâmetro BLACK o fundo claro.

d) Definimos a posição do cursor (onde se inicia o texto) através das função setCursor(x, y). Os pixels na tela são endereçados por suas coordenadas horizontal (x) e vertical (y). O sistema de coordenadas tem como origem (0,0) o canto superior esquerdo, com x positivo aumentado para a direita e y positivo aumentando para baixo. Obs.: Lembramos que o display utilizado possui resolução de 128 pixels (horizontal) e 64 pixels (vertical).

e) O comando display() é necessário para instruir a biblioteca a realizar a transferência em massa do buffer de tela no Atmega328 para a memória interna do controlador SSD1306. Assim que a memória estiver sendo transferida, os pixels correspondentes ao buffer de tela aparecerão no display OLED.

1. Sketch Arduino - Exibindo textos no display OLED

1.1 Neste projeto vamos apresentar os principais métodos para exibição de textos e números:

1.1.1. Faça o download e abra o arquivo projeto90a.ino no IDE do Arduino:  DOWNLOAD - projeto90a.ino

Obs: Se estiver utilizando um display OLED com comunicação SPI, substitua as linhas 18, 19 e 20 pelas linhas abaixo:

// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI  11
#define OLED_CLK   13
#define OLED_DC     9
#define OLED_CS    10
#define OLED_RESET  8
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

 1.2. Se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************

     Projeto 90a - Exibindo textos e números no display OLED
     Autor: Angelo Luis Ferreira
     Data: 30/09/2020
             http://squids.com.br/arduino

*******************************************************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeMonoOblique9pt7b.h> // alternative font

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {

  // initialize with the I2C addr 0x3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  // Clear the buffer.
  display.clearDisplay();
  
}

void loop() {
  // Display Text
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(24, 0);
  display.println("Squids Arduino");
  display.setCursor(0, 28);
  display.println("Hellow Word!");
  display.setCursor(0, 57);
  display.println("Squids Arduino");
  display.display();
  delay(2000);
  display.clearDisplay();

  // Display Inverted Text
  display.setTextSize(1);
  display.setTextColor(BLACK, WHITE);
  display.setCursor(24, 0);
  display.println("Squids Arduino");
  display.setCursor(0, 28);
  display.println("Hellow Word!");
  display.setCursor(0, 57);
  display.println("Squids Arduino");
  display.display();
  delay(2000);
  display.clearDisplay();

  // Changing Font Size
  display.setTextColor(WHITE);
  display.setCursor(0, 17);
  display.setTextSize(2);
  display.println("Squids!");
  display.setCursor(18, 37);
  display.println("Arduino!");
  display.setTextSize(1);
  display.setCursor(24, 0);
  display.println("Font Size");
  display.display();
  delay(2000);
  display.clearDisplay();

  // Changin Font type
  display.setCursor(24, 0);
  display.println("Font Type");
  display.setFont(&FreeMonoOblique9pt7b);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 28);
  display.println("Squids");
  display.println(" Arduino!");
  display.display();
  delay(2000);
  display.setFont(); // return to original font
  display.clearDisplay();

  // Display Numbers
  display.setTextSize(1);
  display.setCursor(0, 28);
  display.println(1234567890);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Specifying Base For Numbers
  display.setCursor(0, 28);
  display.print("0x"); 
  display.print(0xFF, HEX);
  display.print("(HEX) = ");
  display.print(0xFF, DEC);
  display.println("(DEC)");
  display.display();
  delay(2000);
  display.clearDisplay();

  // Display ASCII Characters
  display.setCursor(0, 24);
  display.setTextSize(2);
  display.write(123);
  display.write(1);
  display.write(2);
  display.write(3);
  display.write(4);
  display.write(5);
  display.write(6);
  display.write(125);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Scroll full screen
  display.setCursor(0, 0);
  display.setTextSize(1);
  display.println("Full");
  display.println("screen");
  display.println("scrolling!");
  display.display();
  display.startscrollright(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrolldiagright(0x00, 0x07);
  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  display.clearDisplay();

  // Scroll part of the screen
  display.setCursor(0, 0);
  display.setTextSize(1);
  display.println("Squids Arduino");
  display.println("Scroll de alguma");
  display.println("parte da tela.");
  display.display();
  display.startscrollright(0x00, 0x00);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollright(0x00, 0x00);
  delay(2000);
  display.startscrollright(0x00, 0x00);
  delay(2000);
  display.startscrollright(0x00, 0x00);
  delay(2000);
  display.startscrollright(0x00, 0x00);
  delay(2000);
  display.stopscroll();
  delay(2000);
  display.clearDisplay();

}

Principais comandos para exibição de textos

a. Exibir texto simples: Podemos usar as funções print(" ") ou println(" ") para imprimir mensagens na tela do OLED, da mesma forma que imprimimos textos no monitor serial. Lembre-se, println(" ") irá mover o cursor para uma nova linha.

b. Exibir texto invertido: Para exibir um texto invertido, usaremos a função setTextColor(FontColor, BackgroundColor). Observe que neste caso usamos a função setTextColor(BLACK, WHITE) com 2 parâmetros, de forma que o texto será renderizado com o texto escuro (BLACK) e o fundo claro (WHITE).

 c. Alterar o tamanho da fonte: Nós chamamos a função setTextSize() e se passarmos o parâmetro 1 (default), os caracteres serão renderizados na razão de 7:10, ou seja, 7pixels por 10pixels por caractere. Se passarmos o parâmetro 2, por exemplo, teremos a renderização na razão 2 vezes maior, ou seja, 14X20.

d. Alterar o tipo de fonte: A biblioteca Adafruit GFX permite usar algumas fontes alternativas além das fontes internas padrão. Podemos escolher entre Serif, Sans e Mono. Cada fonte está disponível em negrito, itálico e em tamanhos diferentes. As fontes também estão definidas em tamanhos pré fixados com 9, 12, 18 e 24 pontos e também contêm caracteres de 7bits (códigos ASCII). Portanto, o método setTextSize() não funciona nessas fontes.

d.1. Abaixo seguem algumas fontes alternativas que você poderá utilizar nos seus projeto:

FreeMono12pt7b.h		FreeSansBoldOblique12pt7b.h
FreeMono18pt7b.h		FreeSansBoldOblique18pt7b.h
FreeMono24pt7b.h		FreeSansBoldOblique24pt7b.h
FreeMono9pt7b.h			FreeSansBoldOblique9pt7b.h
FreeMonoBold12pt7b.h		FreeSansOblique12pt7b.h
FreeMonoBold18pt7b.h		FreeSansOblique18pt7b.h
FreeMonoBold24pt7b.h		FreeSansOblique24pt7b.h
FreeMonoBold9pt7b.h		FreeSansOblique9pt7b.h
FreeMonoBoldOblique12pt7b.h	FreeSerif12pt7b.h
FreeMonoBoldOblique18pt7b.h	FreeSerif18pt7b.h
FreeMonoBoldOblique24pt7b.h	FreeSerif24pt7b.h
FreeMonoBoldOblique9pt7b.h	FreeSerif9pt7b.h
FreeMonoOblique12pt7b.h		FreeSerifBold12pt7b.h
FreeMonoOblique18pt7b.h		FreeSerifBold18pt7b.h
FreeMonoOblique24pt7b.h		FreeSerifBold24pt7b.h
FreeMonoOblique9pt7b.h		FreeSerifBold9pt7b.h
FreeSans12pt7b.h		FreeSerifBoldItalic12pt7b.h
FreeSans18pt7b.h		FreeSerifBoldItalic18pt7b.h
FreeSans24pt7b.h		FreeSerifBoldItalic24pt7b.h
FreeSans9pt7b.h			FreeSerifBoldItalic9pt7b.h
FreeSansBold12pt7b.h		FreeSerifItalic12pt7b.h
FreeSansBold18pt7b.h		FreeSerifItalic18pt7b.h
FreeSansBold24pt7b.h		FreeSerifItalic24pt7b.h
FreeSansBold9pt7b.h		FreeSerifItalic9pt7b.h

d.2. Para utilizar alguma fonte alternativa acima, primeiro você deverá incluí-la no sketch através do comando

d.3. Em seguida, você deverá usar método setFont() e passar como argumento, a fonte especificada e para voltar a usar a fonte original, chamar o método setFont() sem argumentos:

e. Exibir números inteiros:  Para exibir números no display OLED basta chamar a função print() ou println() - sem utilizar aspas. Podem ser exibidos números inteiros de 0 a 4.296.967.295, o que equivale a uma resolução de 32bits.

f. Base Numérica:  As funções print() e println() possuem um segundo parâmetro opcional que especifica a base numérica utilizada. Os valores permitidos são BIN (binário ou base 2), OCT (octal ou base 8), DEC (decimal ou base 10) e HEX (hexadecimal ou base 16). Também podemos especificar números fracionários (com ponto flutuante), utilizando o segundo parâmetro com o número de casas decimais: Veja alguns exemplos:

    print (78, BIN) // 1001110
    print (78, OCT) // 116
    imprimir (78, DEC) // 78
    imprimir (78, HEX) // 4E
    println (1.23456, 0) // 1
    println (1.23456, 2) // 1.23
    println (1.23456, 4) // 1.2346

g. Exibindo símbolos ASCII: As funções print () e println () enviam dados para o display como texto ASCII legível, enquanto a função write () envia dados binários para o display. Portanto, podemos usar esta função para exibir símbolos ASCII.

Veja abaixo uma tabela com os símbolos ASCII relacionados com os códigos binários entre 0 e 255 (8bits).

 h. Exibindo um texto em scroll: Para rolar uma exibição horizontalmente utilizamos as funções startscrollright () - rolar o texto para a direita e startscrollleft () - rolar o texto para a esquerda. Para rolar o texto na diagonal utilizaremos as funções startscrolldiagright () e startscrolldiagleft (). Para interromper a rolagem do display, utilizamos a função stopscroll ().

h.1. Rolagem da tela inteira: Para rolar a tela inteira, ou parte da tela, precisaremos definir quais são as páginas (linhas) display que se deseja executar. Vimos anteriormente em mapa de memória OLED que o display 128 X 64 está organizado em 8 faixas definidas como páginas de 0 a 7. Portanto, para rolar a tela inteira, precisamos definir como parâmetros todas as páginas da tela, ou seja, a página inicial 0X00 e a página final 0X07. Os números das páginas devem estar na base hexadecimal. Veja abaixo o nosso exemplo para rolar a tela inteira do display LED:

 h.2. Rolagem de parte da tela: Para rolar apenas uma parte da tela precisamos apenas indicar a página inicial e a página final da parte da tela que queremos executar. No nosso exemplo passamos os parâmetros página inicial e página final como 0x00. Isso rolará apenas a primeira página, ou seja, as primeiras 8 linhas da tela.

Vídeo

2. Sketch Arduino - Desenhando no display OLED

2.1 Neste projeto vamos apresentar as principais funções para desenhar retângulos, círculos e triângulos em um display OLED 128 X 64 :

2.1.1. Faça o dowload e abra o arquivo projeto90b.ino no IDE do Arduino: DOWNLOAD projeto90b.ino

Obs: Se estiver utilizando um display OLED com comunicação SPI, substitua as linhas 17, 18 e 19 pelas linhas abaixo:

// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI  11
#define OLED_CLK   13
#define OLED_DC     9
#define OLED_CS    10
#define OLED_RESET  8
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

 2.2. Se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************

     Projeto 90b - Desenhando em um display OLED
     Autor: Angelo Luis Ferreira
     Data: 05/10/2020
             http://squids.com.br/arduino

*******************************************************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  // initialize with the I2C addr 0x3C
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {                
  // Clear the buffer.
  display.clearDisplay();

  // Texto: Squids Arduino
  display.setTextColor(WHITE);
  display.setCursor(0, 17);
  display.setTextSize(2);
  display.println("Squids!");
  display.setCursor(18, 37);
  display.println("Arduino!");
  display.setTextSize(1);
  display.setCursor(24, 0);
  display.println("Programando");
  display.display();
  delay(2000);
  display.clearDisplay();

  // Texto: Desenhando no display
  display.setTextColor(WHITE);
  display.setCursor(0, 17);
  display.setTextSize(1);
  display.println("Desenhando no");
  display.setCursor(18, 37);
  display.println("Display OLED!");
  display.setTextSize(1);
  display.setCursor(24, 0);
  display.println("Squids Arduino");
  display.display();
  delay(2000);
  display.clearDisplay();

  // Retângulo
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Rectangle");
  display.drawRect(0, 17, 60, 40, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
  
  // Retãngulo preenchido
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Filled Rectangle");
  display.fillRect(0, 17, 60, 40, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
  
  // Retângulo com bordas arredondadas
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Round Rectangle");
  display.drawRoundRect(0, 17, 60, 40, 8, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  //Retângulo como bordas arredondas preenchido
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Filled Round Rectangl");
  display.fillRoundRect(0, 17, 60, 40, 8, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Círculo
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Circle");
  display.drawCircle(22, 37, 20, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Círculo preenchido
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Filled Circle");
  display.fillCircle(22, 37, 20, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Triângulo
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Triangle");
  display.drawTriangle(30, 17, 0, 60, 60, 60, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();

  // Triângulo preenchido
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Filled Triangle");
  display.fillTriangle(30, 17, 0, 60, 60, 60, WHITE);
  display.display();
  delay(2000);
  display.clearDisplay();
}

Comandos básico para desenhar em um display OLED

a. Desenhando um retângulo: Podemos desenhar retângulos no display OLED usando a função drawRect ().  Esta função tem 5 parâmetros: coordenada X, coordenada Y, largura, altura e cor. A função drawRect () desenha um retângulo vazio com borda de 1 pixels. Para desenhar um retângulo preenchido use a função fillRect () como mostramos no nosso exemplo abaixo:

Obs.: Lembre-se que estamos utilizando um display com 128 pixels (0 a 127) de largura e 64 pixels de altura.

b. Desenhando um retângulo com cantos arredondados: Você pode desenhar um retângulo com bordas arredondadas na tela usando a função drawRoundRect (). Esta função usa os mesmos parâmetros da função drawRect (), exceto um parâmetro adicional - Raio de arredondamento do canto. Na verdade, esta função desenha um retângulo redondo vazio com borda de 1 pixel. Você pode desenhar retângulo redondo preenchido usando a função fillRoundRect (). Veja nosso exemplo a seguir:

c) Desenhando um círculo: Você pode desenhar um círculo na tela usando a função drawCircle (). Esta função utiliza 4 parâmetros: Coordenada X do centro, coordenada Y do centro, raio e cor. Esta função desenha um círculo vazio com borda de 1 pixel. Você pode desenhar um círculo preenchido usando a função fillCircle ():

d) Desenhando um triângulo: Para você desenhar um triângulo na tela use a função drawTriangle (). Esta função utiliza 7 parâmentros:  3 coordenadas X e Y (x0, y0, x1, y1, x2 e y2) dos vértices do triângulo e da cor. Esta função na verdade desenha um triângulo vazio com borda de 1 pixel. Você pode desenhar um triângulo preenchido usando a função fillTriangle ().

Obs.: (X0, y0) representa o vértice superior, (x1, y1) representa o vértice esquerdo e (x2, y2) representa o vértice direito.

e) Desenhando um ponto ou uma reta: Você também poderá desenhar um ponto ou uma reta utilizando as funções: drawPixel(x, y, color) para desenhar um ponto, onde X e Y são as coordenadas (horizontal e vertical) em que o pixel aparece e drawLine(x1, y1, x2, y2, cor) para desenhar uma linha, onde as coordenadas (x1, y1) indicam o ponto inicial e as coordenadas (x2, y2) indicam o ponto final da linha.

Vídeo

O anúncio abaixo ajuda a manter o Squids Arduino funcionando

Comentários

×

Infomações do site / SEO








×

Adicionar Marcadores