Bom dia pessoal!

Minha ideia é a seguinte, fazer o Arduíno trabalhar com um contador digital (4 displays de 7 segmentos) a cada ciclo no void loop() fazer o Arduíno adicionar uma unidade ao contador. Então pensei em ligar os 4 displays diretamente no arduino atraves do PCF8574, mas acho que o código ficaria muito extenso e complicado para mim que não sou avançado, por isso descartei essa opção.

Através de pesquisas eu encontrei uma segunda alternativa, usar um contador BCD 4518 e um decodificador de 7 segmentos 4511, funcionando da seguinte forma: No final de cada ciclo da função void loop() o Arduíno enviar um pulso e assim fazer o contador somar +1 numero. O esquema é o seguinte:

(no lugar do botão vai um 2N2222)


Pensei que tinha solucionado porém só funcionaria com 1 display já que ao final de 9 ciclos ele voltaria ao zero. Eu preciso que me ajudem a como fazer para funcionar com os 4 displays. O que eu faria no código?

E uma terceira alternativa que eu encontrei foi: fazer um contador com um botão para adicionar +1 numero e um botão de reset. no lugar dos botões vão um 2N2222 com a base ligada no Arduíno, assim ele só teria que saturar a base do transistor e ficaria extremamente simples o código. O meu problema é o seguinte eu não sei como eu farei esse contador, então se alguém souber ou tiver ideia de como fazer, ou tiver o esquema será de muita valia. 

Aqui segue o vídeo mostrando o funcionamento do tal contador que encontrei:

https://www.youtube.com/watch?v=CG2FaXfc6XQ

Obrigado.

*moderação, este é o primeiro tópico que eu crio aqui no Lab de Garagem então se eu fiz algo errado, ou postei esse tópico na área errada, por favor me avisem ou movam o tópico, obrigado.

Exibições: 7190

Responder esta

Respostas a este tópico

Usando 4 displays de um dígito ou 1 de 4 dígitos a questão é a mesma: vc tem 32 LEDs para comandar, 4x8. Nesse caso, vc tem que multiplexar, ou seja, usar algum mecanismo para multiplicar as portas do Arduino.

Esse fim de semana eu fiz justamente uma biblioteca para isso: gerenciar até 8 displays com apenas 3 portas do Arduino, usando CIs 74HC595, um para cada display (no caso, display de 8 segmentos, com ponto decimal). Vc pode ver o resultado aqui (Parte I) e aqui (Parte II). Lá tem a explicação, exemplos e vídeos do troço funcionando. Os fontes da lib e do exemplo estão no Google Code, free.

Qualquer dúvida, é só responder aqui.

PS: usando a minha lib e um circuito com o 595, o seu programa ficaria simples assim:

#include <Arduino.h>
#include <LED8SegDisplay595.h>

LED8SegDisplay595 ls(2,12,8,11);

int i = 0;

void setup() {
}

void loop() {
  ls.write(i);

  delay(100); // necessário senão vc nem vê o contador, fica muito rápido. Ele vai contar décimos de segundo

  i++;
}

O cara que fez o vídeo que vc postou usa oito CIs, então a solução dele é diferente, talvez mais enrolada, e ele não posta nenhuma dica. Usando o 595, vc vai precisar de 4 CIs que são muito fáceis de achar e custam menos de R$ 2,00 cada.

Todo o enrosco de lidar com a multiplexação está na lib LED8SegDisplay595.

Muito obrigado, eu realmente estava tendo problemas para multiplexar essas portas, sua Lib ficou muito boa e vai me ser muito util!

mas ainda me resta uma duvida, eu quero apertar um botão e acionar um motor de passo, ele vai dar 10 voltas sentido horário, 10 voltas sentido anti-horário... até aí tudo bem eu consegui fazer, mas no final desse processo eu preciso que o contador some +1 numero no diplay, então, no final do loop o que eu devo fazer no código?

E encontrei um video melhor do contador que eu quero fazer esse ele usa 3 CIs apenas, mas como eu usarei 4 dígitos acho que terei que usar 4..

http://www.youtube.com/watch?v=pHlNCJc8xAY

Se vc quiser, poste seu código e a gente altera junto. Mas basicamente vc tem que fazer o seguinte:

1) Incluir a lib

#include <LED8SegDisplay595.h>

2) Declarar o objeto. Veja os parâmetros na documentação da classe. O primeiro número é o número de displays usados.

LED8SegDisplay595 ls(4,12,8,11);

3) declarar o contador

int i = 0;

4) No loop(), vc deve colocar, abaixo do código do motor de passo, as seguintes instruções:

  ls.write(i);

  delay(100); 

  i++;

Só isso.

Entendi, agora eu não estou no meu pc, mas quando eu chegar em casa eu irei refazer o código e postarei o resultado. Realmente é muito simples, obrigado.

Dá pra controlar quatro displays ou um só de quatro dígitos, usando apenas um 74HC595 mais o Arduino. Partindo do princípio da multiplexação, na verdade vc controla somente um por vez, e por isso, apenas um registrador.

Abraços!

Felipe, não entendi. Como controlar o display de 4 dígitos com um 595? Será que é usando um esquema tipo matriz de LEDs, em que a gente acende rapidamente linha por linha e dá a ilusão que várias estão acesas simultaneamente?

Mauro, é isso mesmo. Sempre fiz assim.

Abraços!

Ok, legal. A questão que vejo nesse caso é que geralmente quando a gente tem displays numéricos ou alfanuméricos a gente quer que eles atuem dentro de uma outra rotina. Por exemplo, se eu faço um medidor de temperatura, tenho que ficar lendo o sensor várias vezes, dando um pequeno intervalo entre as leituras, depois calcular a média e aí exibir o resultado. Posso ter inclusive a necessidade de esperar uma intervenção do usuário, pressionar um botão por exemplo. Minha dúvida é: como fazer para conciliar essas rotinas com o mecanismo de atualizar o display?

Dessa forma, na lógica é necessário que mantenha sempre o ciclo passando pelo display. Não pode haver delay (conforme multiplexação como em matriz).

Sempre que precisa que interação do usuário (botões, etc) eu mantenho rotinas dentro de loops.

Fiz esses dias um relógio com despertador e cronometro, usando um display de 4 digitos e apenas um registrador de deslocamento. Vou preparar pra postar no blog (www.efeitonerd.com.br).

Ajuste de horas, ajuste do alarme... Tudo nos botões para o usuário configurar.

Abraços!

Legal, poste mesmo. Vou ver se amanhã faço um exercício nessa linha tb.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço