Relógio com arduino sem hardware externo -AJUDA


#1

Olá, estou fazendo um relógio que exibe os números em binário com arduino sem hardware externo porém estou com um pequeno problema.
Pare economizar bateria gostaria que ele somente exibisse a hora ao apertar de um botão,porém estou com dificuldade ao realizar isso.

O código para fazer o arduino contar as horas está mais ou menos assim:

delay(60000);
m++;

if(m>=60){
h++;
m=000;

}

if(h>11){
h=000;

}

coisa simples e funcional, mas não estou conseguindo fazer ele exibir as horas no momento que apertar um botão,gostaria de ajuda. Grato :slight_smile:


#2

A hora vai ser apresentada de que forma? leds? display? voce quer esse controle de botão via hardware ou software?


#3

Olá, as horas vão ser exibidas em binário, e mostradas por um led rgb. Se o led acender verde o valor é 1 ,se acender vermelho o valor é 0. E a cor azul é para diferenciar as horas dos minutos.
montei um esquema bem rápido e mal feito no paint para demonstrar.

A seta mostra o sentido no qual os led vão ver exibidos. Assim o primeiro a piscar vale 1 caso verde ,o segundo vale 2 caso verde e assim por diante, até completar as horas,depois irá piscar azul e depois o mesmo jeito para mostrar os minutos.

Então vejo como necessário o"“display”" ser ativado por software, pois não vejo como seria possível por hardware.

Irá ser um relógio de pulso por isso escolhi desse método, assim gastarei só espaço para um led.
Obrigado pela ajuda…
Depois vou postar mais detalhes sobre design e componentes. :slight_smile:


#4

Agora entendi o que quer fazer, espero que já possua o algoritmo e/ou programa rodando, senão, é só falar.
o botão via hardware seria um simples interruptor NA indo do led para o terra, o led iria receber a informação continuamente mas só acenderia no intervalo que o botão fosse mantido pressionado (seria fácil, mas voce não teria controle na apresentação). Já o via software, ideal nesse caso, terá que acionar uma porta input como gatilho, disparando a apresentação, para esta, crie uma rotina para apresentação baseado em loop para apresenta bit a bit.
Se ja tiver o programa, apresenta ele, senão vamos iniciar a confecção.
qualquer coisa estamos aqui. :thumbsup:


#5

Olá,muito obrigado pela ajuda.
Em questão ao software só possuo funcionando a parte de contar o tempo,a parte do botão das maneiras que tentei não funcionaram,então se puder ajudar, grato .
Muito obrigado.

Aos leitores que gostarem do projeto, durante e depois do seu término irei postar como fazer é disponibilizar os arquivos para os interessados.


#6

Então, divulga o código, já que preciso entender como você esta lidando com os dados. não sei se são várias variáveis, se está usando array,…


#7

Está muito superficial , os comandos do lcd é pois estava testando com ele. Onde preferir trocar coisas e mudar, sinta-se a vontade.

#include <LiquidCrystal.h>

int h=0;
int m=0;
int botao=8;
int estadobotao=0;
int led=13;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(){
pinMode(led,OUTPUT);
Serial.begin(9600);
pinMode(botao,INPUT);
lcd.begin(16,2);
lcd.clear();
h=5;
m=38;
}

void loop(){

lcd.setCursor(0,1);
lcd.print(h);
lcd.setCursor(5,1);
lcd.print(m);
delay(60000);
m++;

if(m>=60){
h++;
m=000;
lcd.clear();
}

if(h>11){
h=000;
lcd.clear();
}

}


#8

Fala ae pedreiro, blz?!?
segue o procedimento, estou trabalhando no loop():

Void Transmite (byte TXHORA, byte TXMIN){ //função que faz o envio bit a bit das horas e dos minutos
// etapa de confirmação e aviso de inicio de apresentação, led pisca AZUL
digitalWrite(LEDPAUSA, HIGH);
delay(3000);
digitalWrite(LEDPAUSA, LOW);
delay(1000);
// etapa de envio bit a bit das horas
byte MASCARA;
for (MASCARA = B10000000; MASCARA > 0; MASCARA >>= 1){
if(TXHORA & MASCARA){
digitalWrite(LEDON, HIGH);// se o bit for 1, led acende VERMELHO
delay (ACESO);
}
else {
digitalWrite(LEDOFF, HIGH); // se o bit for 0, led acende VERDE
delay (ACESO);
}
digitalWrite(LEDON, LOW); // apaga led VERMELHO
digitalWrite(LEDOFF, LOW); // apaga led VERDE
delay(ACESO);
}
// etapa aviso termino horas e inicio minutos
delay(1000);
digitalWrite(LEDPAUSA, HIGH); // acende led AZUL
delay(1000);
digitalWrite(LEDPAUSA, LOW); // apaga led AZUL
delay(1000);
// etapa envio bit a bit dos minutos
for (MASCARA = B10000000; MASCARA > 0; MASCARA >>= 1){
if(TXMIN & MASCARA){
digitalWrite(LEDON, HIGH); // acende led VERMELHO
delay(ACESO);
}
else{
digitalWrite(LEDOFF, HIGH); // acende led VERDE
delay(ACESO);
}
digitalWrite(LEDON, LOW); // apaga led VERMELHO
digitalWrite(LEDOFF, LOW); // apaga led VERDE
delay(ACESO);
}
}

Essa parte ja esta funcionando perfeitamente, vou agora acertar o procedimento principal.


#9

E ai ? Valeu pela ajuda aí. Sou meio pempa em programar, estou tentando compreender todo o código que está muito bom, porém eu irei mudar os delays para menos tempo, para ser mais fluido na hora de ver as horas.Mas isso é detalhe.Muito obrigado pela ajuda,vou trabalhar no hardware.
Posto noticias em breve.
Espero noticias suas também, huahua.


#10

então, ainda falta o loop, como você deve ter percebido, os intervalos estão longos mas só fiz assim pra “ler” as informações, ainda falta muita coisa visto que se fizermos essa rotina rodar ela ira consumir tempo que irá defasar o horário, por conta dos delays que “travam” o relógio (o contador deixa de contar nesse período); se você me passar os valores de delay posso ajustar o código, regular e acertar o delay e terminar tudo.


#11

Entendi, acho que de 500 a 600ms é um tempo ótimo para cada led, ficando fluido. A questão do atraso tinha pensado nisso, porem será que daria para depois de cada “visualização” das horas ser adicionado na variável o tempo perdido.
Em questão ao hardware fiz o primeiro protótipo, vi grandes falhas irei fazer a segunda versão.


#12

sim, é nisso que estou pensando, supondo que a soma de todos os delays dê 2 seg, no loop eu acrescento esse mesmo valor. na verdade, posso por um contador ou a função millis() para cronometrar o tempo parado e acrescentá-lo nos “segundos” do loop.
Algumas questões:
1º - você vai usar a temporização de aviso de apresentação? se sim, o tempo está bom?
2º - o tempo que o led azul fica aceso/apagado na mudança de hora para minuto esta bom?

contas:
“aviso” = 2,8s aceso e 0,2s apagado (3s somados)
“horas” = 8x 0,6s aceso e 0,1 apagado (5,6s somados)
“h p/m” = 0,6s aceso e 0,2s apagado (0,8s somados)
“min” = 8x 0,6s aceso e 0,1 apagado (5,6s somados)
total soma 15s a serem somados ao incremento de "segundos"
Te falar que nos meus testes tive dificuldade pra ler os números, mas eu estou enferrujado em bin, rsrsrs…


#13

1º qual a temporização de aviso que se refere ? Se for a de piscar azul antes de exibir as horas acho que coisa de 0,3s aceso e 0,2s apagado esta bom.
2º O tempo do led azul está ótimo.

Uma dúvida, Não entendi o porque das horas possuir 8 bits se só é necessário até o valor 2³ o 4º bit;
Se for parte do raciocínio do código pode deixar assim, Porém acho desnecessário, só ira gastar tempo.
De resto está tudo ótimo,muito obrigado pela ajuda. :slight_smile:


#14

Aí esta a terceira versão do relógio, Porém já identifiquei mais falhas para possíveis melhorias para a versão 4 ,mas de qualquer forma mostro a ideia de design,grato.


#15

Da forma como voce está fazendo, seu relógio vai acumular um atraso.
Para a contagem de tempo em um cronometro eu uso o seguinte:

long SEC_NXT;
void loop() {
static unsigned long ms,ms_ant;

ms = millis();
if (ms == ms_ant) {
return;
}
ms_ant = ms;

if (ms >= SEC_NXT) {
SEC_NXT = SEC_NXT + 1000;
if (estado == 1) { // contando
S += 1;
if (S >= 60) {
S = 0; M += 1;
if (M >= 99) {M = 0; }
}
}
}


#16

Boa noite, a que pé anda esse projeto?! Precisando de ajuda é só falar…