Introdução
A Franzininho C0 é uma placa de desenvolvimento que suporta diversas funcionalidades, incluindo a comunicação com outros dispositivos por meio do protocolo I2C. Neste tutorial, vamos explorar como utilizar o barramento I2C da Franzininho C0 com o Arduino para controlar um display OLED SSD1306.
Display OLED SSD1306
O display OLED SSD1306 é um tipo de display de tecnologia OLED (Organic Light-Emitting Diode) que usa o controlador SSD1306. Esses displays são conhecidos por sua alta qualidade de imagem e eficiência energética, o que os torna populares em projetos eletrônicos DIY, projetos de IoT e muitas outras aplicações.
Diferente dos displays LCD convencionais, os displays OLED não requerem uma fonte de luz de fundo, pois cada pixel em um display OLED emite sua própria luz. Isso resulta em níveis de contraste mais elevados, cores mais vibrantes e um ângulo de visão amplo.
Características do display SSD1306:
- Resolução: 128×64, 128×32 ou 96×16 pixels.
- Comunicação: I2C ou SPI
- Alimentação: 3,3V ou 5V
- Suporte a diversas linguagens de programação

I2C
O I2C (Inter-Integrated Circuit) é um protocolo de comunicação serial que permite que diferentes dispositivos se comuniquem e troquem dados através de um barramento compartilhado. Criado pela Philips Semiconductors, o I2C é amplamente utilizado em diversos dispositivos eletrônicos, como smartphones, computadores, sensores e sistemas industriais.
O principal benefício da comunicação I2C é a capacidade de conectar múltiplos dispositivos a um único barramento, facilitando a troca de dados de forma rápida e simples. Além disso, o protocolo I2C se destaca por utilizar apenas dois fios para a comunicação entre os dispositivos: um fio para o sinal de clock (SCL – Serial Clock Line) e outro para o sinal de dados (SDA – Serial Data Line). Isso torna a implementação física do barramento I2C simples e econômica.
Para mais informações acesse: Comunicação I2C – Embarcados
Circuito
Vamos começar com a montagem do circuito na protoboard.
Material e Montagem da placa
- Franzininho C0
- Protoboard
- Display OLED SSD1306
- Jumpers
Pinout da Franzininho C0
Para definir os pinos utilizados, precisamos consultar o pinout da placa:
Acesse a documentação completa em:
https://docs.franzininho.com.br/docs/franzininho-c0/franzininho-c0-board
Montagem do Circuito
Com a protoboard em mãos e a placa Franzininho C0 já inserida nela, siga as instruções abaixo para conectar o display OLED:
- Conecte o GND da placa a trilha de GND da protoboard
- Conecte a saída de 3.3 V a trilha de VCC da protoboard
- Pegue o display OLED e insira-o na protoboard
- Conecte o terminal GND do display ao GND da protoboard
- Repita o passo 4 para o VCC do display
- Conecte o terminal SCL ao pino PB6
- Conecte o terminal SDA ao pino PC14
Para se orientar quanto aos pinos da Franzininho C0, basta visualizar o pinout da placa acima.
Código
Para exibir textos no SSD1306 usando a Franzininho C0, utilizaremos o código a seguir:
#include <Wire.h>
#include <U8g2lib.h>
// Definindo os pinos SCL e SDA
#define SCL_PIN PB6
#define SDA_PIN PC14
// Inicializando a instância U8G2 para o SSD1306 com I2C
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void setup() {
// Inicializando o Wire com os pinos definidos
Wire.setSCL(SCL_PIN);
Wire.setSDA(SDA_PIN);
Wire.begin();
// Inicializando o display
u8g2.begin();
u8g2.clearBuffer(); // Limpa o buffer
// Configurações do display
u8g2.setFont(u8g2_font_t0_14b_tf); // Seleciona uma fonte
u8g2.drawStr(0, 10, "Hello,"); // Desenha a string no buffer
u8g2.drawStr(0, 30, "Franzininho C0!");
u8g2.sendBuffer(); // Transfere o buffer para o display
}
void loop() {
// O loop vazio
}- Obs.1: Antes da IDE iniciar o carregamento do programa, a Franzininho C0 deve executar o bootloader, caso contrário ocorrerá um erro.
- Obs.2: Recomendamos o uso da IDE 1.8.x do Arduino para essa aplicação.
Explicação do Código
Antes do setup(), vamos incluir duas bibliotecas Wire e U8g2lib. A biblioteca ‘Wire’ do Arduino viabiliza a comunicação I2C entre microcontroladores e periféricos. Já a ‘U8g2lib’ é uma biblioteca gráfica para displays pequenos de baixo consumo, seu suporte é para múltiplos displays, incluindo OLEDs e LCDs. Essa biblioteca foi escolhida para programar o display OLED SSD1306 devido à sua eficiência em termos de ocupação de memória, sendo ideal para a Franzininho C0 que conta com 32Kb de memória flash.
Além disso, são criadas algumas variáveis globais. Usando #define, os pinos PB6 e PC14 são definidos como ‘SCL_PIN’, ‘SDA_PIN’, correspondendo aos terminais SCL e SDA do display, respectivamente.
Também é feita a inicialização da instância u8g2 para realizar as configurações do display. A configuração da biblioteca U8G2 é feita para trabalhar com um display OLED SSD1306 de 128×64 pixels, usando a interface de comunicação I2C. O parâmetro ‘U8G2_R0’ define a rotação da tela, que indicamos como não rotacionada (0 graus), já o parâmetro ‘U8X8_PIN_NONE’ especifica que não será utilizado um pino de reset dedicado.
#include <Wire.h>
#include <U8g2lib.h>
// Definindo os pinos SCL e SDA
#define SCL_PIN PB6
#define SDA_PIN PC14
// Inicializando a instância U8G2 para o SSD1306 com I2C
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);No setup(), começamos definindo com a biblioteca Wire os pinos respectivos ao SCL e ao SDA do display. Em seguida, ‘Wire.begin()’ é usado para configurar o microcontrolador para atuar como mestre no barramento I2C.
void setup() {
// Inicializando o Wire com os pinos definidos
Wire.setSCL(SCL_PIN);
Wire.setSDA(SDA_PIN);
Wire.begin();...}Ainda no setup, ‘u8g2.begin()’ inicializa a biblioteca U8g2 e prepara o display OLED para receber comandos e dados. Esta função deve ser chamada antes de qualquer operação de escrita no display. Em seguida, a função ‘u8g2.clearBuffer()’ é chamada para limpar o buffer de memória da U8g2, garantindo que não haja dados residuais antes de começar a escrever.
Depois disso, usamos ‘u8g2.setFont(u8g2_font_ncenB08_tr)’ para definir a fonte a ser usada para escrever no display, ‘u8g2_font_t0_14b_tf’ é uma das várias fontes disponíveis na biblioteca U8g2.
Com ‘u8g2.drawStr(0, 10, “Hello,!”)’ escrevemos a string “Hello,” no buffer de memória, começando na posição (0, 10) (0 é a coordenada x e 10 é a coordenada y). Aqui, mexer em x fará você escrever mais à esquerda ou à direita, enquanto mexer em y fará você subir e descer o texto. Essa função apenas especifica o que será escrito no buffer e não atualiza o display imediatamente. Da mesma forma é feito ‘u8g2.drawStr(0, 30, “Franzininho C0!”);’ que irá escrever “Franzininho C0!” abaixo do “Hello,”.
Por fim, u8g2.sendBuffer() envia o conteúdo do buffer de memória para o display, atualizando-o para mostrar o texto. Sem esta chamada, as mudanças feitas no buffer não seriam visíveis no display.
// Inicializando o display
u8g2.begin();
u8g2.clearBuffer(); // Limpa o buffer
// Configurações do display
u8g2.setFont(u8g2_font_t0_14b_tf); // Seleciona uma fonte
u8g2.drawStr(0, 10, "Hello,"); // Desenha a string no buffer
u8g2.drawStr(0, 30, "Franzininho C0!");
u8g2.sendBuffer(); // Transfere o buffer para o displayNessa aplicação o loop() ficará vazio.
Ao executar o código, conforme mostrado na figura, podemos observar que o texto é exibido com sucesso no display.
Conclusão
Neste tutorial, exploramos a comunicação I2C da Franzininho C0 utilizando o display OLED SSD1306.
Devido à eficiência de memória, utilizamos a biblioteca U8g2 para configurar o display.
Através desta implementação, é possível simular e verificar o funcionamento correto do display, assegurando que os comandos de inicialização, escrita e atualização estão sendo executados conforme esperado.
Desafio
Neste desafio você irá elaborar uma rotina para desenhar retas horizontais e verticais.
O objetivo é criar funções para desenhar retas horizontais e verticais no display OLED SSD1306 usando a biblioteca U8g2. Essas funções devem permitir desenhar retas em qualquer posição do display, com qualquer comprimento dentro dos limites do display.





