Ir ao conteúdo

Posts recomendados

Postado

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

 

  • Membro VIP
Postado

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í ... 😜

  • 2 semanas depois...
Postado

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

 

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!