Go Down

Topic: Não consigo mostrar data e hora no display LCD 2,4 TFT com RTC DS3231! AJUDA (Read 875 times) previous topic - next topic

penguim

Deste site http://www.rinkydinkelectronics.com/library.php?id=73, mas estás a entender o que eu quero dizer?

bubulindo

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.
This... is a hobby.

penguim

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()

bubulindo

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?

This... is a hobby.

penguim

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.

bubulindo

O problema é que sempre que entras num delay de 4 ou 3 segundos, o programa não corre... e como tal não actualiza os dados do ecrã.

Da mesma maneira, os ciclos while à espera que um sinal seja recebido, bloqueiam o programa e fazem com que não actualize esses mesmos dados.

Se vires, a lógica que necessitas já está no programa e no entanto não vês as horas a mudar, logo a conclusão a tirar é que o programa está preso nalgum lado.

Para evitares que isso aconteça tens de alterar a maneira como estás a programar de forma a que a função loop continue sempre a ser processada e dessa maneira actualizar também o ecrã. Pesquisa por máquinas de estados para teres uma ideia de como programar de forma a que o programa corra sempre. Olha também a como usar a função millis() em vez de delay e acima de tudo não bloqueies o programa num único sítio sempre que esperas que algo aconteça.
This... is a hobby.

penguim

Eu só não uso millis ou outra função parecida porque só sei trabalhar com o delay. Eu estive a procurar e não percebi bem, se puderes explicar como fazer, agradecia.

bubulindo

Já viste o exemplo blink without delay??

Não há muito a explicar nesse exemplo... adicionalmente, parte do problema é como estás a programar. Ou seja, tu fizeste o programa de forma a que ele corra sequencialmente sem nunca voltar ao inicio da função loop.

Quando fizeste o while à espera que o sinal mude de estado, há necessidade para isso? Não podias apenas ver quando o sinal mudar de estado, fazer X?

Experimenta ver também máquina de estados na internet já que é a maneira mais simples de programar o que pretendes fazer.

Consegues pelo menos entender porque é que a função nõa mostra as horas?
This... is a hobby.

penguim

Eu acho que é, e como explicaste devido a eu ter delays e funções while que ficam à espera de resposta, e esses fazem "bloquear" o resto da programação inclusive não deixa atualizar as horas. Esse exemplo está nos exemplos do arduino ou na net?

bubulindo

O exemplo está instalado na IDE do Arduino.


O delay é um problema, mas ficares à espera de algo acontecer é o maior problema que tens.
This... is a hobby.

penguim

Disseste para usar a função millis() em vez do delay, mas eu acho que não vai resultar, porque como estou a trabalhar com um display touchscreen, na programação eu tenho que esperar pelo touch.
Code: [Select]

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;
}


E depois não consigo que a parte onde está o millis deixe que mostre as linhas de código por 4 segundos.

Code: [Select]

void loop()
{
  if (estado_menu == 0)
  {
    tft.fillScreen(PRETO);
    pag_inicial();
    tft.setFont();
    TSPoint p = waitTouch();
    if ((p.x > 20) && (p.x <= 300) && (p.y > 80) && (p.y <= 160))
    {
      estado_menu = 1;
      Stepper_porta.step(300);
    }
  }
  if (estado_menu == 1)
  {
    while((millis() - valor_millis) >= 4000)
    {
      tft.fillScreen(PRETO);
      tft.setFont(&FreeSansBold9pt7b);
      tft.setCursor(50, 120);
      tft.setTextColor(VERMELHO);
      tft.setTextSize(2);
      tft.print("Para que piso\n\n");
      tft.setCursor(40, 160);
      tft.setTextColor(VERMELHO);
      tft.setTextSize(2);
      tft.print("Que deseja ir?");
      valor_millis = millis();
    }
    tft.fillScreen(PRETO);
    botoes_pisos();
    TSPoint p = waitTouch();
    if ((p.x > 20) && (p.x <= 290) && (p.y > 40) && (p.y <= 110))//se clicar no botao1
    {
      if (piso_elevador == ler_microswitch0)
      {
        while((millis() - valor_millis) <= 4000)
        {  
          tft.fillScreen(PRETO);
          tft.setFont(&FreeSansBold9pt7b);
          tft.setCursor(55, 120);
          tft.setTextColor(VERMELHO);
          tft.setTextSize(2);
          tft.print("Encontra-se\n\n");
          tft.setCursor(67, 160);
          tft.setTextColor(VERMELHO);
          tft.setTextSize(2);
          tft.print("Nesse piso!");
          tft.setFont();
          valor_millis = millis();
        }
      }

bubulindo

Disseste para usar a função millis() em vez do delay, mas eu acho que não vai resultar, porque como estou a trabalhar com um display touchscreen, na programação eu tenho que esperar pelo touch.
Quem te disse isto?

Imagina que o teu toque num botão dura 50 ms... o Arduino consegue processar o teu código (desde que não tenha delays) em talvez 10ms. Eu acho que é bastante menos sinceramente.

This... is a hobby.

penguim

Então o touch não interfere na contagem do tempo do arduíno?

Então o que é que tenho mal na parte da programação? É que não mostra as linhas de código durante 4 segundos no ecrã, o que faz é mostra as linhas de código e passa logo para a outra parte do código, não dando para ver o que está escrito. é de referir que a inicializei a variavel valor_millis, da seguinte forma: unsigned long valor_millis = 0;

Code: [Select]

void loop()
{
  if (estado_menu == 0)
  {
    tft.fillScreen(PRETO);
    pag_inicial();
    tft.setFont();
    TSPoint p = waitTouch();
    if ((p.x > 20) && (p.x <= 300) && (p.y > 80) && (p.y <= 160))
    {
      estado_menu = 1;
      Stepper_porta.step(300);
    }
  }
  if (estado_menu == 1)
  {
    while((millis() - valor_millis) >= 4000)
    {
      tft.fillScreen(PRETO);
      tft.setFont(&FreeSansBold9pt7b);
      tft.setCursor(50, 120);
      tft.setTextColor(VERMELHO);
      tft.setTextSize(2);
      tft.print("Para que piso\n\n");
      tft.setCursor(40, 160);
      tft.setTextColor(VERMELHO);
      tft.setTextSize(2);
      tft.print("Que deseja ir?");
      valor_millis = millis();
    }
    tft.fillScreen(PRETO);
    botoes_pisos();
    TSPoint p = waitTouch();
    if ((p.x > 20) && (p.x <= 290) && (p.y > 40) && (p.y <= 110))//se clicar no botao1
    {
      if (piso_elevador == ler_microswitch0)
      {
        while((millis() - valor_millis) <= 4000)
        {  
          tft.fillScreen(PRETO);
          tft.setFont(&FreeSansBold9pt7b);
          tft.setCursor(55, 120);
          tft.setTextColor(VERMELHO);
          tft.setTextSize(2);
          tft.print("Encontra-se\n\n");
          tft.setCursor(67, 160);
          tft.setTextColor(VERMELHO);
          tft.setTextSize(2);
          tft.print("Nesse piso!");
          tft.setFont();
          valor_millis = millis();
        }
      }

bubulindo

Em que sentido é que interferiria?

Este pedaço de código:

Code: [Select]

    while((millis() - valor_millis) >= 4000)
    {
      tft.fillScreen(PRETO);
      tft.setFont(&FreeSansBold9pt7b);
      tft.setCursor(50, 120);
      tft.setTextColor(VERMELHO);
      tft.setTextSize(2);
      tft.print("Para que piso\n\n");
      tft.setCursor(40, 160);
      tft.setTextColor(VERMELHO);
      tft.setTextSize(2);
      tft.print("Que deseja ir?");
      valor_millis = millis();
     }

Fica aqui bloqueado durante 4 segundos... é apenas marginalmente melhor do que um delay(). Além do mais, se a pessoa carregar no botão dentro do primeiro segundo o teu programa não vai apanhar isso.

Porque é que tens de executar estas instruções todas durante 4 segundos repetidamente???

As tuas temporizações e o que tu pensas ser necessário é o que está a confundir o projecto todo.
This... is a hobby.

Go Up