Hoje vou apresentar a vocês um minúsculo display OLED de 0,49″, algo que encontrei no Aliexpress (link aqui) e resolvi ver se vale a pena. Ele se comunica via i2c com qualquer microcontrolador, além de ser necessário apenas alimentá-lo com 3,3V.
Sua resolução é 64×32 pixels, o meu é somente a cor branca (há opções com Amarelo+Azul, somente azul e somente amarelo. Ele é realmente pequeno e sua biblioteca tem muitas fontes disponíveis. Você pode encontrar um bom tutorial de ponto de partida aqui e todas as fontes aqui.
Conexões (hardware)
Conforme dito acima, há necessidade de apenas quatro conexões, i2c (SDA e SCL/SCK), GND e 3V3. Abaixo você pode vê-lo conectado a uma placa de circuito ESP32-C3 que eu fiz. Há também um termistor NTC de 10k Ohm em série com um resistor de 10k Ohm, conectado à entrada analógica A3.
Aqui está o pinout e o guia do ESP32-C3 mini para referência.
Software e testes
Implementaremos dois testes para este pequeno display, um mostrando apenas texto (várias linhas) e o outro mostrando a temperatura em graus Celsius lida de um termistor NTC. Para isso, você precisará de uma biblioteca chamada u8G2, instalada no IDE do Arduino. Estou usando a versão 2.2.x do IDE.
Para instalar a biblioteca necessária, no IDE do Arduino vá em “Sketch > Include library > Manage library ..” e digite “u8g2”, instale o do “Oliver”. Agora cole o código abaixo no IDE, compile e carregue no seu Arduino.
// Display - https://pmdway.com/collections/oled-displays/products/0-49-64-x-32-white-graphic-oled-i2c
// Guide - https://pmdway.com/blogs/product-guides-for-arduino/tutorial-using-the-0-49-64-x-32-graphic-i2c-oled-display-with-arduino
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
void setup() {
u8g2.begin();
}
// fonts https://github.com/olikraus/u8g2/wiki/fntlistall#4-pixel-height
void loop()
{
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_u8glib_4_tf); // choose a suitable font
u8g2.drawStr(0, 5, "Hello,"); // write something to the internal memory
u8g2.drawStr(0, 10, "World...");
u8g2.drawStr(0, 15, "I'm tiny...");
u8g2.drawStr(0, 20, "So tiny!");
u8g2.drawStr(0, 25, "However you can");
u8g2.drawStr(0, 30, "have six lines");
u8g2.sendBuffer(); // transfer internal memory to the display
delay(1000);
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_t0_11_tf); // choose a suitable font
u8g2.drawStr(0, 10, "Hello,"); // write something to the internal memory
u8g2.drawStr(0, 20, "World...");
u8g2.drawStr(0, 30, "I'm tiny...");
u8g2.sendBuffer(); // transfer internal memory to the display
delay(1000);
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_tenstamps_mf); // choose a suitable font
u8g2.drawStr(0, 12, "ABCD"); // write something to the internal memory
u8g2.drawStr(0, 30, "1234");
u8g2.sendBuffer(); // transfer internal memory to the display
delay(1000);
for (int a = 999; a >= 0; --a)
{
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_inb24_mr ); // choose a suitable font
u8g2.setCursor(0, 24);
u8g2.print(a);
a = a - 47;
u8g2.sendBuffer(); // transfer internal memory to the display
delay(100);
}
delay(1000);
}
É um código de demonstração que encontrei aqui, mostrando diferentes fontes e variáveis sendo impressas na tela. Então eu mesmo fiz um código de demonstração, um que lê a temperatura de um termistor NTC e mostra na tela a cada um segundo. Você pode encontrá-lo abaixo.
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
U8G2_SSD1306_64X32_1F_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
// Conexão do termistor
const int pinTermistor = A3;
// Parâmetros do termistor
const double beta = 4000.0;
const double r0 = 10000.0;
const double t0 = 273.0 + 25.0;
const double rx = r0 * exp(-beta/t0);
// Parâmetros do circuito
const double vcc = 3.3;
const double R = 10000.0;
// Numero de amostras na leitura
const int nAmostras = 5;
void setup(){
u8g2.begin();
}
void loop(){
int soma = 0;
for (int i = 0; i < nAmostras; i++) {
soma += analogRead(pinTermistor);
delay (100);
}
// Determina a resistência do termistor
double v = (vcc*soma)/(nAmostras*4096.0);
double rt = (vcc*R)/v - R;
// Calcula a temperatura
double t = beta / log(rt/rx);
t= t-273;
u8g2.clearBuffer(); // clear the internal memory
//u8g2.setFont(u8g2_font_9x18_mn); // choose a suitable font
u8g2.setFont(u8g2_font_t0_17_tn);
//u8g2.drawStr(0, 5, "Hello,"); // write something to the internal memory
//u8g2.drawStr(15, 5, "World...");
//u8g2.drawStr(0, 15, "I'm tiny...");
u8g2.setCursor(0, 20);
u8g2.drawStr(40, 20, "C");
u8g2.print(t);
u8g2.sendBuffer(); // transfer internal memory to the display
delay(1000);
}
Ele utiliza a entrada analógica A3 da placa ESP32-C3, lendo-a e aplicando uma equação para obter a temperatura diretamente em graus Celsius.
Vendo como funciona, vídeo
Fiz um vídeo para você ver os dois códigos acima em ação, ilustrando como imprimir texto e variáveis alternadamente na pequena tela de 0,49″.
Quer conhecer mais displays OLED? veja este artigo.
Deixe um comentário