Avançar para o conteúdo

Display LCD TFT ST7735 com RP2040

Neste artigo, aprenderemos como usar o display LCD TFT ST7735 com o Raspberry Pi RP2040 Zero e o código Arduino. Leremos um sensor de temperatura LM35 e mostraremos a temperatura no display.

O motivo pelo qual usaremos um RP2040 em vez do mais novo RP2350 é porque acabei de comprar um par de RP2040 Zero da Waveshare, um módulo muito pequeno que realmente cabe em um canto da placa de ensaio. Esta placa específica possui ARM Cortex M0+ de núcleo duplo e 20 GPIOs divididos nas bordas da placa. Mais nove (9) GPIOs estão disponíveis soldando fios em “pontos de teste” na placa.

O ST7735 é um controlador/driver LCD TFT cuja folha de dados está aqui, para referência. Este display específico que tenho se comunica via SPI e tem uma resolução de 128×160 pixels em 262k (262.000) cores. Seu tamanho é de 1,8″ (polegadas) com oito (8) pinos para alimentação e comunicação.

Display LCD TFT ST7735 em uma protoboard
Display LCD TFT ST7735 em uma protoboard

Estou usando o LM35 como sensor de temperatura para esta construção, pois é simples e direto de usar. Ele “cospe” 10mV por grau Celsius, então, por exemplo, quando a temperatura é de 22ºC, ele apresentará 220mV (0,22V). Também apresentarei um contador de “tempo de atividade” na tela, incrementando a cada segundo sem parar.

Hardware

Este projeto tem três componentes principais: um LCD TFT ST7735 de 1,8″, um sensor de temperatura LM35 e o microcontrolador RP2040 Zero. É importante dizer que você não precisa de um RP2040, basicamente qualquer microcontrolador compatível com Arduino fará o trabalho para nós. Este link tem a pinagem para o RP2040 Zero e este para o ST7735. Tudo é reproduzido na imagem abaixo para maior clareza.

Diagrama esquemático do display ST7735 com RP2040 e sensor LM35
Diagrama esquemático do display ST7735 com RP2040 e sensor LM35

Comprei o display 1.8″ ST7735 da Aliexpress usando este link (meu link de afiliado). Ele tem um tamanho de tela decente, especialmente quando comparado aos displays LCD 16×2, que são monocromáticos. Este tem cores RGB completas e uma taxa de atualização rápida. Veja abaixo uma foto da montagem na minha bancada.

Display ST7735 com LM35 e RP2040 na protoboard
Display ST7735 com LM35 e RP2040 na protoboard

Código/firmware

Há uma pequena biblioteca bacana feita pela Adafruit para este display. O ST7735 pode ser controlado por ele, incluindo o desenho de gráficos como linhas, triângulos, retângulos, etc. Também é possível alterar o tamanho da fonte e a cor do texto. Para instalá-lo no seu Arduino IDE, vá em “Sketch > Include library > Manage Libraries” e digite “ST7735”; instale o da Adafruit.

Vamos então falar sobre algumas limitações do display ou da biblioteca. Até onde eu sei, não há como reproduzir vídeos ou GIFs ou qualquer coisa animada neste display. É possível mostrar imagens de bitmap nele armazenando-as em um cartão SD. Meu módulo não tem, então não vou mostrar como fazer isso neste momento.

Outra limitação séria desta biblioteca (ou display) é que não há uma função de “limpar” para partes do display, então se você quiser mostrar um novo texto em cima do antigo, você pode fazer uma de duas coisas:

Limpar o display inteiro usando “tft.fillScreen(ST77XX_BLACK);” que preenche a tela com uma cor de sua escolha, ou
Desenhar uma forma (por exemplo, um retângulo) com uma cor sólida que seja a mesma do fundo.
Nenhuma das formas é ideal, ambas fazem o display “piscar” de uma forma feia e perceptível. Apesar de não ser o ideal, decidi fazer um exemplo implementando a técnica de desenho de retângulo. Eu escrevi um código que lê a temperatura de um sensor analógico LM35 (datasheet aqui) e atualiza a leitura e a tela a cada 20 ms (0,02 segundos). Mesmo com uma taxa de atualização de 50 Hz, o display ainda “pisca” um pouco, como você verá no vídeo abaixo.

Também coloquei mais duas coisas em exposição: a palavra “FritzenLab” na cor verde e um contador para cada segundo que passou, na cor branca. Veja o código abaixo. Observe também que o SPI e os pinouts de outras funções podem variar de placa para placa, esses pinos funcionam para meu RP2040 Zero da Waveshare.

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>

// For the breakout board, you can use any 2 or 3 pins.
// These pins will also work for the 1.8" TFT shield.
#define TFT_CS        1
#define TFT_RST        8 // Or set to -1 and connect to Arduino RESET pin
#define TFT_DC         14


// OPTION 1 (recommended) is to use the HARDWARE SPI pins, which are unique
// to each board and not reassignable. For Arduino Uno: MOSI = pin 11 and
// SCLK = pin 13. This is the fastest mode of operation and is required if
// using the breakout board's microSD card.

// For 1.44" and 1.8" TFT with ST7735 use:
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);


void setup(void) {
  Serial.begin(9600);
  Serial.print(F("Hello! ST77xx TFT Test"));
  analogReadResolution(12);

  // Use this initializer if using a 1.8" TFT screen:
  tft.initR(INITR_BLACKTAB);      // Init ST7735S chip, black tab

  Serial.println(F("Initialized"));

  uint16_t time = millis();
  tft.fillScreen(ST77XX_BLACK);
  

  // large block of text
  tft.setTextSize(2);
  tft.fillScreen(ST77XX_BLACK);
  tft.setCursor(5, 30);
  tft.setTextColor(ST77XX_GREEN);
  tft.println("FritzenLab");
  delay(1000);
  tft.setCursor(5, 60);
   
}

void loop() {
  
  int temperature= analogRead(A0) * 3.3 / 4095 * 100; // Equation for LM35 to Celsius degrees
  tft.setTextSize(2);
  tft.setCursor(20, 60);
  tft.setTextColor(ST77XX_WHITE);
  //tft.println("     ");
  //tft.setTextColor(39321);
  tft.print(millis() / 1000);
  tft.setTextSize(1);
  tft.println(" seconds");
  tft.setCursor(20, 80);
  tft.print("LM35= ");
  tft.setTextSize(2);
  tft.print(temperature);
  tft.println(" oC");
  delay(5);
  testdrawrects(ST77XX_BLACK);
  delay(5);
}

void testdrawrects(uint16_t color) {
  
  tft.fillRect(5, 50, 100, 60, color);
  tft.drawRect(5, 50, 100, 60, color);
  
}

Esse código também está no meu Github usando este link. Observe a equação para obter a temperatura das leituras do LM35:

int temperature= analogRead(A0) * 3.3 / 4095 * 100; // Equation for LM35 to Celsius degrees

Primeiro, tenho que transformar os inteiros 0..4095 em volts, então faço “3,3 / 4095”. Então multiplico tudo por 100, já que esse é o número de passos do sensor de resolução de 10mV/ºC em um único volt (1 / 0,01).

Teste final

Fiz um vídeo mostrando todo o processo: o display, as conexões RP2040, LM35, SPI e o código no Arduino IDE. Espero que você goste e entenda. Por favor, use também meu link de afiliado Aliexpress para comprar este display ST7735.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *