Go Down

Topic: Função para voltar a outra função executada anteriormente (Read 906 times) previous topic - next topic

penguim

Será que me podem ajudar a descobrir como mudar o goto para algo que faça o mesmo? :( 
Abaixo está a minha programação, para darem uma olhada. ;)

luisilva

Será que me podem ajudar a descobrir como mudar o goto para algo que faça o mesmo? :( 
Abaixo está a minha programação, para darem uma olhada. ;)
Tenho uma dúvida em relação ao seu código. Porque é que a label está naquela linha e não na primeira linha após if?

penguim

Eu tenho a label nessa linha porque eu quero que a programação volte a essa linha para voltar a aparecer os botoes e que possa ler o touch porque caso o utilizador clique acidentalmente no botao do piso1, e sabendo que o elevador que se encontra no piso1 ele possa voltar a clicar num dos outros e assim subir ou descer o elevador, para que não volte a realizar toda a programação outra vez.
E será que me podem ajudar também em relação ao post "interligar dois arduinos"? É que é a parte crucial para que o meu projeto possa funcionar.
Obrigado;)

luisilva

Eu tenho a label nessa linha porque eu quero que a programação volte a essa linha para voltar a aparecer os botoes e que possa ler o touch porque caso o utilizador clique acidentalmente no botao do piso1, e sabendo que o elevador que se encontra no piso1 ele possa voltar a clicar num dos outros e assim subir ou descer o elevador, para que não volte a realizar toda a programação outra vez.
E será que me podem ajudar também em relação ao post "interligar dois arduinos"? É que é a parte crucial para que o meu projeto possa funcionar.
Obrigado;)
Mais uma vez não responde à minha questão. Assim não o consigo ajudar. Pelo que vejo, este código:
Code: [Select]

    tft.fillScreen(PRETO);
    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.drawLine(0,30,320,30,LARANJA);

desenha um ecrã. Sendo assim, a única diferença entre ir para a linha que actualmente tem a label e ir para a primeira linha deste bloco é que o ecrã iria ser desenhado outra vez, certo? Se é assim, eu preferiria que a label estivesse logo no inicio deste bloco (assim é mais fácil elimina-la).
Na minha perspectiva o código está mal pensado logo desde o início, por isso é normal que não encontre forma de escrever o código sem ser usando o goto. O código na função loop() devia estar mais condensado (devia utilizar mais funções).

penguim

Agora entendi o quer dizer, e sim é como está a pensar. Então o que aconselha a fazer?

luisilva

Agora entendi o quer dizer, e sim é como está a pensar. Então o que aconselha a fazer?
Era o que eu pensava, mas é melhor sempre confirmar.
Outra dúvida que não me tinha apercebido antes: O código seguinte:
Code: [Select]

  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!");
      tft.setFont();
      delay(4000);
      goto label;//(ir à linha 238)
    }
    else
    {
      if (piso_elevador != microswitch0)
      {
        do
        {
          Stepper_elevador.step(-512);//desce o elevador
          tft.fillScreen(PRETO);
          tft.setFont(&FreeMonoBold9pt7b);
          tft.setCursor(30, 50);
          tft.setTextSize(2);
          tft.setTextColor(VERDE);
          tft.print("DESCENDO PARA\n   o PISO 0");
          seta_descer();
        } 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);//abre a porta
      tft.fillScreen(PRETO);
      tft.setFont(&FreeMonoBold9pt7b);
      tft.setCursor(30, 60);
      tft.setTextSize(2);
      tft.setTextColor(VERDE);
      tft.print("PORTA ABERTA");
      delay(5000);
    }
  }


Não faz o mesmo que este:
Code: [Select]
 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!");
      tft.setFont();
      delay(4000);
      goto label;//(ir à linha 238)
    }
    else
    {
      do
      {
        Stepper_elevador.step(-512);//desce o elevador
        tft.fillScreen(PRETO);
        tft.setFont(&FreeMonoBold9pt7b);
        tft.setCursor(30, 50);
        tft.setTextSize(2);
        tft.setTextColor(VERDE);
        tft.print("DESCENDO PARA\n   o PISO 0");
        seta_descer();
      } 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);//abre a porta
      tft.fillScreen(PRETO);
      tft.setFont(&FreeMonoBold9pt7b);
      tft.setCursor(30, 60);
      tft.setTextSize(2);
      tft.setTextColor(VERDE);
      tft.print("PORTA ABERTA");
      delay(5000);
    }
  }


Ou seja, para que serve o
Code: [Select]
     if (piso_elevador != microswitch0)
dentro de um else de um
Code: [Select]
   if (piso_elevador == microswitch0)

Não faz grande sentido, não acha?

luisilva

Uma coisa como o que está anexo faria o que é pretendido?

penguim

Ou seja, para que serve o
Code: [Select]
     if (piso_elevador != microswitch0)
dentro de um else de um
Code: [Select]
   if (piso_elevador == microswitch0)

Não faz grande sentido, não acha?
Realmente não faz :-\ .

Em relação à outra parte, SEMPRE QUE APARECER ESTAS LINHAS DE CÓDIGO NO ECRÃ:

Code: [Select]

        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!");
        tft.setFont();
        delay(4000);

Em vez de voltar ao estado_menu 0, queria que voltasse ao estado_menu 1, e depois corria normalmente com está na programação. Não dá para fazer isso, é que se calhar entendi mal o que disse num dos posts anteriores.
Code: [Select]

  if (estado_menu == 1) {
    tft.fillScreen(PRETO);
    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);
    botoes_pisos();
    TSPoint p = waitTouch();
    }

luisilva

Realmente não faz :-\ .

Em relação à outra parte, SEMPRE QUE APARECER ESTAS LINHAS DE CÓDIGO NO ECRÃ:

Code: [Select]

        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!");
        tft.setFont();
        delay(4000);

Em vez de voltar ao estado_menu 0, queria que voltasse ao estado_menu 1, e depois corria normalmente com está na programação. Não dá para fazer isso, é que se calhar entendi mal o que disse num dos posts anteriores.
Code: [Select]

  if (estado_menu == 1) {
    tft.fillScreen(PRETO);
    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);
    botoes_pisos();
    TSPoint p = waitTouch();
    }


Se está feito assim, está errado. Ele devia ficar no mesmo estado, ou seja, estado_menu=1, uma vez que essa variável não é alterada nesse bloco. Se está a voltar ao estado_menu = 0, fui eu que me enganei (e a variável esta a ser mudada noutro ponto do programa sem que eu estivesse a contar). Adicione essa linha nesse bloco e veja se faz o que é pretendido. Se vir que fica feio desenhar o ecrã todo quando vem dessa parte do programa (às vezes pode-se notar a piscar, ou a desenhar o ecrã), adiciona-se uma variável que impeça desenhar o ecrã quando o programa vem desse bloco.

penguim

Acrescentei a linha de código e funciona como pretendido, quero agradecer a disponilidade e a ajuda. :D
Muito Obrigado, agora funciona como eu quero!!! ;)  ;D

Go Up