TTGO smartwatch – mais implementações

O TTGO smartwatch traz algumas vantagens sobre outras placas maker. Primeiramente em relação a custos, um display touch 240×240 com RTC, bateria, ESP32, case e cabo de conexão sairiam a um custo superior do que o produto final, com case e pronto para uso. Outra vantagem é a simplicidade de programação, já que temos tudo pronto para simplesmente criar. É a oportunidade perfeita de oferecer um produto final para monitoramento de variáveis de ambiente com um ótimo acabamento!

Se não leu o artigo anterior, eis o link. Nesse artigo veremos um pouco mais a respeito das configurações desse dispositivo.

Bibliotecas para o TTGO smartwatch

A LilyGo já oferece uma biblioteca completa, citada no artigo anterior. Mas no meu caso, fiz todas as configurações independentes e estou apenas focando em um funcionamento completo inicial antes de seguir com casos de uso.

TFT_eSPI

Essa biblioteca é incluída por padrão, se utilizar a biblioteca própria desenvolvida pela LilyGo. A abstração será muito maior, mas se seguir pelo mesmo caminho que eu, deverá fazer uma modificação no arquivo User_setup.h, que está dentro do diretório da biblioteca. Essa modificação é exclusivamente relacionada aos pinos de GPIO utilizados pelo display. Deve ficar dessa maneira:

#define TFT_MISO  -1
#define TFT_MOSI  19
#define TFT_SCLK  18
#define TFT_CS    5  // Chip select control pin
#define TFT_DC    27  // Data Command control pin
#define TFT_RST   -1  // Reset pin (could connect to RST pin)
#define TFT_BL    12  // LED back-light (only for ST7789 with backlight control pin)

Em relação ao texto, uma fonte deve ser incluída. A maneira mais simples é utilizando o include Free_Fonts.h, passando o caminho absoluto do arquivo. No meu caso:

#include "/home/djames/.platformio/lib/TFT_eSPI_ID1559/examples/320 x 240/Free_Font_Demo/Free_Fonts.h"

Referente ao bitmap carregado, utilize o programa lcd-image-converter e salvar o array em um arquivo a ser incluído, como por exemplo, bitmap.h.

const uint16_t mercy [] PROGMEM = {aqui dentro}

E então inclua-o no sketch principal.

Touch screen

O chipset do touch screen é o FT5206, cuja biblioteca deve ser clonada para dentro do diretório de bibliotecas do Arduino.

No sketch, devemos incluir a biblioteca FT5206.h e definir os pinos relacionados ao touch:

#include 

#define TP_SDA 23
#define TP_SCL 32
#define TP_INT 38

Devemos então instanciar o display e o touch screen, que são dispositivos independentes (tenha isso em mente):

TFT_eSPI tft = TFT_eSPI(); 
FT5206 cts = FT5206(TP_INT);

Mas onde estão os pinos relacionados ao i2c, hum? Bem, eles estão na própria biblioteca. Eu editei e passei hardcoded os pinos SDA e SCL, mas o certo é fazer um overload ou um método extra para passar os pinos. Fiz dessa maneira para agilizar o processo. Edite o arquivo FT5206.cpp e deixe essa parte assim:

void FT5206::begin(enum FT5206isr init) 
{
    _isrMode = init;
    Wire.begin(23,32,400000UL);

Apenas para testes (no próximo artigo começo a implementar threads), marquei visualmente o toque na tela. Não estou pegando a posição, apenas o evento. Com esse evento, trocarei de tela ou função, como veremos em artigos posteriores. O sketch final para esse artigo ficou desse modo:

#include 
#include 
#include 
#include 
#include "bitmap.h" //(Bitmap generated with LCD Image Converter) https://sourceforge.net/projects/lcd-image-converter/
#include "/home/djames/.platformio/lib/TFT_eSPI_ID1559/examples/320 x 240/Free_Font_Demo/Free_Fonts.h"
#include "time.h"
#include 

#define TP_SDA 23
#define TP_SCL 32
#define TP_INT 38

const char* ntpServer          = "pool.ntp.org";
const long  gmtOffset_sec      = 0;
const int   daylightOffset_sec = -3600*3;

const char* ssid               = "SuhankoFamily";
const char* password           = "fsjmr112";

TFT_eSPI tft = TFT_eSPI(); 
FT5206 cts = FT5206(TP_INT);



void printLocalTime()
{
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }
  char myTimeIs[64];
  memset(myTimeIs,0,sizeof(myTimeIs));
  timeinfo.tm_hour = timeinfo.tm_hour - 3;
  strftime(myTimeIs, 64, "  %H:%M:%S", &timeinfo);

  int xpos =  00;
  int ypos =  80;

  tft.setTextColor(TFT_DARKCYAN);
  tft.setCursor(xpos, ypos); 

  tft.pushImage(0,0,240,240,mercy);

  tft.setFreeFont(FSS24);       // Select Free Serif 12 point font
  tft.println();                // Move cursor down a line
  tft.print(myTimeIs); 
}

void setup(void) {
  Serial.begin(9600);

  vTaskDelay(pdMS_TO_TICKS(5000));
  cts.begin();

  WiFi.begin(ssid, password);

  while (WiFi.waitForConnectResult() != WL_CONNECTED){
    Serial.print(".");
  }
  Serial.println();

  Serial.println(WiFi.localIP());

  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

  tft.begin(); 
  tft.setSwapBytes(true);

  tft.fillScreen(TFT_BLACK);
  tft.pushImage(0,0,240,240,mercy);
}

void loop() {
  printLocalTime();
  if (cts.touched()){
    // Mark touches on screen
    tft.fillCircle(120, 120, 30, TFT_BLACK);
    tft.fillCircle(120, 120, 40, TFT_DARKCYAN);
  }
  vTaskDelay(pdMS_TO_TICKS(1000));
}

E por enquanto é isso.

Vídeo

Assim que disponível, você o encontrará em nosso canal DobitaobyteBrasil no Youtube. Se não é inscrito ainda, inscreva-se e clique no sininho para receber notificações.

Onde comprar

Como ainda não temos no Brasil algum representante, a aquisição deverá ser feita por importação. Um dos links para compra é esse. Se desejar ver as variações para esse dispositivo, o site da LilyGo é esse.

Partiu próximo artigo!