Ir ao conteúdo
  • Cadastre-se

Arduino ajuste code cronometro para lcd 20x4


Posts recomendados

olá, preciso de ajuda para modificar este codigo, adicionar tempo nas linhas 2 e 3 do lcd 20x4. o cronômetro roda na linha zero, quando eu aperto o botão de pausa e imprime o valor na linha 1, preciso mudar para quando eu pressionar novamente, imprimir o novo valor na linha 1, e enviar o valor da linha 1 para 2 , e quando pressiono o botão novamente, imprime novo valor na linha 1 enviando valor da linha 1 para 2, e 2 para linha 3. sempre salvando novo valor na linha 1 envia os valores salvos para baixo. Eu ainda não entendo bem de programação, se alguém puder ajudar eu agradeço

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);//endereço I2c do LCD

//declaração das variáveis
int horas = 0;
int minutos = 0;
int segundos = 0;
int decimas = 0;
long milisegundos = 0;
int inicio = 10;
int pausa = 9;

void setup(){
  Serial.begin(9600);
  pinMode(inicio, INPUT);
  digitalWrite(inicio, LOW);
  pinMode(pausa, INPUT);
  digitalWrite(pausa, LOW);
  lcd.begin(20,4);//16x2
  while(digitalRead(pausa) == LOW){
  lcd.setCursor(0,0);
  lcd.print("00:00:00:0");
 }
}
void loop(){
  //botao de início 
  if(digitalRead(inicio) == HIGH){ //se o pino ler nível alto, zera as variáveis
    horas = 0;
    minutos = 0;
    segundos = 0;
    decimas = 0;
    lcd.clear();
  }
  //botão Pause/Play 
  if(digitalRead(pausa) == HIGH){//rotina de pausa e exibição da pausa
    delay(200);
    //while(digitalRead(pausa) == LOW);
    lcd.setCursor(0,1);
   if(horas < 10){ lcd.print("0");}//se as horas forem menor que 10, acrescenta um 0 na frente
    lcd.print(horas);
    lcd.print(":");
   if(minutos < 10){ lcd.print("0");}//se os minutos forem menor que 10, acrescenta um 0 na frente
    lcd.print(minutos);
    lcd.print(":");
   if(segundos < 10){ lcd.print("0");}//se os segundos forem menor que 10, acrescenta um 0 na frente 
    lcd.print(segundos);
    lcd.print(":");
    lcd.print(decimas);
    delay(200);
    horas = 0;
    minutos = 0;
    segundos = 0;
    decimas = 0;
  }
  milisegundos = millis();
  if(milisegundos % 100 == 0){  //Entrar apenas se tiver passado o décimo de segundo
    decimas++;
    if(decimas == 10){ //Quando passou 10 décimos de segundo, conta um segundo
      decimas = 0;
      segundos++;
    }
    if(segundos == 60){ 
// Após 60 segundos, conta um minuto
      segundos = 0;
      minutos++;
    }
    if(minutos == 60){// Depois de 60 minutos, conta uma hora
      minutos = 0;
      horas++;
    }
    //exibição no LCD
    lcd.setCursor(0,0);
   if(horas < 10){ //se as horas forem menor que 10, acrescenta um 0 na frente
    lcd.print("0");
   }
    lcd.print(horas);
    lcd.print(":");
    lcd.setCursor(3,0);
   if(minutos < 10){//se os minutos forem menor que 10, acrescenta um 0 na frente
     lcd.print("0");
    }
    lcd.print(minutos);
    lcd.print(":");
    lcd.setCursor(6,0);
   if(segundos < 10){//se os segundos forem menor que 10, acrescenta um 0 na frente
     lcd.print("0");
    }
    lcd.print(segundos);
    lcd.print(":");
    lcd.setCursor(9,0);
    lcd.print(decimas);
  }
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Sò conceito... Vi a tal funcção https://www.arduino.cc/reference/pt/language/functions/time/millis/ que é um simples contador. Pra tirar horas,minutos,segundos,décimos de segundo dela, um conceito mimilalista:

unsigned long t,hora,minuto,segundo,decimas;

  for(;;)
    {
    t=millis();
    decimas=t%100;
    t/=10;
    segundo=t%60;
    t/=60;
    minuto=t%60;
    t/=60;
    hora=t%60;
    }

Testa pra ver.. e me conta

lcd.setCursor(0,0);
lcd.print(horas); lcd.print(":"); 
lcd.print(minutos); lcd.print(":"); 
lcd.print(segundos); lcd.print(":");
lcd.print(decimas);

 

Mas antes ve se sua função lcd.print() tem opção pra imprimir 2 dígitos apenas...

edit ...de fato você por usar lcd.write() que imprime 1 caractere por vez

lcd.write(hora/10);lcd.write(hora%10);
lcd.write(minuto/10);lcd.write(minuto%10);
//...

 

ok, isso não tem a ver com sua questão de registro do momento pause mas deve facilitar o entendimento bem como sua construção se torna + minimalista .. meu mundo...

 

edit.. pra quem viu o fonte incial.. corrigi. O abaixo testei com relativo sucesso em

https://www.programiz.com/c-programming/online-compiler/

// Online C compiler to run C program online
#include <stdio.h>

int main() {
    // Write C code here
    printf("Hello world");
unsigned long millis=2805000, t;
unsigned char hora,minuto,segundo,decimas; //char ocupa menos espaço e deu certo

  for(;;)
    {
    millis++;
    t=millis;
    decimas=t%100;
    t/=10;
    segundo=t%60;
    t/=60;
    minuto=t%60;
    t/=60;
    hora=t%60;
    
    printf("\n%d%s",hora,":");
    printf("%d%s",minuto,":");
    printf("%d%s",segundo,":");
    printf("%d",decimas);
    }
    return 0;

O autor ou quem se interessar vai ter que fazer microajustes... mas o conceito taí ... 😜

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Olá, Edson:

 

Caso ainda não tenha resolvido seu problema, aí vai uma sugestão, baseada em seu próprio código:

 

/**

Sugiro que:

1. Divida o código em funções. Fica mais fácil de entender e depurar.
   Função Clock(): Verifica se está na hora de atualizar o cronômetro ( copiei o que você já tinha feito ).
   Função lcdPrintTime(): Mostra o tempo no LCD ( é uma função auxiliar da função lcdPrintShift )
   Função lcdPrintShift(): desloca as informações de tempo no LCD

2. Use arrays para as informações, pois isto facilita a movimentação de valores e a mostra no LCD.

O setup() pode ficar como está.

As variáveis devem ser modificadas para:

int Horas[4], Minutos[4], Segundos[4], Decimais[4] ;  // Horas[0] ... Decimais[0] é o cronômetro

O índice 0 corresponde ao cronômetro ( Horas[0] ... Decimais[0] )
O índice 1 corresponde ao tempo a mostrar na linha 1 do LCD ( Horas[1] ... Decimais[1] )
O índice 2 corresponde ao tempo a mostrar na linha 2 do LCD ( Horas[2] ... Decimais[2] )
O índice 3 corresponde ao tempo a mostrar na linha 3 do LCD ( Horas[3] ... Decimais[3] )


No main() faça o seguinte:

- Chame Clock()

- Verifique os botões

    - Se for para zerar o cronômetro, faça
    
            Horas[ 0 ] = Minutos[ 0 ] = Segundos[ 0 ] = Decimais[ 0 ] = 0 ;
            lcd.clear();

    - Se for Pausa/Play, chame lcdPrintShift()

Sugestões das rotinas seguem abaixo

**/


void Clock( void )
{
    Milisegundos[ 0 ] = millis();
    if ( Milisegundos[ 0 ] % 100 == 0 )
    {
        //Entrar apenas se tiver passado o décimo de segundo
        Decimais[ 0 ]++;
        if ( Decimais[ 0 ] == 10 )
        {
            //Quando passou 10 décimos de segundo, conta um segundo
            Decimais[ 0 ] = 0;
            Segundos[ 0 ]++;
        }
        if ( Segundos[ 0 ] == 60 )
        {
            // Após 60 Segundos, conta um minuto
            Segundos[ 0 ] = 0;
            Minutos[ 0 ]++;
        }
        if ( Minutos[ 0 ] == 60 )
        {
            // Depois de 60 Minutos, conta uma hora
            Minutos[ 0 ] = 0;
            Horas[ 0 ]++;
        }
    }
}




void lcdPrintTime( int lcdLineParam )
{
    if ( Horas[ lcdLineParam ] > 9 ) lcd.print( "0" ) ;
    lcd.print( Horas[ lcdLineParam ] ) ;

    lcd.print( ":" ) ;

    if ( Minutos[ lcdLineParam ] > 9 ) lcd.print( "0" ) ;
    lcd.print( Minutos[ lcdLineParam ] ) ;

    lcd.print( ":" ) ;

    if ( Segundos[ lcdLineParam ] > 9 ) lcd.print( "0" ) ;
    lcd.print( Segundos[ lcdLineParam ] ) ;

    lcd.print( ":" ) ;

    if ( Decimais[ lcdLineParam ] > 9 ) lcd.print( "0" ) ;
    lcd.print( Decimais[ lcdLineParam ] ) ;
}

void lcdPrintShift( void )
{
    for( int i=3; i>0. i-- )
    {
        Horas[ i ] = Horas[ i-1 ] ;
        Minutos[ i ] = Minutos[ i-1 ] ;
        Segundos[ i ] = Segundos[ i-1 ] ;
        Decimais[ i ] = Decimais[ i-1 ] ;
        lcd.setCursor( 0, i ) ;
        lcd.PrintTime( i ) ;
    }
}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!