Skip to Content

Interligar Arduino com E-ink Display

Interligar Arduino com E-ink Display

Neste tutorial, vais aprender a ligar um ecrã E-ink tricolor a um Arduino ou a um ESP32.

E-Ink, ou papel eletrónico (E-Paper), é uma tecnologia de ecrã que imita a aparência da tinta no papel. Utiliza microcápsulas minúsculas preenchidas com partículas coloridas. Quando um campo elétrico é aplicado, as partículas movem-se para a superfície, criando texto e imagens.

O papel eletrónico oferece várias vantagens. O seu baixo consumo de energia permite que os dispositivos funcionem durante semanas ou meses com uma única carga. O ecrã imita o papel tradicional, proporcionando excelente legibilidade à luz solar direta e amplos ângulos de visualização sem reflexos. Além disso, o E-Paper é fino e leve. No entanto, o E-Paper tem uma atualização lenta, uma gama de cores limitada e é relativamente caro.

Peças Necessárias

Vais precisar de um ecrã E-Paper e, para este tutorial, escolhi um ecrã tricolor de 2,9 polegadas com resolução de 296×128 pixels. No entanto, também podes usar um E-Paper monocromático de tamanho diferente.

Vamos ligar o E-Paper a um Arduino e a um ESP32. Quase qualquer modelo de Arduino ou ESP32 funciona, mas o ESP32 é a melhor escolha. O ESP32 lite listado abaixo é especialmente adequado, pois tem interface para bateria e os E-Papers são ótimos para projetos alimentados por bateria.

Ecrã E-Paper tricolor de 2,9″

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

ESP32 lite Lolin32

ESP32 lite

USB data cable

Cabo USB de dados

Dupont wire set

Conjunto de fios Dupont

Half_breadboard56a

Breadboard

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Noções básicas sobre ecrãs E-Paper

A tecnologia E-Paper baseia-se na tecnologia Microcapsule Electrophoretic Display (EPD). A folha de E-Paper consiste numa camada de polímero condutor transparente que serve como eletrodo frontal, juntamente com milhões de microcápsulas, cada uma com cerca do diâmetro de um fio de cabelo humano, embutidas num material polimérico. Estas microcápsulas contêm partículas coloridas ou pigmentos (preto, branco, …) num fluido transparente. A folha de E-Paper é depois laminada num substrato, que atua como eletrodo inferior.

e-Paper System
Sistema E-Paper (source)

O eletrodo inferior é tipicamente dividido em segmentos ou pixels, permitindo o controlo independente da voltagem em cada segmento. Esta capacidade permite que o ecrã forme várias imagens. Uma vez criada a imagem, a voltagem pode ser removida e as partículas permanecem nas suas posições atuais. Esta característica permite que um E-Paper mantenha uma imagem estática sem consumir energia.

Sistema de Tinta com Dois Pigmentos

Num sistema de tinta eletrónica com dois pigmentos, cada microcápsula contém partículas brancas carregadas negativamente e partículas pretas carregadas positivamente suspensas num fluido transparente. Quando um campo elétrico é aplicado, positivo ou negativo, as partículas correspondentes migram para o topo da microcápsula. Este movimento torna as partículas visíveis, fazendo com que a superfície apareça branca ou preta naquele local específico.

Two Pigment System
Sistema de Dois Pigmentos (source)

Controlando os campos elétricos aplicados a cada microcápsula, o ecrã pode mostrar uma gama de tons de cinzento, embora a maioria dos E-Papers monocromáticos suporte apenas preto e branco.

Sistema de Tinta com Três Pigmentos

Um sistema de tinta eletrónica com três pigmentos expande os princípios do sistema de dois pigmentos ao incorporar uma cor adicional. Neste sistema, as microcápsulas ou microcopos contêm partículas brancas carregadas negativamente, partículas pretas carregadas positivamente e um terceiro conjunto de pigmentos carregados positivamente, tipicamente vermelho ou amarelo.

Three Pigment System
Sistema de Três Pigmentos (source)

Quando um campo elétrico é aplicado, as partículas respondem conforme a sua carga. Por exemplo, um campo elétrico negativo fará com que as partículas vermelhas carregadas positivamente subam à superfície. Uma carga dividida faz subir as partículas pretas para o topo. E uma carga positiva traz as partículas brancas para a frente.

Módulo de Ecrã E-Paper tricolor de 2,9″

Se quiseres controlar um E-Paper a partir de um microcontrolador, vais precisar de um driver que controle os campos elétricos do ecrã. Podes comprar o E-Paper e o driver separadamente ou como um módulo que integra o E-Paper e o driver numa única unidade.

O módulo de ecrã que estamos a usar neste tutorial é um ecrã tricolor (branco, preto, vermelho) com tamanho de 2,9 polegadas, resolução de 296×128 pixels e um controlador embutido com uma interface SPI para comunicação. A imagem abaixo mostra a frente e o verso do módulo de ecrã:

Frente e verso do módulo de ecrã E-Paper

Note que o módulo tem um pequeno jumper/switch na parte de trás para alternar entre SPI de 4 fios e SPI de 3 fios. Vamos usar o SPI de 4 fios por defeito aqui. Portanto, não precisas de alterar nada.SPI

Back of e-Paper module with SPI-interface and controller
Verso do módulo E-Paper com interface SPI e controlador

O módulo de ecrã funciona a 3,3V ou 5V, com um consumo em standby de 0,017mW e consome apenas cerca de 26,4mW durante a atualização. O tempo para uma atualização completa é de 15 segundos e a atualização parcial não é suportada. Se quiseres saber mais sobre as diferenças entre atualização completa e parcial, consulta o nosso Partial Refresh of e-Paper Display tutorial.

Pinout do Ecrã E-Paper

O modelo de ecrã vem com um conector de 8 pinos para SPI comunicação e alimentação que tem os seguintes pinos:

Pinout of e-Paper Display
Pinout do Ecrã E-Paper

BUSY indica que o ecrã está ocupado a atualizar o conteúdo. RST significa Reset. DC é o pino Data Command, CS é Chip Select, e CLK é o pino Clock. DIN é o pino Data Input. VCC e GND são para a alimentação. O ecrã tem um regulador de voltagem integrado e podes usar 3,3V ou 5V para o alimentar.

Instalar a biblioteca GxEPD2 para E-Paper

Antes de podermos desenhar ou escrever no E-Paper, precisamos de install two libraries. A biblioteca Adafruit_GFX é uma biblioteca gráfica base que fornece um conjunto comum de primitivas gráficas (texto, pontos, linhas, círculos, etc.). E a biblioteca GxEPD2 fornece o software driver gráfico para controlar um E-Paper via SPI.

Abre o Library Manger, procura por “Adafruit_GFX” e “GxEPD2” e clica em “INSTALL”. Após a instalação, as bibliotecas devem aparecer no Library Manager da seguinte forma.

Adafruit_GFX and GxEPD2 libraries in Library Manager
Bibliotecas Adafruit_GFX e GxEPD2 no Library Manager

Nas duas secções seguintes, vou mostrar como ligar o ecrã E-Paper a um ESP32 ou a um Arduino. O ESP32 é preferível ao Arduino, pois tem uma memória muito maior, o que torna o código mais simples.

Ligar o Ecrã E-Paper ao ESP32

A imagem abaixo mostra como ligar um ESP32 lite ao ecrã E-Paper. Embora a maioria dos pinos possa ser configurada, precisas de saber os pinos SPI por defeito para a tua placa ESP32, especificamente para os sinais DIN e CLK. No caso do ESP32 lite, DIN está no pino 23 e CLK no pino 18.

Connecting e-Paper to ESP32 via SPI
Ligar o E-Paper ao ESP32 via SPI

Se precisares de ajuda para encontrar os pinos SPI por defeito, consulta o Find I2C and SPI default pins tutorial.

A tabela seguinte mostra todas as ligações que tens de fazer. Nota que podes alimentar o módulo do ecrã com 3,3V ou 5V, mas o ESP32-lite tem apenas uma saída de 3,3V.

Ecrã E-PaperESP32 lite
CS/SS5
SCL/SCK 18
SDA/DIN/MOSI23
BUSY15
RES/RST2
DC0
VCC3.3V
GNDG

Podes usar uma breadboard para ligar tudo. Mas eu liguei o ecrã diretamente ao ESP32 com fios Dupont. A imagem abaixo mostra como ficou o meu setup.

Wiring of E-Paper with ESP32 lite
Ligação do E-Paper com ESP32 lite

Código de teste para E-Paper com ESP32

De seguida, vamos escrever um código simples para testar o funcionamento do ecrã. Vamos mostrar o texto “Makerguides”, com “Maker” a preto e “guides” a vermelho.

#include "GxEPD2_3C.h"

#define EPD_CS 5  
#define EPD_DC 0  
#define EPD_RST 2  
#define EPD_BUSY 15  
// SCL/SCK/CLK  = 18,
// SDA/DIN/MOSI = 23

GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT> 
  epd(GxEPD2_290_C90c(EPD_CS , EPD_DC, EPD_RST, EPD_BUSY));

void setup() {
  epd.init(115200);
  epd.setRotation(1);
  
  epd.setTextSize(2);
  epd.setFullWindow();
  epd.fillScreen(GxEPD_WHITE);     

  epd.setCursor(80, 60);
  epd.setTextColor(GxEPD_BLACK);
  epd.print("Maker"); 

  epd.setCursor(140, 60);
  epd.setTextColor(GxEPD_RED);
  epd.print("guides");   

  epd.display();
  epd.hibernate();
}

void loop() {}

Vamos dividir o código em partes para melhor compreensão.

Inclusão de Bibliotecas

Começamos por incluir a biblioteca necessária para controlar o ecrã E-Paper. A biblioteca GxEPD2_3C.h fornece as funções necessárias para interagir com o ecrã tricolor.

#include "GxEPD2_3C.h"

Se tiveres um ecrã de 4 cores, incluirias GxEPD2_4C.h ou GxEPD2_7C.h para um ecrã de 7 cores, em vez disso. Se tiveres um ecrã E-Paper preto e branco (BW), inclui GxEPD2_BW.h

Definição dos Pinos

De seguida, definimos os pinos usados para ligar o ecrã ao ESP32 via interface SPI:

#define EPD_CS 5  
#define EPD_DC 0  
#define EPD_RST 2  
#define EPD_BUSY 15  

Criação do Objeto Display

Criamos uma instância do objeto do ecrã E-Paper usando os pinos definidos. Os parâmetros do template especificam também o tipo de ecrã e a sua altura.

GxEPD2_3C<GxEPD2_290_C90c, GxEPD2_290_C90c::HEIGHT>
  epd(GxEPD2_290_C90c(EPD_CS , EPD_DC, EPD_RST, EPD_BUSY));

Esta é a linha mais crítica do código. Se o teu ecrã não mostrar nada ou mostrar texto/imagens corrompidas, ou o ecrã não está corretamente ligado ou foi escolhido o driver errado.

A biblioteca Readme for GxEPD2 lista todos os ecrãs suportados e podes encontrar os detalhes nos ficheiros header, por exemplo GxEPD2.h. Encontra o driver específico para o teu ecrã. Isto pode requerer alguma tentativa e erro.

Função Setup

Na função setup(), inicializamos a comunicação com o ecrã com uma taxa de 115200 baud. Também definimos a rotação do ecrã para 1 (90 graus), que é o modo Paisagem.

epd.init(115200);
epd.setRotation(1);

De seguida, configuramos o tamanho do texto e preparamos o ecrã para desenhar.

epd.setTextSize(2);
epd.setFullWindow();
epd.fillScreen(GxEPD_WHITE);     

Depois, definimos a posição do cursor e a cor do texto para preto antes de imprimir “Maker” no ecrã.

epd.setCursor(80, 60);
epd.setTextColor(GxEPD_BLACK);
epd.print("Maker"); 

Depois, mudamos a posição do cursor e a cor do texto para vermelho para imprimir “guides”.

epd.setCursor(140, 60);
epd.setTextColor(GxEPD_RED);
epd.print("guides");   

Ambos os comandos de impressão juntos vão mostrar o texto “Makerguides” no centro do ecrã. A saída no teu ecrã deverá ser a seguinte:

Output on e-Paper display
Saída no ecrã E-Paper

Finalmente, chamamos epd.display() para renderizar o texto no ecrã e colocar o ecrã em modo hibernação para poupar energia.

epd.display();
epd.hibernate();

Função Loop

A função loop() está vazia neste exemplo, pois só precisamos de inicializar e mostrar o texto uma vez. O ecrã permanecerá num estado de baixo consumo e continuará a mostrar o texto, mesmo que a alimentação seja completamente removida.

void loop() {}

Se carregares e executares o código, vais ver o ecrã a piscar durante cerca de 15 segundos, enquanto o texto surge lentamente (ver o pequeno vídeo abaixo).

Atualização completa do ecrã E-Paper

Isto chama-se “Atualização completa” e limpa todo o ecrã, redesenhando todos os pixels. Este processo garante que quaisquer imagens residuais ou fantasmas de conteúdos anteriores são eliminados.

Uma “Atualização parcial”, por outro lado, atualiza apenas áreas específicas do ecrã. Este método é muito mais rápido (< 0,3 seg) e evita o piscar. Para exemplos, vê o Partial Refresh of e-Paper Display tutorial.

Enquanto as atualizações parciais são normalmente suportadas por ecrãs E-Paper monocromáticos, muitos ecrãs tricolores, incluindo o usado neste projeto, não as suportam. Isso limita a sua aplicação a casos onde as atualizações de conteúdo são pouco frequentes, por exemplo, uma vez por hora. Caso contrário, o piscar e a atualização lenta são demasiado distrativos.

Ligar o Ecrã E-Paper ao Arduino

Nesta secção, ligamos o ecrã E-Paper a um Arduino Uno em vez de um ESP32. O número de ligações é o mesmo, apenas os pinos são diferentes. Como mencionado antes, a maioria dos pinos pode ser configurada, mas para as linhas DIN e CLK precisamos de usar os pinos SPI específicos. No caso do Arduino Uno, DIN está no pino 11 e CLK no pino 13.

Connecting E-Paper to Arduino Uno via SPI
Ligar o E-Paper ao Arduino Uno via SPI

A tabela seguinte lista todas as outras ligações que tens de fazer. Para alimentação, podes usar 5V em vez de 3,3V.

Ecrã E-PaperArduino UNO
CS/SS4
SCL/SCK/CLK13
SDA/DIN/MOSI11
BUSY7
RES/RST6
DC5
VCC3.3V
GNDG

Código de teste para E-Paper com Arduino Uno

O código para testar o E-Paper com um Arduino Uno é semelhante ao usado com o ESP32, com duas diferenças importantes, causadas pela pequena memória do Arduino Uno.

Dá uma vista rápida ao código primeiro e talvez lê o exemplo do ESP32 para contexto. Depois discutiremos as diferenças.

#include "GxEPD2_3C.h"

#define EPD_CS 4
#define EPD_DC 5
#define EPD_RST 6
#define EPD_BUSY 7
// SCL/SCK/CLK  = 13,
// SDA/DIN/MOSI = 11

#define MAX_BUFF 1024
#define MAX_HEIGHT(EPD) ((MAX_BUFF / 2) / (EPD::WIDTH / 8))

GxEPD2_3C<GxEPD2_290_C90c, MAX_HEIGHT(GxEPD2_290_C90c)>
   epd(GxEPD2_290_C90c(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY));

void setup() {
  epd.init(115200);
  epd.setRotation(1);
  epd.setTextSize(2);
  epd.setFullWindow();

  epd.firstPage();
  do {
    epd.fillScreen(GxEPD_WHITE);

    epd.setCursor(80, 60);
    epd.setTextColor(GxEPD_BLACK);
    epd.print("Maker");

    epd.setCursor(140, 60);
    epd.setTextColor(GxEPD_RED);
    epd.print("guides");

  } while (epd.nextPage());
  epd.hibernate();
}

void loop() {}

Como antes, o código escreve o texto “Makerguides” a preto e vermelho no ecrã. No entanto, a forma como o objeto do ecrã é criado é diferente. Especificamente, temos de definir a altura (MAX_HEIGHT) do ecrã:

#define MAX_BUFF 1024
#define MAX_HEIGHT(EPD) ((MAX_BUFF / 2) / (EPD::WIDTH / 8))

GxEPD2_3C<GxEPD2_290_C90c, MAX_HEIGHT(GxEPD2_290_C90c)>
   epd(GxEPD2_290_C90c(EPD_CS, EPD_DC, EPD_RST, EPD_BUSY));

O ecrã E-Paper tem uma resolução de 296 * 128 pixels, o que significa que um total de 37888 pixels precisam ser definidos para atualizar o conteúdo mostrado no ecrã. Normalmente, o conteúdo é escrito primeiro num buffer de ecrã e depois enviado para o ecrã. Contudo, um Arduino Uno tem apenas 2KB de SRAM = 2048 bytes, o que é demasiado pequeno para conter o buffer completo. Por isso, definimos um buffer de ecrã menor MAX_BUFF = 1024.

Com o buffer de ecrã menor, não podemos enviar o buffer completo, mas apenas uma faixa de MAX_HEIGHT, que é derivada de MAX_BUFF e da largura (EPD::WIDTH) do ecrã. Calculamos a altura do ecrã via MAX_HEIGHT(GxEPD2_290_C90c).

Desenho por páginas

O ecrã é então atualizado usando um modo de desenho por páginas. Este método divide o ecrã em secções menores ou faixas chamadas “páginas”. Em vez de carregar todo o conteúdo, o Arduino processa apenas uma página de cada vez.

Podes ver isto no dowhile loop na função setup, onde as páginas são desenhadas repetidamente até que o conteúdo completo do ecrã seja atualizado.

  epd.firstPage();
  do {
     ...
  } while (epd.nextPage());

Ao atualizar o ecrã, o Arduino desenha o conteúdo da página atual na memória, depois envia essa página para o ecrã E-Paper. Após a atualização da página, o Arduino pode limpar o buffer e carregar a página seguinte.

Nota que o buffer do ecrã e o código do sketch partilham a mesma memória. Se o teu código crescer, podes ter de reduzir MAX_BUFF para que ambos caibam na SRAM. Se receberes a seguinte mensagem de erro ao compilar, sabes que MAX_BUFF está definido demasiado alto:

Not enough memory; see https://support.arduino.cc/hc/en-us/articles/360013825179 for tips on reducing your footprint. 
data section exceeds available space in board.
Compilation error: data section exceeds available space in board

O loop explícito do-while para desenho por páginas é algo incómodo e pouco elegante. Felizmente, a biblioteca GxEPD2 oferece outra opção. Podes definir uma função de desenho e depois chamar epd.drawPaged(...) para desenho por páginas. O exemplo de código seguinte mostra como isso fica para o código de teste acima:

...

void draw(const void* pv) {
  epd.fillScreen(GxEPD_WHITE);

  epd.setCursor(80, 60);
  epd.setTextColor(GxEPD_BLACK);
  epd.print("Maker");

  epd.setCursor(140, 60);
  epd.setTextColor(GxEPD_RED);
  epd.print("guides");
}

void setup() {
  ...
  epd.drawPaged(draw, 0);
  epd.hibernate();
}

void loop() {}

A função de desenho draw() recebe um ponteiro pv, que permite passar parâmetros, embora não o usemos aqui. Ao chamar epd.drawPaged(draw, 0), passamos simplesmente 0 como ponteiro de parâmetro.

O uso de funções de desenho para redesenhos por páginas torna o código mais legível e extensível. Podes ter várias funções de desenho, o que é especialmente útil ao realizar atualizações parciais e completas. Vê o Digital Clock on e-Paper Display tutorial para um exemplo.

Nota que podes usar desenho por páginas mesmo que o teu microcontrolador seja grande o suficiente para conter o buffer completo do ecrã. Por exemplo, o código de teste para o Arduino Uno funcionaria sem alterações (para além da ligação) num ESP32 e, em geral, o desenho por páginas é recomendado.

Recomendações

A Waveshare Manual fornece as seguintes recomendações ao operar um ecrã E-Paper (resumidas e reformuladas por mim):

Atualização completa: O ecrã E-Paper pisca várias vezes durante o processo de atualização (o número de piscadelas depende do tempo de atualização), e o piscar serve para remover imagens residuais e alcançar o melhor efeito de visualização.

Atualização parcial: Neste caso, o ecrã não pisca durante o processo de atualização. Após várias operações de atualização parcial, deve ser feita uma atualização completa para remover a imagem residual. Caso contrário, a imagem residual pode tornar-se permanente.

Recomenda-se definir o intervalo de atualização do ecrã e-ink para pelo menos 180 segundos (exceto para produtos que suportem atualização parcial).

Após uma operação de atualização, recomenda-se desligar ou hibernar o ecrã. Isto prolonga a vida útil do ecrã e reduz o consumo de energia.

Ao usar um ecrã e-ink tricolor, recomenda-se atualizar o ecrã pelo menos uma vez a cada 24 horas.

Os ecrãs E-Paper são recomendados para uso interior e não para uso exterior. Se quiseres usar o ecrã no exterior, coloca-o numa área sombreada e cobre completamente a parte da cola branca da fita de conexão do ecrã E-Paper com fita 3M.

Conclusões

Os ecrãs E-Paper oferecem várias vantagens que os tornam atraentes para diversos projetos. Consomem muito pouca energia, especialmente ao mostrar imagens estáticas, o que é ideal para dispositivos alimentados por bateria. A sua excelente legibilidade à luz solar direta torna-os adequados para aplicações exteriores, enquanto os amplos ângulos de visualização garantem clareza de diferentes perspetivas. Além disso, os ecrãs E-Paper são finos e leves, permitindo fácil integração em vários designs.

No entanto, os ecrãs E-Paper têm uma taxa de atualização lenta comparada com LCDs ou OLEDs, o que pode limitar o seu uso em projetos que requerem conteúdo dinâmico. As opções de cor também são limitadas; ecrãs preto e branco mostram apenas duas cores, enquanto ecrãs tricolores estão restritos a três cores, o que pode afetar a flexibilidade do design. Além disso, os ecrãs E-Paper podem ser mais caros do que outros tipos de ecrã, especialmente para tamanhos maiores.

Os ecrãs E-Paper monocromáticos têm taxas de atualização muito mais rápidas (< 3 segundos) do que os tricolores e tipicamente suportam atualização parcial para uma atualização ainda mais rápida e sem piscar. São rápidos o suficiente para mostradores de relógio, por exemplo. Vê os nossos tutoriais Digital Clock on e-Paper Display e Analog Clock on e-Paper Display.

O tempo de atualização muito lento (15 segundos) dos ecrãs tricolores limita as suas aplicações. O caso de uso mais comum são etiquetas eletrónicas de preço. Mas podes usá-lo para outras aplicações com ciclos de atualização lentos também. Por exemplo, dados meteorológicos precisam ser atualizados apenas a cada 15 minutos, aproximadamente.

O nosso Weather Station on e-Paper Displaytutorial usa um E-Paper monocromático, mas um E-Paper tricolor seria uma opção. E se precisares de ainda mais cores, vê o 4-color E-paper display with ESP32 tutorial.

Se tiveres alguma dúvida, não hesites em perguntar na secção de comentários.

Boas construções ; )