Controlando Display de 7 Segmentos com CD4511 e Arduino
Depois de alguns dias sem postar estou de volta com um projeto "cool". Hoje faremos um contador utilizando um display de 7 segmentos.
O display de 7 segmentos é normalmente utilizado para indicar números e podem ser vistos normalmente em elevadores, alguns rádio relógios.
Aqui está um exemplo de um display de elevador.
Material necessário:
Para este experimento precisaremos de alguns materiais:
- 1 Placa Arduino e seu respectivo cabo
- 1 Fonte de alimentação de 5V
- 1 Protoboard
- 7 resistores de 150Ω ($0,02 cada)
- 1 CI CD4511- Decodificador BCD - 7 Segmentos ($1,50)
- 1 Display de 7 Segmentos Catodo Comum ($0,50 cada)
- Alguns fios para conectar os componentes
O que faremos?
Criaremos um código para a placa Arduino, este enviará para um decodificador BCD-7-Segmetnos 4 bits, esses serão decodificados e então serão convertidos em 7 bits então usados para controlar um display de 7 segmentos.
Para saber mais sobre códigos BCD visite o link para a
Wikipedia.
Como ligar os acessórios?
Neste post testaremos uma nova forma de mostrar como os acessórios foram ligados, apresentarei o circuito na forma de um desenho feito com com o software
Fritzing que pode ser baixado gratuitamente do seu site. Veja na imagem a seguir como ficou o circuito ou clique
aqui para ver em tamanho real.
Montagem:
Image do CI CD4511BE.
Conexão do CI, resistores e display de 7 segmentos. Ficou uma aranha. :)
Placa Arduino, responsável por enviar 4 bits em formato BCD.
Visão geral do projeto, protoboard, fonte, Arduino e componentes.
Programação:
A programação para este projeto é bem simples, defino 4 variáveis e atribuo a elas o endereço das portas de IO do Arduino. Em seguida na função Setup faço mais algumas configurações e então defino a função number que recebe um número como parâmetro. Baseado neste número as portas de saída são configuradas para enviar um valor BDC adequado.
Dentro da função loop crio 2 laços para fazer a contagem de forma crescente e depois decrescente. Bem simples, veja abaixo o código.
/* 7 Segments This project uses the CD4511 BCD to 7segments Latch Decoder Driver to count the numbers from 0 - 9 and after 1 second from 9 - 0.*/// Atribui a cada variável um endereço.int pinA = 6, pinD = 7, pinC = 8, pinB = 9;void setup() { // Configura a velocidade da porta serial Serial.begin(9600); // Diz ao controlador que os pinos são de saída pinMode(pinA, OUTPUT); pinMode(pinB, OUTPUT); pinMode(pinC, OUTPUT); pinMode(pinD, OUTPUT); }// Recebe um inteiro como parâmetro// Baseado no número configura os pinos de saída conforme da tabela BCD// do CI CD4511void number(int num){ switch (num) { case 0: digitalWrite(pinA, LOW); digitalWrite(pinB, LOW); digitalWrite(pinC, LOW); digitalWrite(pinD, LOW); break; case 1: digitalWrite(pinA, HIGH); digitalWrite(pinB, LOW); digitalWrite(pinC, LOW); digitalWrite(pinD, LOW); break; case 2: digitalWrite(pinA, LOW); digitalWrite(pinB, HIGH); digitalWrite(pinC, LOW); digitalWrite(pinD, LOW); break; case 3: digitalWrite(pinA, HIGH); digitalWrite(pinB, HIGH); digitalWrite(pinC, LOW); digitalWrite(pinD, LOW); break; case 4: digitalWrite(pinA, LOW); digitalWrite(pinB, LOW); digitalWrite(pinC, HIGH); digitalWrite(pinD, LOW); break; case 5: digitalWrite(pinA, HIGH); digitalWrite(pinB, LOW); digitalWrite(pinC, HIGH); digitalWrite(pinD, LOW); break; case 6: digitalWrite(pinA, LOW); digitalWrite(pinB, HIGH); digitalWrite(pinC, HIGH); digitalWrite(pinD, LOW); break; case 7: digitalWrite(pinA, HIGH); digitalWrite(pinB, HIGH); digitalWrite(pinC, HIGH); digitalWrite(pinD, LOW); break; case 8: digitalWrite(pinA, LOW); digitalWrite(pinB, LOW); digitalWrite(pinC, LOW); digitalWrite(pinD, HIGH); break; case 9: digitalWrite(pinA, HIGH); digitalWrite(pinB, LOW); digitalWrite(pinC, LOW); digitalWrite(pinD, HIGH); break; default: digitalWrite(pinA, HIGH); digitalWrite(pinB, HIGH); digitalWrite(pinC, HIGH); digitalWrite(pinD, HIGH); }}void loop(){ // Faz um loop de 0 a 9 for (int i = 0; i < 10; i++) { // Imprime o valor desejado number(i); // Aguarda meio segundo delay(500); } // Apaga o número, perceba que quando chamo a função number // com um valor <0 ou >9 a função simplesmente apaga todos // os leds do contador. Por isso, se chamo a função com o // valor 10 simplesmente o display se apagará. number(10); // Aguarda 1 segundo delay(1000); // Faz um loop de 9 a 0 for (int i = 10; i >= 0; i--) { // Imprime o valor desejado number(i); // Aguarda meio segundo delay(500); }}