Arduino Nano ESP32 - Display OLED SSD1309 128x64 | Tutorial de OLED I2C de 2.42 polegadas
Este tutorial mostra como usar o SSD1309 OLED 128×64 (2.42 polegadas / 2.4 polegadas) com um Arduino Nano ESP32 pela interface I2C e pela biblioteca DIYables_OLED_SSD1309. Em detalhes, vamos aprender:
- Como conectar o OLED SSD1309 de 2.42 polegadas ao Arduino Nano ESP32 por I2C
- Como programar o Arduino Nano ESP32 para mostrar texto e números no OLED SSD1309
- Como centralizar o texto na vertical e na horizontal no OLED SSD1309
- Como desenhar formas geométricas no OLED SSD1309
- Como mostrar imagens bitmap monocromáticas no OLED SSD1309
- Como usar a rolagem por hardware em quatro direções
- Como ajustar o contraste e reduzir o brilho do display
- Como usar fontes personalizadas da coleção de fontes do Adafruit GFX

Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Display OLED SSD1309 de 2.42 Polegadas
O SSD1309 é um CI driver OLED CMOS de chip único para painéis de matriz de pontos 128×64. Ele é compatível em registradores com o SSD1306, então muitos exemplos de código existentes funcionam com mudanças mínimas. Detalhes importantes do hardware:
- Sem charge pump embutido — o SSD1309 exige um trilho de VCC externo, mas praticamente todas as placas breakout (incluindo os módulos de 2.42 polegadas) vêm com um conversor boost na placa, o que torna isso transparente para o usuário.
- Maior tolerância de tensão — o SSD1309 aceita até 16 V de VCC, contra o limite de ~4.2 V do SSD1306.
A comunicação I2C exige apenas dois fios de sinal (SDA e SCL), e o barramento pode ser compartilhado com outros periféricos I2C ao mesmo tempo.
Pinagem do OLED SSD1309 (Módulo I2C)
- Pino GND: Conecte ao GND do Arduino Nano ESP32.
- Pino VCC: Alimentação do display. Conecte ao 3.3V.
- Pino SCL: Clock serial do I2C. Conecte ao A5.
- Pino SDA: Dados seriais do I2C. Conecte ao A4.

※ Nota:
- A disposição dos pinos do módulo OLED pode ser diferente dependendo do fabricante. Sempre use os rótulos impressos no próprio módulo.
- Este tutorial usa o OLED I2C SSD1309 da DIYables, que foi testado e confirmado como funcionando.
Diagrama de Ligação
- Diagrama de ligação entre o Arduino Nano ESP32 e o OLED SSD1309 128x64

This image is created using Fritzing. Click to enlarge image
A tabela de ligação entre o Arduino Nano ESP32 e o display OLED SSD1309:
| Módulo OLED | Arduino Nano ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
Como Programar o Arduino Nano ESP32 para o OLED SSD1309
Instalar a Biblioteca DIYables_OLED_SSD1309
- Clique no ícone Libraries na barra à esquerda da Arduino IDE.
- Pesquise DIYables_OLED_SSD1309 e encontre a biblioteca DIYables OLED SSD1309 da DIYables.
- Clique em Install para instalar a biblioteca DIYables_OLED_SSD1309.

- Você será solicitado a instalar as dependências da biblioteca.
- Clique em Install All para instalar todas as dependências necessárias.

Passos da Programação
- Inclua as bibliotecas necessárias
- Defina as dimensões da tela
- Declare o objeto do display
- Inicialize o OLED em setup()
- Mostre o conteúdo
Código Arduino Nano ESP32 — Hello World no OLED SSD1309
O ponto de partida mais simples: imprimir algumas linhas de texto em tamanhos diferentes.
Código Arduino Nano ESP32 — Mostrar Texto no OLED SSD1309
O exemplo a seguir demonstra mais recursos de texto — vários tamanhos, formatação de números e a macro F() para economizar RAM.
Referência de Funções Úteis do Display
- oled.clearDisplay() — limpa o frame buffer (todos os pixels apagados).
- oled.display() — transfere o buffer para o OLED para que as mudanças fiquem visíveis.
- oled.drawPixel(x, y, color) — liga ou desliga um pixel individual.
- oled.setTextSize(n) — escala a fonte pelo fator *n* (1 = 6×8, 2 = 12×16, …).
- oled.setCursor(x, y) — move o cursor de texto para as coordenadas de pixel *(x, y)*.
- oled.setTextColor(SSD1309_PIXEL_ON) — apenas a cor do texto (fundo transparente).
- oled.setTextColor(SSD1309_PIXEL_OFF, SSD1309_PIXEL_ON) — texto com cor de fundo explícita.
- oled.println("message") — imprime uma string e avança para a próxima linha.
- oled.println(number) — imprime um inteiro em decimal.
- oled.println(number, HEX) — imprime um inteiro em hexadecimal.
- oled.startscrollright(start, stop) — rolagem por hardware para a direita entre a página *start* e *stop*.
- oled.startscrollleft(start, stop) — rolagem por hardware para a esquerda.
- oled.startscrolldiagright(start, stop) — rolagem por hardware na diagonal para a direita.
- oled.startscrolldiagleft(start, stop) — rolagem por hardware na diagonal para a esquerda.
- oled.stopscroll() — interrompe qualquer rolagem por hardware ativa.
- oled.setContrast(value) — ajusta o brilho do display (0–255).
- oled.dim(true/false) — reduz ou restaura rapidamente o brilho do display.
- oled.invertDisplay(true/false) — inversão de cores em nível de hardware.
Como Centralizar o Texto na Vertical e na Horizontal no OLED SSD1309
Código Arduino Nano ESP32 — Desenhar Formas no OLED SSD1309
A biblioteca DIYables_OLED_SSD1309 estende o Adafruit_GFX, oferecendo um conjunto completo de primitivas para desenhar formas: pixels, linhas, retângulos, retângulos preenchidos, círculos, círculos preenchidos, triângulos, triângulos preenchidos e retângulos arredondados.
Código Arduino Nano ESP32 — Rolagem por Hardware no OLED SSD1309
O SSD1309 inclui um mecanismo de rolagem por hardware que desloca o conteúdo do display sem carga na CPU. Quatro direções de rolagem estão disponíveis: direita, esquerda, diagonal para a direita e diagonal para a esquerda. Cada função recebe os números das páginas inicial e final (as páginas são faixas de 8 pixels de altura numeradas de 0 a 7).
※ Nota:
Chame display() para enviar seu conteúdo ao OLED antes de iniciar uma rolagem. Pare a rolagem com stopscroll() antes de desenhar um novo conteúdo.
Código Arduino Nano ESP32 — Mostrar Imagem Bitmap no OLED SSD1309
Para mostrar um bitmap, você primeiro deve converter sua imagem em um array de bytes em C. Use a ferramenta online image2cpp gratuita:
- Faça upload da sua imagem (PNG, JPG, BMP, etc.).
- Defina o tamanho do canvas como 128×64 (ou menor).
- Escolha Arduino code como formato de saída.
- Copie o array gerado para o seu sketch.

※ Nota:
- As dimensões do bitmap não devem ultrapassar 128×64 para este módulo.
Código Arduino Nano ESP32 — Contraste e Brilho Reduzido no OLED SSD1309
O SSD1309 suporta 256 níveis de contraste (0–255). Use setContrast() para um controle fino e dim() para alternar rapidamente entre o brilho mínimo e o nível configurado anteriormente.
Código Arduino Nano ESP32 — Fontes Externas Personalizadas no OLED SSD1309
A biblioteca Adafruit GFX inclui dezenas de tipos de letra FreeFont escaláveis (Serif, Sans, Mono — Regular, Bold, Italic, quatro tamanhos cada). Ative qualquer uma delas incluindo o header correspondente e chamando setFont().
※ Nota:
- Quando uma fonte externa está ativa, a coordenada Y do cursor se refere à linha de base do texto, não ao canto superior esquerdo.
- As fontes externas são armazenadas na flash (PROGMEM). Use-as com cuidado para ficar dentro do limite de flash do Arduino Nano ESP32.
Solução de Problemas do OLED SSD1309 com o Arduino Nano ESP32
Se nada aparecer no OLED SSD1309 de 2.42 polegadas depois de fazer upload do seu sketch, siga estas verificações:
- Verifique a ligação — confirme que SDA→A4, SCL→A5, VCC→3.3V e GND→GND estão todos conectados corretamente.
- Confirme o chip driver — esta biblioteca é voltada para o SSD1309. Módulos com um controlador diferente (por exemplo, SH1106) não vão responder corretamente.
- Verifique o endereço I2C — a maioria dos módulos SSD1309 usa 0x3C por padrão, mas alguns usam 0x3D. Use o sketch de scanner I2C abaixo para encontrar o endereço real:
Saída esperada no Serial Monitor quando o SSD1309 é detectado:
- Garanta que display() seja chamada — o SSD1309 usa um frame buffer. As funções de desenho modificam apenas a RAM; nada aparece na tela até você chamar oled.display().
- Verifique a fonte de alimentação — o módulo de 2.42 polegadas consome mais corrente do que OLEDs menores. Confirme que o 3.3V consegue fornecer corrente suficiente (normalmente 20–40 mA com brilho máximo).