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