Olá pessoal, bom dia!!!

 Será que alguem pode me ajudar com codigos para o TTgo?

Eu peguei um codigo na internet, de animação para o display, eu fiz uma case para o whatercooler do meu pc, um clone deste:

https://rog.asus.com/cooling/cpu-liquid-coolers/rog-ryujin/rog-ryuj...

Foi um longo caminho....primeiro fiz o meu Uno se transformar em um aparelho da corsair, para ser reconhecido pelo Icue, (controlador de leds arbg).

Foto:

Mas não dando por satisfeito, quero um display, igual/parecido com o original.

a animação carregada pelo tt-display já deu certo, mas queria ter um controle maior, como um delay ao terminar, e depois mostrar uma imagem estática por um tempo, talvez 30s, e depois comecar a animação novamente, mas sem conhecimento dos codigos, são muito complicados para mim, preciso de ajuda.

no momento está assim:

https://youtu.be/xlhtWA9iB9g

Sobre a animação, eu queria ajuda no codigo para controlar individualmente (quanto tempo dura cada uma, talvez um controle de delay individual), cada frame, (são até agora 111), e no final, mostrasse uma imagem estática por 30s, e depois outra de 30s, e a animação comecaria novamente.

e nestas imagens estáticas, fosse posicionado na tela do ttgo um texto, e a temperatura do sensor ligado a ele, (uma temp do procesador e outra do liquido do whater cooler), isso é possivel?

Obrigado de antemão.

Exibições: 706

Responder esta

Respostas a este tópico

#include "SPIFFS.h"
#include <TJpg_Decoder.h>
#include "SPI.h"
#include <TFT_eSPI.h> // Hardware-specific library


TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
int imgNum = 0;

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

// Initialise SPIFFS
if (!SPIFFS.begin()) {
Serial.println("SPIFFS initialisation failed!");
while (1) yield(); // Stay here twiddling thumbs waiting
}
Serial.println("\r\nInitialisation done.");
listSPIFFS();

tft.begin();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);

TJpgDec.setJpgScale(1);
TJpgDec.setSwapBytes(true);
TJpgDec.setCallback(tft_output);
}

void loop() {
if(imgNum >111) imgNum = 0;
String imgPath = "/image_";
imgPath += imgNum++;
imgPath +=".jpg";

TJpgDec.drawFsJpg(0, 0, imgPath);
}

void listSPIFFS(void) {
Serial.println(F("\r\nListing SPIFFS files:"));
static const char line[] PROGMEM = "=================================================";

Serial.println(FPSTR(line));
Serial.println(F(" File name Size"));
Serial.println(FPSTR(line));

fs::File root = SPIFFS.open("/");
if (!root) {
Serial.println(F("Failed to open directory"));
return;
}
if (!root.isDirectory()) {
Serial.println(F("Not a directory"));
return;
}

fs::File file = root.openNextFile();
while (file) {

if (file.isDirectory()) {
Serial.print("DIR : ");
String fileName = file.name();
Serial.print(fileName);
} else {
String fileName = file.name();
Serial.print(" " + fileName);
// File path can be 31 characters maximum in SPIFFS
int spaces = 33 - fileName.length(); // Tabulate nicely
if (spaces < 1) spaces = 1;
while (spaces--) Serial.print(" ");
String fileSize = (String) file.size();
spaces = 10 - fileSize.length(); // Tabulate nicely
if (spaces < 1) spaces = 1;
while (spaces--) Serial.print(" ");
Serial.println(fileSize + " bytes");
}

file = root.openNextFile();
}

Serial.println(FPSTR(line));
Serial.println();
delay(10000);
}

bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t* bitmap)
{
// Stop further decoding as image is running off bottom of screen
if ( y >= tft.height() ) return 0;

// This function will clip the image block rendering automatically at the TFT boundaries
tft.pushImage(x, y, w, h, bitmap);

// Return 1 to decode next block
return 1;
}

Olá Leonardo,

Sim, é possível tudo que você quer. O sketch que você mostrou usa estas bibliotecas do Arduino:

TFT_eSPI   ==> usada para desenhar, manipular e controlar no LCD TFT.

TJpg_Decoder  ==> usada para decodificar imagens no formato JPG

SPIFFS  ==> usado para ler arqruivos gravados na FLASH do ESP32, possivelmente com a sequencia de imagens JPG que são os 111 frames do vídeo

SPI ==> interface elétrica do ESP32 com o LCD TFT

Para escrever Temperatura, Voltagem, mensagens etc no LCD, basta usar a biblioteca TFT_eSPI.

Para desenhar os quadros do vídeo, é a TJpg_Decoder, como exatamente usado no sketch.

Para alternar entre vídeo, imagens ou telas com texto deve-se usar o conceito de programação baseado em máquina de estados. Essa máquina é na prática uma variável que guarda o estado e uma lógica que muda de um estado para outro.

Ou seja, por exemplo, temos dois estados: mostrando o vídeo (estado A) OU mostrando o texto (estado B).

Cada um ocorre após o outro infinitamente.

A lógica/condição da mudança do estado A para o B será: 30 segundos após o fim do vídeo

A lógica/condição da mudança do estado B para o A será: após 20 segundos após desenhar o texto

Seria algo como:

void executa_video(){

   if (imgNum > 111) {

     delay (30 * 1000);          // espera 30 segundos com a imagem do ultimo frame do video na tela

     imgNum = 0;                 //  imgNum é o número do Frame da sequencia do mini vídeo

     estado  = 1;                  //  muda o estado para mostrar o texto

     return;

   }

   // no mais desenha frame a frame o video
   String imgPath = "/image_";
   imgPath += imgNum++;
   imgPath += ".jpg";

  TJpgDec.drawFsJpg(0, 0, imgPath);           //  aqui desenha o frame número <imgNum> no display...

}

void executa_texto(){

   tft.fillScreen(TFT_GREY);                     //  apaga a tela com a cor cinza

   tft.println("==> OLA MUNDO! <==");   // escreve algo na tela

   delay(20 * 1000);                              // espera 20 segundos com o texto parado na tela

   estado = 0;                                       // alterna para o estado 0 --> video

}

// A solução está no loop()....  ele controlará os estados da máquina e fará o correspondente a cada estado

int estado = 0;      // 0 para video e 1 para texto - variável global

void loop() {

  switch  (estado) {

    case 0:

      executa_video();

      break;

    case 1:

      executa_texto();

      break;

  }

}

Nossa, tenho q ler muito isso para entender, pelo q vi voce conhece muito da linguagem, muito obrigado pela ajuda, isso e muito novo para mim, tenho medo de nao conseguir fazer, rsrs, vou testar e dou um feedback para vc

Nao sei como te agradescer Rodrigo, juntei os codigos e ficou assim, fiz upload e deu certo!!!

queria te pedir o código para que faça isso: (para te falar a verdade, estou sem graça de pedir a você para fazê-lo para mim, se quizer, espero que não se sinta ofendido, eu pago a você pelo trabalho, pois adimiro muito o dom de saber progrmação, vou deixar o meu telefone em mensagem para você.)

*********************

1) notei uma coisa, cada vez que o texto "ola mundo" aparece, ele desce uma linha na tela, até desaparecer.

2) queria que o texto, tenha uma imagem de fundo, ou apareça em cima da ultima imagem carregada.

3) como fazer com o sensor? preciso adicionar 2 (um para o processador, outro para o liquid cooler).

Aqui está a "situação" atual do sketch.

#include "SPIFFS.h"
#include <TJpg_Decoder.h>
#include "SPI.h"
#include <TFT_eSPI.h> // Hardware-specific library


TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
int imgNum = 0;
int TFT_GREY;
int estado = 0;

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

// Initialise SPIFFS
if (!SPIFFS.begin()) {
Serial.println("SPIFFS initialisation failed!");
while (1) yield(); // Stay here twiddling thumbs waiting
}

Serial.println("\r\nInitialisation done.");
listSPIFFS();

tft.begin();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);

TJpgDec.setJpgScale(1);
TJpgDec.setSwapBytes(true);
TJpgDec.setCallback(tft_output);
}

////////////////////////////////////////////

void executa_video(){

if (imgNum > 111) {delay (20 * 1000); // espera 20 segundos com a imagem do ultimo frame do video na tela
imgNum = 0; // imgNum é o número do Frame da sequencia do mini vídeo
estado = 1; // muda o estado para mostrar o texto
return;
}

// no mais desenha frame a frame o video
String imgPath = "/image_";
imgPath += imgNum++;
imgPath += ".jpg";

TJpgDec.drawFsJpg(0, 0, imgPath); // aqui desenha o frame número <imgNum> no display...

}

void executa_texto(){

tft.fillScreen(TFT_GREY); // apaga a tela com a cor cinza
tft.println("==> OLA MUNDO! <=="); // escreve algo na tela
delay(20 * 1000); // espera 20 segundos com o texto parado na tela
estado = 0; // alterna para o estado 0 --> video
}

// A solução está no loop().... ele controlará os estados da máquina e fará o correspondente a cada estado

// 0 para video e 1 para texto - variável global
void loop() {
switch (estado) {
case 0:
executa_video();
break;
case 1:
executa_texto();
break;
}

}

void listSPIFFS(void) {
Serial.println(F("\r\nListing SPIFFS files:"));
static const char line[] PROGMEM = "=================================================";

Serial.println(FPSTR(line));
Serial.println(F(" File name Size"));
Serial.println(FPSTR(line));

fs::File root = SPIFFS.open("/");
if (!root) {
Serial.println(F("Failed to open directory"));
return;
}

if (!root.isDirectory()) {
Serial.println(F("Not a directory"));
return;
}

Serial.println(FPSTR(line));
Serial.println();
delay(10000);
}

bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t* bitmap)
{
// Stop further decoding as image is running off bottom of screen
if ( y >= tft.height() ) return 0;

// This function will clip the image block rendering automatically at the TFT boundaries
tft.pushImage(x, y, w, h, bitmap);

// Return 1 to decode next block
return 1;
}

O texto vai baixando por causa do println();

Tem que usar funções gráficas para desenhar imagens e texto ao mesmo tempo.

Pessoal, ainda estou precisando de ajuda, eu aprendi a colocar os textos que eu quero no lugar, agora estou na parte do sensor, estou usando dois termistores TTC 103, para mmonitorar e mostrar na tela do ttgo display montei o circuito, resistor de 10k, na porta 32 e 33 do ttgo display, usei o exemplo "basicntc" para funcionar, quando testo em saida no monitor serial, tudo funciona, mas quando coloco a exibição no ttgo, não aparece, alguem pode me ajudar?

Eu tinha dito que pagaria por uma ajuda, mas o Rodrigo Corbera, cobrou 300,00 para me ajudar com o sketch, tudo bem, cada um cobra o que quer pelo seu conhecimento, mas não achei o preço justo para me "ajudar", pois o código já está 90% pronto, como podem ver acima, não acho que daria para alguem com conhecimento mais de 20m de leitura na minha duvida em achar o que estou fazendo de errado, e mesmo porque estou fazendo isso por hobie, e quando tiver pronto, deixarei tudo aqui no site para quem quizer fazer o mesmo, então...se alguem puder ajudar um novato no ttgo eu agradeço!!!   :)

Só para fechar este tópico, eu terminei o projeto, sozinho, demorou mas acho que ficou legal e funcional, temperaturas conferidas com termometro digital, perfeito!!

Link youtube: 

https://youtu.be/X3BnSwbFDCI

Fotos:

Parabéns Leonardo!

Ficou ótimo e muito bonito!

Caso tenha interesse em compartilhar seu projeto, como disse, sugiro criar um GitHub com fotos, código, vídeos, esquemas, STLs e tudo mais que queira deixar público.

Obrigado Rodrigo, por ter me falado que o que eu queria era possível, e ter me dado a dica do "loop" vou fazer isso.

Sim, fico feliz que tenha chegado ao resultado desejado!

O uso de estados dentro de um programa é extremamente útil e pode ser usado em diversos casos.
Sempre se deve pensar nos vários estados e nas regras de suas transições primeiro. Assim codificar essas condições é muito mais fácil de dar manutenção e de executar.
Abraços.

Resultado desejado mais ou menos, rsrsrs, não consegui carregar imagens personalizadas para as duas telas de temperatura, só consegui adicionando mais uma imagem (a ultima da sequencia), que você me ensinou a ter um delay, com o desenho do sensor..mas tudo bem.

Mais uma vez, obrigado mesmo pelas dicas.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço