Contador Regressivo

Prezados,

Como várias outras pessoas, estou dando meus primeiros passos em programação e em especial no Arduíno.

Já consegui fazer alguns pequenos projetos, agora estou tentando fazer um contador regressivo e não estou obtendo êxito, as bibliotecas que encontro apontam para um contador progressivo, já tentei alterar alguns paramentos nas configurações, mas tudo sem sucesso, não consigo fazer a contagem regressiva.

Encontrei no Playground um artigo com uma biblioteca que pudesse me ajudar, porém o link da biblioteca está com erro de indisponibilidade (404).

https://playground.arduino.cc/Main/CountDownTimer

Abaixo dois códigos que estou tentando modificar para conseguir fazer o contador regressivo.

O código abaixo, é relativamente simples, mas embora eu tente fazer qualquer alteração ele sempre conta progressivamente, então me fez entender que a biblioteca MsTimer2 não conta de forma regressiva.

//Adaptado do Exemplo disponível em: https://www.youtube.com/watch?v=Okjm364EcQo
// Inclusão da biblioteca para temporização:
#include <MsTimer2.h>
// Inclusão do código da biblioteca para LCD:
#include <LiquidCrystal.h>
// Preparando a biblioteca com os números dos pinos para o LCD:
LiquidCrystal lcd(2,3,4,5,6,7);
// Definição de pino para conexão do botão...
#define BOTAO A5

volatile char centesimos, segundos, minutos;
volatile boolean mudouCrono = true;
volatile boolean cronoLigado = false;

void ajustaCronometro ()
{
// Ajusta a cronometragem, a cada 10ms.
  centesimos++;
  if (centesimos == 100) { // Completou 1 seg.
    centesimos = 0;
    segundos++;
    if (segundos == 60) { // Completou 1 min.
      segundos = 0;
      minutos ++; }
} 
//Seta a bandeira, sinalizando mudança na cronometragem...

mudouCrono = true;
}

void setup () {
// Incia valores de cronometragem:
minutos = 20;
segundos = centesimos = 0;
pinMode (BOTAO, INPUT); // Configuração do pino -- Configura LCD (num. de colunas e de linhas): 
lcd.begin(16, 2);
lcd.noCursor(); // ..com cursor apagado. -- Exibe linha de título:
lcd.print ("Cronometragem"); // Configuração de MsTimer2:
MsTimer2::set (10, ajustaCronometro); 
}

void loop () {
if ( (digitalRead (BOTAO)== LOW) && (cronoLigado == false) )
{ 
  // Se botão acionado e cronômetro desligado,
  // liga-o e ativa o MsTimer2.
  cronoLigado = true; MsTimer2::start();
} else if ( (digitalRead (BOTAO)== HIGH) && (cronoLigado == true) )
{ // Se botão liberado, e cronômetro ligado, 
  // desliga-o e para o MsTimer2. 
  cronoLigado = false; MsTimer2::stop();
} if (mudouCrono) { 
  // Se houve mudança na 
  // cronometragem, exibe o novo valor. 
  // Ajusta posição no LCD 
  lcd.setCursor (0,1);
  lcd.print (minutos,DEC);
  lcd.print (':');
  lcd.print (segundos,DEC);
  lcd.print (':');
  lcd.print (centesimos,DEC);
  lcd.print (" ");
  mudouCrono = false;
  // Desmarca o -flag-.
  }
}

Agora esse abaixo quase obtive sucesso.

Adaptei de um código que encontrei na internet e alterei seguindo as minhas necessidades, fiz a emulação no Thinkercad e funcionou corretamente, porém ao colocar no Arduíno não funciona.

Ele não exibe o cronometro regressivo.

Achei que pudesse ser uma falha da minha placa Arduíno e então fiz uma simulação no Protheus, deu a mesma coisa... Não exibe nada, portanto não há dúvidas, tem algum erro que não consegui encontrar.

#include <LiquidCrystal.h>
LiquidCrystal lcd(2,3,4,5,6,7);
int segundo = 0;
int minuto = 0;
const int LED_BLUE = 13;
const int LED_RED = 12;
const int Buzzer = 11;
const int Botao1 = A5;
const int Botao2 = A4;
const int Botao3 = A3;
int EstadoBotao1 = 0;
int EstadoBotao2 = 0;
int EstadoBotao3 = 0;

void setup()
{
  pinMode(Botao1,  INPUT);
  pinMode(Botao2,  INPUT);
  pinMode(Botao3,  INPUT);
  pinMode(LED_BLUE, OUTPUT); digitalWrite (LED_BLUE, LOW);
  pinMode(LED_RED,  OUTPUT); digitalWrite (LED_RED, LOW);
  pinMode(Buzzer,   OUTPUT); digitalWrite (Buzzer, LOW);
  lcd.begin(16, 2);
  inicializacao();
//  looping_leds();
}

void loop() {

  EstadoBotao1 = digitalRead(Botao1); // Faz a leitura do Botão1
  if (EstadoBotao1 == HIGH) // Se o Botão1 for alto
  {
      segundo = 00; // incremente 1 segundo
      minuto = 20; // aqui altero o tempo que desejo
  }
  
  EstadoBotao2 = digitalRead(Botao2); //Contagem de segundos
  if (EstadoBotao2 == HIGH)
  {
// sem ação
  }

   EstadoBotao3 = digitalRead(Botao3); // ação
  if (EstadoBotao3 == HIGH)
  {
    if ((minuto == 0) && (segundo == 0))
    {
      //nao faz nada
    }
    else
    {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("CONTANDO...");
      if (segundo == 00)
      {
        minuto--;
        segundo = 59;
      }
      for (int y = 0; y < segundo; y--)
      {
        if (minuto < 10) {
          lcd.setCursor(5, 1);
          lcd.print("0");
          lcd.print(minuto);
          lcd.print(":");
        }
        else
        {
          lcd.setCursor(5, 1);
          lcd.print(minuto);
          lcd.print(":");
        }
        if (segundo < 10)
        {
          lcd.print("0");
          lcd.print(segundo);
        }
        else
        {
          lcd.print(segundo);
        }
        segundo--;
        if (segundo < 0)
        {
          minuto--;
          segundo = 59;
        }
        delay(1000);
        if ((segundo <= 0) && (minuto <= 0))
        {
          lcd.clear();
          lcd.setCursor(5, 0);
          lcd.print("FIM");
          lcd.setCursor(8, 1);
          lcd.print("Reinicie");
          digitalWrite(Buzzer, HIGH);
          while (digitalRead (Buzzer == HIGH))
          {
             digitalWrite(LED_BLUE, HIGH);
             delay(500);
             digitalWrite(LED_BLUE, LOW);
             digitalWrite(LED_RED, HIGH);
             delay(500);
             digitalWrite(LED_RED, LOW);
          }
        }
       }
     }
  }
}
void inicializacao()
  {
  lcd.begin(16,2);
  lcd.clear();
  
  lcd.setCursor(5,0);
  lcd.print ("OLA");
  lcd.setCursor(1,1);
  lcd.print("SEJA BEM-VINDO");
  delay(2000);
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print ("LIMITE DE");
  lcd.setCursor(3,1);
  lcd.print("20 MINUTOS");
  delay(3000);
  lcd.clear();
}

Peço desculpas pelo texto ter ficado longo demais, mas se puderem me ajudar a encontrar uma forma de fazer um contador regressivo ficarei muito grato.

Muito obrigado,

David

david_vb0402:
Prezados,

Como várias outras pessoas, estou dando meus primeiros passos em programação e em especial no Arduíno.

Já consegui fazer alguns pequenos projetos, agora estou tentando fazer um contador regressivo e não estou obtendo êxito, as bibliotecas que encontro apontam para um contador progressivo, já tentei alterar alguns paramentos nas configurações, mas tudo sem sucesso, não consigo fazer a contagem regressiva.

Encontrei no Playground um artigo com uma biblioteca que pudesse me ajudar, porém o link da biblioteca está com erro de indisponibilidade (404).

Arduino Playground - HomePage

Abaixo dois códigos que estou tentando modificar para conseguir fazer o contador regressivo.

O código abaixo, é relativamente simples, mas embora eu tente fazer qualquer alteração ele sempre conta progressivamente, então me fez entender que a biblioteca MsTimer2 não conta de forma regressiva.

Agora esse abaixo quase obtive sucesso.

Adaptei de um código que encontrei na internet e alterei seguindo as minhas necessidades, fiz a emulação no Thinkercad e funcionou corretamente, porém ao colocar no Arduíno não funciona.

Ele não exibe o cronometro regressivo.

Achei que pudesse ser uma falha da minha placa Arduíno e então fiz uma simulação no Protheus, deu a mesma coisa... Não exibe nada, portanto não há dúvidas, tem algum erro que não consegui encontrar.

Peço desculpas pelo texto ter ficado longo demais, mas se puderem me ajudar a encontrar uma forma de fazer um contador regressivo ficarei muito grato.

Muito obrigado,

David

Tinha sido boa ideia ler as regras do fórum antes de postar. Quote não é igual a Code e o código deve ficar numa caixa de Code porque é mais fácil de ler e mais fácil de seleccionar e consequentemente de copiar para um editor de texto.

O problema que descreve no segundo código parece ser que o problema é do LCD e não do código em si. Veja se tem o LDC bem definido (principalmente os pinos que estão a ser usados).

luisilva:
Tinha sido boa ideia ler as regras do fórum antes de postar. Quote não é igual a Code e o código deve ficar numa caixa de Code porque é mais fácil de ler e mais fácil de seleccionar e consequentemente de copiar para um editor de texto.

O problema que descreve no segundo código parece ser que o problema é do LCD e não do código em si. Veja se tem o LDC bem definido (principalmente os pinos que estão a ser usados).

Obrigado pela sua observação, alterei a apresentação, acredito que agora esteja nos parâmetros do fórum.

Quanto a funcionalidade do LCD este está em ordem e funciona com outros programas, bem como com a inicialização desse mesmo programa.

Por fim, após diversos testes ao longo do dia, cheguei com a ajuda de um amigo nessa conclusão para o void loop.

void loop(){
  lcd.clear();
  for (minuto = 0;minuto>=0;minuto--){
    for(segundo = 02;segundo>=0;segundo--){
      delay(1000);
      lcd.setCursor(4,0);//minuto
      lcd.print(minuto);
      lcd.setCursor(6,0);// dos :
      lcd.print(":");
        if(segundo<10){
          lcd.setCursor(7,0);
          lcd.print("0");
          lcd.print(segundo);
        }
        else{
          lcd.setCursor(7,0); //segundos
          lcd.print(segundo);
          }
     if ((segundo <= 0) && (minuto <= 0)){
             digitalWrite(LED_BLUE, HIGH);
             delay(500);
             digitalWrite(LED_BLUE, LOW);
             digitalWrite(LED_RED, HIGH);
             delay(500);
             digitalWrite(LED_RED, LOW);  
        }
     }
   }
 }

Embora esteja funcionando corretamente, sem precisar de nenhuma biblioteca, ainda não consegui encontrar uma condição do loop para parar o contador em zero, quando ele termina, volta do inicio e assim sucessivamente.

Obrigado.

É só você criar uma variável de controle para que fique num loop infinito aguardando algo acontecer para reiniciar...