17 de maio de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Display e-ink com ESP32 da MH-ET Live

display e-ink e-paper mh-et live

Pense numa belezinha! Esse display e-ink com ESP32 é tudo de bom! Mas antes de começarmos, permitam-me apresentar o novo parceiro do blog, a Saravati (é um sobrenome, não é Sarava T.I. – eu havia pensado que era.).

Esse parceiro faz uma coisa que era meu sonho; enche a loja de de novidades e tem loja física. Recomendo que visitem o site e deleitem-se com os produtos.

Cada coisa tem seu propósito, cada projeto é dimensionado de um jeito. Pode ser foco em custo, em qualidade (custo e qualidade podem, mas nem sempre andam juntos) ou a estratégia pode ser economia de energia.

Se estiver à procura de um display econômico, certamente não haverá outro igual. Esse display e-ink de 1.54 tem área o suficiente para exibir informações diversas, não apenas números ou letras, mas imagens com boa qualidade. Não estou sugerindo que seja um porta-retrato preto e branco, mas 200×200 em uma área de 1.54″ não é nenhum display de 7 segmentos. Me parece uma solução fantástica para usar em projetos de domótica, onde preza-se pela aparência.

Como funciona o display e-ink (ou e-paper)

O e-paper usa uma tecnologia de exibição de image eletroforética microencapsulada. Nome lascado de ruim, hum?

A eletroforese é uma técnica de separação de moléculas, que faz as particulas migrarem de um lugar para outro, aplicando diferença de potencial. O que não tenho certeza é em relação ao encapsulamento, se é por pixel, mas na minha ignorância, presumo que seja.

Não é necessário luz de fundo justamente porque a tela tem uma cor sólida, assim como o gel que contém as partículas que serão carregadas e essa é a mágica que nos permite ler o kindle à beira de uma piscina.

Mesmo desligado, a última carga de partículas pode permanecer por até 6 meses visivel, servindo a diversos propósitos, como etiquetas de preços de produtos em prateleiras, medidores industriais ou qualquer outro que necessite visualização estática por longos períodos, coisa que pode viciar diversos tipos de display, deixando as “sombras” quando a imagem ou texto é trocado.

Resumidamente, o único consumo de energia é o da carga para a tela, mais nada.

A interface de controle é SPI de 3 ou 4 fios, permitindo seu controle por qualquer dispositivo que ofereça o barramento.

Características do display e-ink MH-ET Live

É uma característca de qualquer display e-ink ser econômico, porque ele só carrega o display e desliga. Seu consumo é 0 quando não está carregando dados. De negativo, display e-ink normalmente tem um delay gigante em relação a qualquer outro display. Portanto, se está querendo um para gerar gráfico de tempo-real, esqueça. Além de gerar consumo constante, não trará mais do que aborrecimento.  Agora, se seu projeto precisa fundamentalmente economizar energia, mas quer ter informações em um display (o que em outro caso seria um paradoxo), essa é a solução. Mesmo desligado, a informação no display é persistente.

Outra vantagem desse display é que ele pode ser alimentado em nível lógico 3v3 ou 5v, bastando utilizar a chave seletora da parte de trás.

Para makers, os atrativos são tanto tecnológicos como visuais. A placa preta, gravada provavelmente em hot stamp, com proteção acrílica para a tela e pezinhos faz desse acessório um item de decoração de mesa, seja para exibir condições climáticas, mensagens do telegram, twitter, variação do bitcoin ou qualquer coisa que justifique minimamente a aquisição desse tesourinho.

Não dá pra usar como um relógio de pulso, a não ser no braço do Faustão, por isso não consegui pensar ainda em uma forma de exibí-lo sem que seja convidando todo mundo pra vir em casa. Mas para projetos em que a alimentação seja à base de bateria e painéis solares (como estações meteorológicas, controles de solo em fazenda e afins), é sem dúvida a melhor opção.

Dimensões: 55m x 39.4mm.

Tensão de entrada selecionável: 3v3 ou 5v.

Modo SPI: 3 ou 4 fios, slecionável por chave, também na parte de trás do display.

Bibliotecas

Diversas bibliotecas devem funcionar com esse display. Vejamos as que comprovadamente nos servem.

GxEPD2

Você encontra essa biblioteca no repositório oficial do Arduino, sem maiores complicações, contando inclusive com exemplos de uso. Atente-se apenas ao Wiring.

Claro que esse display funciona também com Arduino, Raspberry, STM32 e deve funcionar com qualquer dispositivo que possua o barramento SPI.

EPD1IN54

Prepare-se para o susto. Eu só achei o documento oficial em Chinês. A biblioteca oficial Pode ser pega no github da MH-ET, nesse link.

Essa biblioteca é a oficial, bastando incluí-la na IDE do Arduino. Baixe-a, descomprima-a no diretório libraries do Arduino. Pelo repositório da IDE, procure por epd1in54, deve retornar uma biblioteca chamada EPD.

IDE de desenvolvimento

Não, não tem e não precisa de uma IDE exclusiva para ele, mas essa é uma oportunidade que tenho para citar o VisualStudio Code. Já recomendei diversas IDEs, mas nenhuma se compara ao VisualStudio. E tem versões para Mac OS e Windows também (ironia). Jamais pensei que utilizaria algum produto da Microsoft, pelo simples fato de achar que jamais a Microsoft disponibilizaria algo para Linux que realmente fizesse diferença. Mas claro que não podemos tirar o mérito do PlatformIO, que é o plugin para praticamente todas as IDEs de mercado que nos dá acesso a muitas plataformas e às bibliotecas do Arduino, sem precisar usar aquela IDE feia e sem recursos. Justifico com apenas 1 das vantagens; auto-completion. Só isso já aumenta a produtividade exponencialmente.

Se desejar experimentar, vá ao site oficial da Microsoft e baixe-o para sua plataforma.

Do lado esquerdo, clique sobre o quadrado e instale os plugins que desejar. Os meus são esses:

O último ícone do lado esquerdo é o menu do PlatformIO, talvez eu faça um vídeo só pra justificar o uso do VisualStudio Code.

Wiring

Antes de conectar o display, garanta o nível de operação. Na parte de trás do display tem uma chave para essa seleção. Se for utilizá-lo com Arduino UNO, Mega ou outro que utilize nível lógico de 5V, coloque a chave em 5V.

Wiring para Arduino

O wiring deve ser assim para essas placas:

1.54 e-Paper

UNO /NANO V3.0/ PRO MINI /MEGA2560

5.0V

5.0V

GND

GND

DIN

D11

CLK

D13

CS

D10

DC

D9

RST

D8

BUSY

D7

Leia todo o artigo antes de ligar seu display, eu sugiro.

Wiring para Raspberry

O nível lógico do Raspberry é 3v3, portanto se testou o display em um Arduino com nível lógico de 5V, não esqueça de voltar a chave atrás do display para o nível lógico correto.

 

e-Paper

Raspberry Pi 3B

3.3V

3.3V

GND

GND

SDIN

MOSI

SCLK

SCLK

CS

CE0

DC

25

RST

17

BUSY

24

Sobre a configuração, farei um artigo exclusivo, porque temos algumas possibilidades interessantes.

Wiring no STM32103C8T6 – carinhosamente, Blue Pill

O Blue Pill é 3v3, o que facilita bastante as coisas, assim como o Raspberry.

e-Paper

STMF103C8T6

3.3V

3.3V

GND

GND

DIN

PB9

CLK

PB8

CS

PB7

DC

PB6

RST

PB5

BUSY

PB4

Também farei um arquivo exclusivo para STM32.

Wiring para ESP32

A estrela desse artigo é o ESP32, por isso deixei seu Wiring para o final. Aqui temos um Ctrl+Chups do Google:

wiring esp32 com display e-ink e-paper

Código de exemplo para ESP32

Primeiro subi um código de exemplo, resolvendo todas as dependências. Depois, adicionei um NTP para pegar a hora e coloquei um retângulo com o link do blog no rodapé. Adicionei uma nova fonte para o texto menor. As fontes disponíveis estão no diretório Adafruit_GFX/Fonts  no diretório de bibliotecas do Arduino. No caso, utilizei o VisualStudio Code com PlatformIO no Linux, então a biblioteca fica nesse diretório, precedido por .platformio/lib/.

Última observação em relação às adições; width e height estão invertidos na definição do link do blog. Só.

Lembre-se de suprir as bibliotecas requisitadas no header. Não precisa ficar caçando, vá compilando e veja na mensagem de erro do compilador quais as bibliotecas faltantes no seu projeto. Outra coisa importante; espero que aproveite esse código, porque tem uma informação importante que em algum momento poderá ser utilizada em uma necessidade exclusiva sua. Explico.

O display está utilizando os pinos 21 e 22, que seria o I2C padrão do ESP32. Para resolver o problema, importei a biblioteca Wire e , dentro da função setup() a inicializei, passando outros pinos para o begin.  Ao iniciar então o objeto do sensor de temperatura BME280, passei o objeto Wire criado anteriormente, logo após o endereço, em begin().

Tive que editar o código das bibliotecas Wire e BME280 para encontrar uma solução, então vi que tem alguns overloads da função begin, uma delas recebendo o endereço do objeto Wire. Ufa.

#include <SPI.h>
#include <GxEPD2.h>
#include <GxGDEP015OC1/GxGDEP015OC1.cpp>
#include <GxIO/GxIO_SPI/GxIO_SPI.cpp>
#include <GxIO/GxIO.cpp>
#include <Adafruit_BME280.h>
#include <Wire.h>
#include <NTPClient.h>
#include <WiFi.h>
#include <WiFiUdp.h>

#include "BitmapGraphics.h"

#include <Fonts/FreeSansBold24pt7b.h>
#include <Fonts/FreeSans9pt7b.h>

float tempC = 0;

GxIO_Class io(SPI, SS, 22, 21);
GxEPD_Class display(io, 16, 4);

#define BME_SCL 27
#define BME_SDA 26

Adafruit_BME280 bme;

char ssid[]   = "SuhankoFamily"; 
char passwd[] = "fsjmr112";

const char* ntp_server = "192.168.1.2"; //meu servidor DNS e NTP (Raspberry)
const int UTC          = 60*60*3*-1; //-3h
const int refresh_rate = 1800000;
 
WiFiUDP ntp_udp; 
NTPClient timeClient(ntp_udp, ntp_server, UTC, 60000);

void showPartialUpdate(float temperature);
void printTemperatureToSerial();

void setup() {
  Serial.begin(9600);
  WiFi.begin(ssid, passwd);
  while (WiFi.status() != WL_CONNECTED)
  {
      Serial.print(".");
      delay(500);
  }
  timeClient.begin();

  display.init();
   Wire.begin(BME_SDA,BME_SCL);
   if (!bme.begin(0x76, &Wire)){
    Serial.println("BMP280 isn't started. locking here.");
    while (true);
  }

  display.drawExampleBitmap(gImage_splash, 0, 0, 200, 200, GxEPD_BLACK);
  display.update();
  delay(3000);
  
  display.drawExampleBitmap(gImage_gui, 0, 0, 200, 200, GxEPD_BLACK);
  display.update();

  display.drawExampleBitmap(gImage_gui, sizeof(gImage_gui), GxEPD::bm_default | GxEPD::bm_partial_update);
}

void loop() {
  
  tempC = bme.readTemperature();
  
  showPartialUpdate(tempC);
  printTemperatureToSerial();
  
  delay(5000);
}

void showPartialUpdate(float temperature)
{
  String temperatureString = String(temperature,1);
  const char* name  = "FreeSansBold24pt7b";
  const GFXfont* f  = &FreeSansBold24pt7b;

  const char *hourF = "FreeSans9pt7b";
  const GFXfont *f2 = &FreeSans9pt7b;
  
  uint16_t box_x = 60;
  uint16_t box_y = 60;
  uint16_t box_w = 90;
  uint16_t box_h = 80;
  uint16_t cursor_y = box_y + 16;

  display.setRotation(45);
  display.setFont(f);
  display.setTextColor(GxEPD_BLACK);

  display.fillRect(box_x, box_y, box_w, box_h, GxEPD_WHITE);
  display.setCursor(box_x, cursor_y+38);
  display.print(temperatureString); 


  timeClient.update();
  Serial.println(timeClient.getFormattedTime());
 
  String time_now = timeClient.getFormattedTime();
  display.setFont(f2);
  display.setCursor(box_x+20, cursor_y+60);
  display.print(time_now); 

  display.updateWindow(box_x, box_y, box_w, box_h, true);


  uint16_t bx  = 35;
  uint16_t by  = 170;
  uint16_t bw  = 160;
  uint16_t bh  = 20;
  display.fillRect(bx, by, bw, bh, GxEPD_WHITE);
  
  uint16_t char_top = by+10;

  display.setCursor(bx, char_top);
  display.print("dobitaobyte.com.br"); 

  display.updateWindow(bx, by, bw, bh, true);
}

void printTemperatureToSerial()
{
  Serial.print(tempC);
  Serial.print(" C");
  Serial.print("\t");
}

 

Criando imagens para exibir no display

Primeiramente, vá até o fork do repositório que fiz e clone-o ou faça download do arquivo zip. Não se assuste, diversas coisas estão escritas em chinês, vou ver se renomeio em algum momento.

Programa para converter imagens para o display e-ink

Dentro do diretório MH-ET-LIVE-E-Papers/1.54Epaper code and test-guide 墨水屏说明及测试示例/黑白屏测试程序/图片转码软件/Image2Lcd/ tem um programa chamado Img2Lcd.exe. Eu não uso Windows, vou fazer meu próprio programa para gerar a imagem, mas para você que usa Windows e confia em executar binários de qualquer fonte, essa é uma opção.

Preparando uma imagem

Crie uma imagem monocromática em seu editor de imagens preferido, com as dimensões de 200×200 px.

O Gimp é gratuito e tem versões para Linux e Windows. Claro que você pode utilizar qualquer outro, como  o Photoshop, por exemplo.

Exporte a imagem como um BMP monocromático e use o programa Image2Lcd.exe para gerar uma matriz, que ficará em um arquivo com extensão .c correspondente à imagem. Elimine os dados exif, se possível, não crie a imagem com eles. Se você instalar o subsistema Linux no Windows, talvez você possa contar com a ferramenta mogrify para auxliá-lo na limpeza da imagem:

mogrify -strip imagem_a_remover_exif.bmp

Depois de gerado o arquivo.c, basta copiar o array para o seu programa.

Onde comprar?

O display e-ink está disponível em nosso novo parceiro, Saravati, que tem loja física em São Paulo para quem gosta de passear. O endereço está no site e o link para esse display e-ink é esse.

Reparou no conector? Os pinos vem junto, tudo em uma linda caixa plástica antiestática. Esse protetor acrílico sobre o display, os parafusos e os pés plásticos também acompanham o kit. Já os jumpers não.

Os jumpers e esse header para múltiplos cabos pode ser adquirido em nosso parceiro MASUGUX, através desse link.

Diversos parceiros tem o ESP32, mas a placa de desenvolvimento para ESP32 você pode adquirir em nosso parceiro CurtoCircuito visitando a seção relacionada a ESP32.

Curso de Raspberry Pi

Estou próximo do término da produção de um curso de Raspberry Pi, o qual pretendo receber uns trocos por ele. Estou bastante satisfeito com a composição do curso e espero poder contar com vocês. Só uma dica; o valor é uma das notas mais baixas do nosso dinheiro, uma pechincha!

Projetos para sua empresa

Do bit Ao Byte é mais do que um blog. Somos uma empresa de serviços, cuja principal atividade é desenvolvimento e implementação de projetos embarcados e IoT.
Trabalhamos dentro da legalidade, emitindo nota fiscal de serviço, elaboração de requisitos de sistema e documentação do código.
Não importa onde você esteja, montamos a prova de conceito e gravamos vídeo do projeto antes de entregar o código e/ou hardware configurado.

Em parceria com a AFEletrônica, projetamos e produzimos hardware industrial (também com nota), para lhe entregar a melhor experiência para seu projeto.

Se precisar de treinamento para sua equipe, palestra, projetos com requisitos, perícia forense digital, consultoria, auditoria, software ou hardware, somos quem você procura!
Entre em contato:
vendas@afeletronica.com.br
Ou direto comigo:
djames.suhanko@gmail.com

Será um prazer tê-lo como nosso cliente!