Boa noite

estou tentando concatenar dois valores para exibir no display de quatro dígitos

a biblioteca permite eu imprimir um valor int. dentro do campo disp.valueWrite ();

Minha ideia basicamente seria juntar hora e minuto e depois converter novamente em int e depois imprimir esse valor, tentei vários métodos, mas em todos tem uma falha na minha lógica, 

abaixo segue um resumo do sketch no ponto que estou tendo problema.

void hora1 ()

   DateTime now = rtc.now();
     hora = now.hour();
     minuto = now.minute();
     tempo = hora + minuto; // meu erro está aqui

disp.valueWrite (tempo); // imprimir um valor inteiro no display

se alguém puder me dar uma luz agradeço.

Att

Exibições: 762

Responder esta

Respostas a este tópico

tente assim:

.

.

.

hora = now.hour();
minuto = now.minute();

tempo = hora;

tempo += minuto;

.

.

.

Quase, ele somou os valores, precisava que juntasse lado a lado, ficando 4 digitos.

Valeu mesmo assim.

então transforme hora em String:

tempo = String(hora);

tempo += minuto;

outra opção:

.
.
.
hora = now.hour();
minuto = now.minute();
tempo.concat(hora);
tempo.concat(minuto);

disp.valueWrite (tempo);
.
.
.

em ambas, fique esperto também para preencher com zero na esquerda, garantindo que os número tenham 2 dígitos, por exemplo 9 transformar em 09. Para isso, dá pra usar as mesmas técnicas de concatenação descritas

Muito boa a dica, contudo do agora aparece o erro abaixo, pois o programa só exibe inteiros. Talvez se eu alterasse a biblioteca daria para aceitar strings também.

 error: no matching function for call to 'LM7SegDirect::valueWrite(String&)'

 note: candidates are: void LM7SegDirect::valueWrite(int)


dentro do arquivo .cpp tem este trecho que faz a conversão dos zeros e é responsavel pela exibição dos valores

void LM7SegDirect::valueWrite(int number) {
if (number < 10)
{
digitWrite(4, 0);
digitWrite(3, 0);
digitWrite(2, 0);
digitWrite(1, number);
}
else if (number < 100)
{
digitWrite(4, 0);
digitWrite(3, 0);
digitWrite(2, number / 10);
digitWrite(1, number % 10);
}
else if (number < 1000)
{
digitWrite(4, 0);
digitWrite(3, number / 100);
digitWrite(2, (number % 100) / 10);
digitWrite(1, number % 10);
}
else
{
digitWrite(4, number / 1000);
digitWrite(3, (number % 1000) / 100);
digitWrite(2, (number % 100) / 10);
digitWrite(1, number % 10);
}
}

Anexos

vc precisa passar o resultado como número inteiro, é isso? 

tente então usar assim: 

tempo = String(hora);
tempo += minuto;

tempo.toInt();

ou assim:

.
.
.
hora = now.hour();
minuto = now.minute();
tempo.concat(hora);
tempo.concat(minuto);

tempo.toInt();
disp.valueWrite (tempo);
.
.
.

imhugo testei os dois, 

no primeiro na linha tempo = String(hora); 

da erro 

error: cannot convert 'String' to 'int' in assignment

error: request for member 'toInt' in 'tempo', which is of non-class type 'int'


no segundo também na linha tempo.concat(hora);

error: request for member 'concat' in 'tempo', which is of non-class type 'int'

error: request for member 'toInt' in 'tempo', which is of non-class type 'int'

na minha versão, não deu erro de logica nenhum, funcionou no monitor serial, mas o display não acendeu.

fiz o teste com o código do termômetro e funcionou normalmente o danado.

hora= 12

min = 20
tempo = hora*100+min;
tempo = 1220

imhugo

Obrigado pela postagem, a noite vou testar

mas vou testar o seguinte, também.

Mas encontrei uma alternativa simples, posso multiplicar a hora por 100 e somar os minutos.

hora= 12
min = 20
tempo = hora*100+min;
tempo = 1220

Se a hora fosse 1 por exemplo ficaria 120, contudo a biblioteca complementa o zero faltante.

sim claro, é outra alternativa válida também, e nada mais é do que aplicação de princípios matemáticos

Há diversas maneiras de chegar a um mesmo resultado, uns mais elegantes, outros mais consumidores de recursos, outros mais eficientes... enfim, o importante é vc conseguir entender bem o que está sendo feito para que futuramente seja possível readaptar o código em caso de necessidade

Imhugo, muito obrigado pela contribuição, de fato é só ir aprendendo e agregando, meu código tem muito o que melhorar para atingir meu objetivo pleno, preciso entender as opções disponíveis que são inúmeras.


Agora preciso só descobrir como alternar a exibição entre a leitura da hora com a leitura da temperatura.

Abraços.

eu aqui alterno no meu display exibição de hora e exibição de umidade/temperatura 

configurei pra exibir hora quando os segundos do relógio for igual a 0 até 9, ou 15~24, ou 30~39, ou 45~54

e aparecerá umidade/temperatura quando os segundos do relógio for igual a 10~14, ou 25~29, ou 40~44, ou 55~59

Dessa forma, o horário é exibido durante 10 segundos e alterna com exibição de umidade/temperatura que é exibido durante 5 segundos

Em resumo, durante um minuto, há 4 ciclos de 15 segundos, sendo que dentro de um ciclo, 10 segundos são usados para exibição de hora e 5 segundos são usados para exibir temperatura/umidade

Se vc trabalhar com essa técnica de raciocínio (quantidade de ciclos, duração de ciclo e subdivisão do tempo dentro de um ciclo), fica fácil vc ter noção, podendo por exemplo, para citar alguns exemplo:

* 5 ciclos de 12 segundos (subdividindo o tempo por exemplo no esquema 7s+5s)

* 4 ciclos de 15 segundos (subdividindo o tempo por exemplo no esquema 9s+6s)

* 6 ciclos de 10 segundos (subdividindo o tempo por exemplo no esquema 7s+3s)

* e por aí vai, vc quem manda

Consegui fazer funcionar do jeito que vc falou,

Eu reiniciei o código do zero e consegui fazer funcionar. testei trecho a trecho hehe

segue em anexo o código pronto.

Abraços

Anexos

no seu caso, vi que vc usou apenas 1 ciclo de 60 segundos (subdividindo o tempo em 20s+40s)

depois experimente aprimorar isso, porque se vc quiser saber a temperatura, precisará esperar 40 segundos pra ver. E a temperatura não precisa ser exibida por todo esse tempo de 20seg.

de qualquer forma, ficou chique demais... agora que captou o conceito, fica fácil adaptar

parabéns

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço