
EchoVision: Display E-Paper e Sentinela de Clima (PIR + AHT20)
Seja bem-vindo de volta ao ecossistema Zion!
Já fizemos a EchoVision falar e ouvir. Agora, vamos dar a ela a capacidade de exibir informações de forma elegante e ultra eficiente, e o melhor: ela só vai trabalhar quando detectar que tem alguém por perto!
Hoje vamos integrar o sensor de movimento PIR, o sensor de precisão de temperatura e umidade AHT20 e o incrível display WeAct E-Paper 1.54″. Prepare-se, porque o resultado visual parece mágica.
Por que usar um Display E-Paper?
Se você já usou um Kindle, sabe do que estamos falando. O E-Paper (ou Papel Eletrônico) tem qualidades que nenhum LCD ou OLED consegue superar:
- Consumo Zero (Estático): Ele só gasta energia para mudar a imagem. Depois que desenhou, você pode até tirar a bateria que a imagem continua lá para sempre!
- Visibilidade Sob Sol: Quanto mais luz bate nele, melhor fica a leitura. Nada de reflexos chatos.
- Conforto Visual: Não emite luz direta, simulando a aparência de tinta no papel. É o ápice da sofisticação para dispositivos de mesa ou parede.
O que você vai precisar:
- Placa Zion EchoVision (ESP32-S3)
- Display WeAct E-Paper 1.54″
- Sensor PIR (O “vigia”)
- Sensor AHT20 (O “termômetro”)
- Cabo USB-C e Jumper Cables
Passo 1: O Mapa da Mina (Conexões)
O E-Paper usa comunicação SPI. Como na Zion a gente gosta de velocidade, configuramos os pinos de alta performance do ESP32-S3:
- SCK: GPIO 47 | MOSI: GPIO 48
- CS: GPIO 46 | DC: GPIO 45
- RST: GPIO 42 | BUSY: GPIO 41
- PIR: GPIO 37 | I2C (AHT20): SDA 38 / SCL 39
Passo 2: O Código
Este código faz o seguinte: o ESP32 fica vigiando o sensor PIR. Quando alguém passa, ele acorda o AHT20, lê o clima e “carimba” a informação no papel eletrônico.
#include <GxEPD2_BW.h>
#include <epd/GxEPD2_154_D67.h>
#include <Adafruit_GFX.h>
#include <Adafruit_AHTX0.h>
// --- DEFINIÇÃO DOS PINOS (O Mapa da Mina) ---
#define PIN_SCK 47 // Batiza o pino 47 como Clock (o maestro do ritmo)
#define PIN_MOSI 48 // Batiza o 48 como MOSI (o que manda os dados)
#define PIN_MISO -1 // MISO não precisa aqui, o display só escuta, não fala
#define PIN_CS 46 // Chip Select: "Ei display, tô falando com você!"
#define PIN_DC 45 // Data/Command: "Isso aqui é dado ou é ordem?"
#define PIN_RST 42 // Reset: "Reinicia aí, meu filho"
#define PIN_BUSY 41 // Busy: "Peraí que tô ocupado desenhando"
#define PIR 37 // Pino Pir
GxEPD2_BW<GxEPD2_154_D67, GxEPD2_154_D67::HEIGHT> display(GxEPD2_154_D67(PIN_CS, PIN_DC, PIN_RST, PIN_BUSY));
Adafruit_AHTX0 aht;
void setup() {
pinMode(PIR, INPUT);
Wire.begin(38, 39);
aht.begin(); // Inicia o AHT20
delay(2000); // Espera 2 segundinhos pro sistema acordar
pinMode(1, OUTPUT); // Prepara o pino 1 pra mandar sinal
digitalWrite(1, LOW); // Manda 0V no pino 1 (Apaga LED ou ativa algo invertido)
SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS); // Liga o barramento SPI nos pinos que a gente escolheu (47, 48, 46)
display.init(115200); // Acorda o display pra vida!
display.setRotation(1); // Gira a tela (0=pé, 1=deitado, etc)
display.setFullWindow(); // O setFullWindow avisa: "Vou atualizar a tela inteira, sem miséria"
display.fillScreen(GxEPD_WHITE); // Pinta o fundo todo de branco (borracha)
display.setTextColor(GxEPD_BLACK); // Carrega a caneta com tinta preta
}
void loop() {
if(digitalRead(PIR)==HIGH){ // Se tiver movimento...
sensors_event_t humidity, temp; // Inicia as leituras
aht.getEvent(&humidity, &temp); // Pega os valores de temperatura e umidade
display.firstPage(); // O PULO DO GATO: Começa a "paginação" do desenho aqui!
do {
display.setTextSize(3); // Tamanho da fonte: 3 (Grandão)
display.setCursor(10, 30); // Posiciona a caneta no X=10, Y=30
display.print("T:"+String(temp.temperature,1)+"C"); // Imprime os valores
display.setCursor(10, 70); // Muda a posição da caneta pra baixo
display.print("H:"+String(humidity.relative_humidity,1)+"%"); // Escreve a segunda palavra
display.drawRect(0, 0, 200, 200, GxEPD_BLACK); // Desenha um quadrado preto em volta da tela toda (borda)
}
while (display.nextPage()); // Enquanto tiver pedaço da tela pra desenhar, repete o loop
display.powerOff(); // Desliga a energia da tela pra não gastar bateria (hiberna)
delay(5000); //Espera 5 seg.
}
else
display.powerOff(); // Manda dormir de novo
}
Você notou o do { ... } while (display.nextPage());? Displays E-Paper consomem muita memória RAM para processar a imagem. Essa técnica de paginação permite que o ESP32 desenhe a tela em “pedaços”, garantindo que seu código nunca trave por falta de memória, mesmo em projetos gigantes!
Desafio Zion
Que tal deixar esse projeto ainda mais profissional? Tente adicionar uma imagem ou ícone de termômetro no display usando a biblioteca drawBitmap.
Dúvidas? Posta aí nos comentários e bora criar!
