Não consigo mostrar data e hora no display LCD 2,4 TFT com RTC DS3231! AJUDA

Olá,
Eu estou a usar um display LCD 2,4 TFT touchscreen como este https://www.electrofun.pt/display-lcd-touchscreen-shield-arduino encaixado num arduino Mega e quero mostrar a hora e a data nesse ecra touch usando o RTC DS3231 https://www.electrofun.pt/modulo-rtc-ds3231-relogio.

Eu conectei devidamente o RTC à placa, o SDA no pino 20, SCL no pino 21 e os respetivos pinos de alimentação.

Fiz a programação para que mostrasse a hora e a data no ecra touch, compilei e não deu erros, mas quando enviei para o arduino, o ecrã fica branco e não aparece nada, inclusive não parece a programação que não diz respeito às variaveis para mostrar a data e a hora. Apenas aparece se, por as variaveis em comentario e a parte da programação para mostrar o valor dessas variaveis.

Podem-me ajudar, já experimentei de tudo e não consegui…

Abaixo está a minha programação.

---------programação-----------

#include <Wire.h>
#include <DS3231.h>
#include <Adafruit_GFX.h>
#include <MCUFRIEND_kbv.h>
#include “TouchScreen.h”

DS3231 rtc(SDA,SCL);//iniciar DS3231 criando o objeto rct
int hora = rtc.getTime().hour;
int minuto = rtc.getTime().min;
float temperatura = rtc.getTemp();
int dia = rtc.getTime().date;
int mes = rtc.getTime().mon;
int ano = rtc.getTime().year;

//----------configurar biblioteca TouchScreen-----
#define YP A1
#define XM A2
#define YM 7
#define XP 6
//Coordenadas do display
#define TS_MINX 112
#define TS_MINY 103
#define TS_MAXX 972
#define TS_MAXY 961
//Definir a pressão do touch minima e maxima
#define MINPRESSURE 10
#define MAXPRESSURE 1000
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);//(300)sensibilidade

//------Cores a utilizar-----
#define PRETO 0x0000
#define AZUL 0x001F
#define VERMELHO 0xF800
#define VERDE 0x07E0
#define CIANO 0x07FF
#define AMARELO 0xFFE0
#define BRANCO 0xFFFF
#define CINZENTO 0x7BEF
#define LARANJA 0xFD20
#define CINZENTO_C 0xC618

//-----Criação de objeto de comunicação com o display----
MCUFRIEND_kbv tft;//este passo serve para que este objeto fique encarregue de mandar para o display LCD toda a informação do código

void setup()
{
Serial.begin(9600);
uint16_t ID = tft.readID();//leitura do controlador do display
tft.begin(ID); // Inicialização da tela
rtc.begin();//iniciar o objeto criado anteriormente
Wire.begin();
}
void loop() {
tft.setRotation(1); //Rotação do display para horizontal
tft.fillScreen(PRETO);//fundo a preto
tft.setCursor(5,15);
tft.setTextColor(BRANCO);
tft.setTextSize(1);
tft.print("HORA: ");
tft.setCursor(12,15);
tft.setTextColor(BRANCO);
tft.setTextSize(1);
tft.print(hora);
tft.print(’.’);
tft.print(minuto);
tft.setCursor(170,20);
tft.setTextSize(1);
tft.setTextColor(BRANCO);
tft.print("TEMP.: ");
tft.setTextSize(1);
tft.setTextColor(BRANCO);
tft.print(temperatura);
tft.setCursor(291,16);
tft.print(‘o’);
tft.setCursor(300,20);
tft.print(“C”);
tft.drawLine(0,60,320,60,LARANJA);
tft.setCursor(5,50);
tft.setTextColor(BRANCO);
tft.setTextSize(1);
tft.print("DATA: ");
tft.setCursor(20,55);
tft.setTextSize(2);
tft.setTextColor(BRANCO);
tft.print(dia);
tft.print(’.’);
tft.print(mes);
tft.print(’.’);
tft.print(ano);
}

Já experimentaste as diferentes funções para entender o que pode estar a acontecer? Antes de tentares enviar tudo isso, experimenta algo simples e segue por aí.

Já provaste que o RTC está a funcionar?

O RTC está a funcionar, pois testei-o enviando informações para o monitor de serie.
Como assim, experimentar as diferentes funções?

Já testaste o LCD por si mesmo sem mais nada ligado?

Já experimentei mostrar quadrados, retangulos e mostrar mensagens e funciona perfeitamente, eu é que queria por a mostrar a hora e a data e, é apenas isso que não estou a conseguir mostrar.

Tens um problema, nunca defines as variáveis de hora e minutos...

Isto:

int hora = rtc.getTime().hour;
int minuto = rtc.getTime().min;
float temperatura = rtc.getTemp();
int dia = rtc.getTime().date;
int mes = rtc.getTime().mon;
int ano = rtc.getTime().year;

Está no sítio errado.

Devias colocar isto aqui:

void loop() {
int hora = rtc.getTime().hour;
int minuto = rtc.getTime().min;
float temperatura = rtc.getTemp();
int dia = rtc.getTime().date;
int mes = rtc.getTime().mon;
int ano = rtc.getTime().year;

Muito obrigado, já consigo mostrar a hora e a data, só que não consigo mostrar a hora a contar, isto é, passar os minutos e as horas, conforme envio para o ecrã a hora e a data que está, assim permanece na mesma(ficheiro apenas com a mostragem das horas e data- teste_RTC.ino)
Envio também a programação completa que fiz, pode ser que entendas melhor o que quero mostrar no ecrã- meu_ecra.ino).
Fiz uns testes com os exemplos da biblioteca que estou a DS3231, e com este exemplo já vai mudando a hora e o minuto(ficheiro exempli-teste.ino).

meu_ecra.ino (16.6 KB)

exempli-teste.ino (1.71 KB)

teste_RTC.ino (3.63 KB)

O site que colocaste no primeiro post tem exactamente como resolver o teu problema... de onde copiaste esse código que tens agora?

Já viste isto?

  second=Clock.getSecond(); //Guarda os segundos
  minute=Clock.getMinute(); //Guarda os minutos
  hour=Clock.getHour(h12, PM); //Guarda as horas
  date=Clock.getDate(); //Guarda o dia do mês
  month=Clock.getMonth(Century); //Guarda o mês
  year=Clock.getYear(); // Guarda o ano
  day=Clock.getDoW(); //Guarda o dia da semana (ele guarda o valor de cima)

Tendo em conta o numero de bibliotecas para o DS3231, tens de dizer de onde fizeste download da tua para poder dizer algo mais.

Eu inicialmente, tentei com a programação do site, mas dá-me um erro, então recorri aos exemplos da biblioteca DS3231, e apartir daí adaptei para mostrar no ecrã. Aparece valores só que não conta as horas e os minutos, apenas é esse o meu problema.
Se fiz um teste, e com esse teste consigo mostrar as horas a contar.

#include <DS3231.h>
#include <MCUFRIEND_kbv.h>
// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);
MCUFRIEND_kbv tft;
// Init a Time-data structure
Time  t;
#define PRETO    0x0000
void setup()
{
  // Setup Serial connection
  Serial.begin(115200);
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {} 
uint16_t ID = tft.readID();//leitura do controlador do display
  tft.begin(ID);
  // Initialize the rtc object
  rtc.begin();
  
  // The following lines can be uncommented to set the date and time
  rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAY
  rtc.setTime(10, 19, 5);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(9, 5, 2018);   // Set the date to January 1st, 2014
}

void loop()
{
  // Get data from the DS3231
  t = rtc.getTime();
  tft.fillScreen(PRETO);
  tft.setRotation(1);
  tft.setTextSize(2);
  // Send date over serial connection
  tft.setCursor(120,70);
  tft.print(t.date, DEC);
  //tft.print(". day of ");
  tft.print(rtc.getMonthStr());
  //tft.print(" in the year ");
  tft.print(t.year, DEC);
  tft.println(".");
  tft.setCursor(120,160);
  delay(10000);
  // Send Day-of-Week and time
  //tft.print("It is the ");
  tft.print(t.dow, DEC);
  tft.print('.');
  //tft.print(". day of the week (counting monday as the 1th), and it has passed ");
  tft.print(t.hour, DEC);
  tft.print('.');
  //tft.print(" hour(s), ");
  tft.print(t.min, DEC);
  tft.print('.');
  //tft.print(" minute(s) and ");
  tft.print(t.sec, DEC);
  //tft.println(" second(s) since midnight.");

  // Send a divider for readability
  //Serial.println("  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -");
  
  // Wait one second before repeating :)
  delay (1000);
}

Envio a restante resposta asseguir.

Mas para a minha programação principal, tenho mais coisas a mostrar no ecrã e no exemplo acima o ecrã está sempre a piscar devido ao delay no fim, e se eu colocar na programação principal o ecrã fica a piscar,e não iria ficar bem.
Eu já tentei criar um ciclo(está a partir da linha 210), por isso é que estou perguntar se tens alguma sugestão para fazer contar os minutos e as horas sem que ter que fazer piscar sempre o ecrã.
Mando abaixo a programação principal.

#include <DS3231.h>//biblioteca para o RCT
#include "TouchScreen.h"//biblioteca para touch
#include <Adafruit_GFX.h> // Biblioteca Gráfica Adafruit
#include <MCUFRIEND_kbv.h> // Bibllioteca para controle do lcd 
#include <Fonts/FreeMonoBold9pt7b.h>
#include <Fonts/FreeSerifBold9pt7b.h>
#include <Fonts/FreeSerifBoldItalic9pt7b.h>
#include <Fonts/FreeSansBold9pt7b.h>

DS3231 rtc(SDA,SCL);//iniciar DS3231 criando o objeto rct
Time t;
#define YP A1  
#define XM A2  
#define YM 7   
#define XP 6  
#define TS_MINX 112
#define TS_MINY 103
#define TS_MAXX 972
#define TS_MAXY 961
#define MINPRESSURE 10
#define MAXPRESSURE 1000
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

#define PRETO    0x0000
#define AZUL     0x001F
#define VERMELHO 0xF800
#define VERDE    0x07E0
#define CIANO    0x07FF
#define AMARELO  0xFFE0
#define BRANCO   0xFFFF
#define CINZENTO 0x7BEF
#define LARANJA  0xFD20
#define CINZENTO_C 0xC618

MCUFRIEND_kbv tft;

void setup() 
{
  uint16_t ID = tft.readID();
  tft.begin(ID);
  rtc.begin();

  //rtc.setDOW(WEDNESDAY);  // Set Day-of-Week to SUNDAY
  //rtc.setTime(10, 19, 5); // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(9, 5, 2018);// Set the date to January 1st, 2014
}
void pag_inicial()
{ 
  tft.setRotation(1); 
  tft.fillScreen(PRETO);//fundo a preto
  tft.fillRect(15,80,290,80,VERMELHO);
  tft.drawRect(15,80,290,80,BRANCO);
  tft.setCursor(106,90);
  tft.setFont(&FreeMonoBold9pt7b);
  tft.setTextColor(BRANCO);
  tft.setTextSize(1);
  tft.print("CASO SEJE\n");
  tft.setCursor(30,127);
  tft.setTextColor(BRANCO);
  tft.setTextSize(2);
  tft.print("SURDO / MUDO\n");
  tft.setCursor(94,150);
  tft.setTextColor(BRANCO);
  tft.setTextSize(1);
  tft.print("CLIQUE AQUI!");
  tft.drawLine(0,180,320,180,LARANJA);
  tft.setFont(&FreeSerifBoldItalic9pt7b);
  tft.setCursor(47,205);
  tft.setTextSize(1);
  tft.setTextColor(BRANCO);
  tft.print("ELEVADOR INTELIGENTE");
  tft.setCursor(30,225);
  tft.setTextSize(1);
  tft.setTextColor(BRANCO);
  tft.print("AQUELE QUE SE ADAPTA A SI!");
}
TSPoint waitTouch() 
{
  TSPoint p;
  do {
    p = ts.getPoint(); 
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
  } while((p.z < MINPRESSURE )|| (p.z > MAXPRESSURE));
  p.x = map(p.x, TS_MINX, TS_MAXX, 0, 240);
  p.y = map(p.y, TS_MINY, TS_MAXY, 0, 320);
  return p;
 }
void botoes_pisos()
{
  tft.fillRect(20,40,270,50,CINZENTO_C);
    tft.setFont(&FreeSerifBold9pt7b);
    tft.setCursor(102,68);
    tft.setTextColor(AZUL);
    tft.setTextSize(2);
    tft.print("PISO 0");
    tft.setCursor(90,84);
    tft.setTextSize(1);
    tft.setTextColor(AZUL);
    tft.print("Sala de jogos/Bar");
    tft.fillRect(20,100,270,50,CINZENTO_C);
    tft.setCursor(102,128);
    tft.setTextColor(AZUL);
    tft.setTextSize(2);
    tft.print("PISO 1");
    tft.setCursor(102,144);
    tft.setTextSize(1);
    tft.setTextColor(AZUL);
    tft.print("Quar.101-115");
    tft.fillRect(20,160,270,50,CINZENTO_C);
    tft.setCursor(102,186);
    tft.setTextColor(AZUL);
    tft.setTextSize(2);
    tft.print("PISO 2");
    tft.setCursor(102,206);
    tft.setTextSize(1);
    tft.setTextColor(AZUL);
    tft.print("Quar.201-215");
}
void mostrar_minuto()
{
 if(t.min<10)
  {
    do
    {
    tft.setCursor(90,15); 
    tft.print(".0");
    tft.print(t.min,DEC);
    delay(1000);
    }while(t.min<10);
  }
  else
  {
    do
    {
    tft.setCursor(90,15);
    tft.print(t.min,DEC);
    delay(1000);
    }while(t.min<10);
  } 
}
void loop() 
{ 
  tft.fillScreen(PRETO);
  pag_inicial();
  tft.setFont();
  t = rtc.getTime();
  tft.setCursor(5,15);
  tft.setTextSize(2);
  tft.print("HORA: ");
  tft.setCursor(65,20);
  tft.setTextSize(2);
  tft.print(t.hour,DEC);
  mostrar_minuto();
  tft.setCursor(170,20);
  tft.setTextSize(2);
  tft.print("TEMP.: ");
  tft.setCursor(230,20);
  tft.setTextSize(2);
  //tft.print(temperatura);
  tft.setCursor(291,16);
  tft.print('o');  
  tft.setCursor(300,20);
  tft.print("C");
  tft.drawLine(0,60,320,60,LARANJA);
  tft.setCursor(5,50);
  tft.setTextSize(2);
  tft.print("DATA: ");
  tft.setCursor(60,30);
  tft.setTextSize(2);
  tft.print(t.date,DEC);
  tft.print('.');
  tft.print(rtc.getMonthStr());
  tft.print('.');
  tft.print(t.year,DEC);
  TSPoint p = waitTouch();
  if((p.x>20) && (p.x<=300) && (p.y>110) && (p.y<=190))
  {
    tft.fillScreen(PRETO);
    tft.setFont(&FreeSerifBold9pt7b);
    tft.setCursor(5,20);
    tft.setTextColor(BRANCO);
    tft.setTextSize(1);
    tft.print("HORA: ");
    tft.setCursor(170,20);
    tft.setTextSize(1);
    tft.setTextColor(BRANCO);
    tft.print("TEMP.:");
    tft.setCursor(291,16);
    tft.print('o');  
    tft.setCursor(300,20);
    tft.print("C");
    tft.setFont(&FreeSansBold9pt7b);
    tft.drawLine(0,40,320,40,LARANJA);
    tft.setCursor(60,120);
    tft.setTextColor(VERMELHO);
    tft.setTextSize(2);
    tft.print("Qual o piso\n");
    tft.setCursor(40,160);
    tft.setTextColor(VERMELHO);
    tft.setTextSize(2);
    tft.print("Que deseja ir?");
    delay(5000);
    tft.fillScreen(PRETO);
    tft.setFont(&FreeSerifBold9pt7b);
    tft.setCursor(5,20);
    tft.setTextColor(BRANCO);
    tft.setTextSize(1);
    tft.print("HORA: ");
    tft.setCursor(170,20);
    tft.setTextSize(1);
    tft.setTextColor(BRANCO);
    tft.print("TEMP.:");
    tft.setCursor(291,16);
    tft.print('o');  
    tft.setCursor(300,20);
    tft.print("C");
    tft.drawLine(0,30,320,30,LARANJA);
    botoes_pisos();
    TSPoint p = waitTouch();
    if((p.x>20) && (p.x<=290) && (p.y>40) && (p.y<=110))
    {
      if(piso_elevador==microswitch0)
      {
        tft.fillScreen(PRETO);
        tft.setFont(&FreeSansBold9pt7b);
        tft.setCursor(60,120);
        tft.setTextColor(VERMELHO);
        tft.setTextSize(2);
        tft.print("Encontra-se\n");
        tft.setCursor(70,160);
        tft.setTextColor(VERMELHO);
        tft.setTextSize(2);
        tft.print("Nesse piso!");
        delay(4000);
        botoes_pisos();
      }
      else
      {
        if(piso_elevador!=microswitch0)
        {
          do
          { 
            Stepper_elevador.step(-512);
            tft.fillScreen(PRETO);
            tft.setFont(&FreeMonoBold9pt7b);
            tft.setCursor(30,50);
            tft.setTextSize(2);
            tft.setTextColor(VERDE);
            tft.print("DESCENDO PARA\n   o PISO 0");
          }while(microswitch0!=1);
          tft.fillScreen(PRETO);
          tft.setFont(&FreeMonoBold9pt7b);
          tft.setCursor(30,60);
          tft.setTextSize(2);
          tft.setTextColor(VERDE);
          tft.print("CHEGOU AO \n   o PISO 0");
          delay(1000);
          Stepper_porta.step(-512);
          tft.fillScreen(PRETO);
          tft.setFont(&FreeMonoBold9pt7b);
          tft.setCursor(30,60);
          tft.setTextSize(2);
          tft.setTextColor(VERDE);
          tft.print("PORTA ABERTA");  
        }
      }
      tft.fillScreen(PRETO);
      tft.setFont(&FreeMonoBold9pt7b);
      tft.setCursor(30,50);
      tft.setTextSize(2);
      tft.setTextColor(VERDE);
      tft.print("SUBINDO PARA\n   o PISO 1");
      delay(5000);
      }
    }
}

Tens de chamar a instrução em baixo durante a tua função loop():

t = rtc.getTime();

Quanto ao piscar, diz-me quando abres o fórum vês numeros nas linhas de código?? Esperas que eu esteja a copiar o código para algum sítio onde tenha as linhas numeradas? Porque não meteres o excerto de código onde o LCD pisca?

A parte que se chegue abaixo faz o display piscar, e ele pisca devido ao último delay, ao fazer o delay atualiza a cada segundo os minutos, só que ao atualizar os minutos faz piscar o ecrã e faz aparecer e desaparecer tudo, mas eu queria que apenas os minutos piscassem, que era para atualizar.

void loop()
{
  t = rtc.getTime();
  tft.fillScreen(PRETO);
  tft.setRotation(1);
  tft.setTextSize(2);
  tft.setCursor(120,70);
  tft.print(t.date, DEC);
  tft.print(rtc.getMonthStr());
  tft.print(t.year, DEC);
  tft.println(".");
  tft.setCursor(120,160);
  delay(10000);
  tft.print(t.dow, DEC);
  tft.print('.');
  tft.print(t.hour, DEC);
  tft.print('.');
  tft.print(t.min, DEC);
  tft.print('.');
  tft.print(t.sec, DEC);
  delay (1000);
}

Esse codigo acima é um exemplo que funciona, não a minha programação final, porque como tinha dito na minha programação as horas não atualizam, e o meu problema é esse, eu queira mostrar as horas, mas que estejam a atualizar a cada segundo, sem a necessidade de mexer nas restantes informações que estão a ser mostradas no display.

Mais uma vez, de onde é que fizeste download da biblioteca DS3231.h?

Deste site DS3231 - Rinky-Dink Electronics, mas estás a entender o que eu quero dizer?

No código que tens, tens de chamar a função que actualiza os dados da hora. Isso é bastante claro no exemplo que colocaste. Daí não entender onde é a dificuldade.

Coloca aqui o código que tens com os dados que queres mostrar.

Não sei se quanto te referes aos dados se são as horas e a data ou se é os dados para o ecrã touch. Por isso envio a minha programação completa.
O envio da data e da hora começa no void loop()

meu_ecra.ino (15.1 KB)

Com este exemplo a hora não faz update automático?

Já pensaste que o facto de teres loops while e delays de segundos está a causar problemas na execução do código?

Então queres dizer que não vou conseguir fazer atualizar as horas, devido aos do...while() e aos delays? Eu preciso desses do...while() e delays, não dá de outra forma? É que já tentei com os conhecimentos que tenho sobre a programação Arduíno.