collapse

* Links de Robótica

* Posts Recentes

Ligar Células de Lithium por Hugu
[Hoje às 02:00]


Encomenda Colectiva N3-2016[@Mouser - Aberta a pedidos!] por Hugu
[Hoje às 01:53]


Printer 3D barata por xmatias
[Ontem às 03:56]


Servidor por almamater
[09 de Dezembro de 2016, 21:39]


mysql server error por andre_f_carvalho
[09 de Dezembro de 2016, 18:56]


Cortar plástico ABS por msr
[05 de Dezembro de 2016, 17:27]


MOVIDO: FPV Drone Racing? por metRo_
[05 de Dezembro de 2016, 10:49]


Módulo gsm por dio123
[04 de Dezembro de 2016, 23:06]


Procuro resistências 220 Ohm de 1% por brunus
[02 de Dezembro de 2016, 15:50]


Package de cond 10uF 35V smd? por KammutierSpule
[02 de Dezembro de 2016, 11:19]

Autor Tópico: Double Display 7 Segmentos  (Lida 2508 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline OxyGen

  • Mini Robot
  • *
  • Mensagens: 92
  • ET - UA
    • Curto.D ET Blog
Double Display 7 Segmentos
« em: 13 de Maio de 2010, 18:16 »
Boas a todos...

O meu projecto de hoje tinha o objectivo de implementar um contador de 2 dígitos usando 2 displays de 7 segmentos.

Eis o meu material:

- Condensador 100nF
- CI 74HC138N - Descodificador/multiplexer
- 2 displays 7 Segmentos
- 2 Transistores VN2222L

Para aumentar a rentabilidade das linhas do Arduino usei o multiplexer... para facilitar liguei o Y0 e o Y7 pois têm a combinação mais fácil.
Como o multiplexer tem as saídas negadas tive de as ligar ao ground dos displays, ou seja os displays só funcionam quando Y0 e Y7 estão a zero.

Esquema eléctrico não coloco aqui porque também não fiz nenhum... Fiz tudo de cabeça lol...

Problema: Apenas imprime em um display de cada vez. Ajudem a melhorar o código!

Vídeo: (Conta até 99)

Double Display Count Small | Large


Código:

Código: [Seleccione]
int Selects = 13; // A B C Selects
int EnAB = 12; // Enables G2A G2B
int G1 = 11; // Enable G1

// Pinos para os displays 10,9,8,7,6,5,4,3

unsigned int cont = 0;

// Pinos
int todos[]={10,9,8,7,6,5,4,3};

void setup()
{
  pinMode(Selects,OUTPUT);
  pinMode(EnAB,OUTPUT);
  pinMode(G1,OUTPUT);

  for(int i=0; i<sizeof(todos);i++)
  {
    pinMode(todos[i],OUTPUT);
  }
}


void loop() // Melhorar este loop para que imprima um valor constante enquanto o contador nao mudar
{
  lesssig(cont);
  delay(500);
  moresig(cont);
  delay(500);
  if(cont<99)
  cont++;
  else
  cont=0; 
}

void lesssig(unsigned int num)
{
  // Escrita no display menos significativo 
  unsigned int right;
  unsigned int conv;
  right = num%10;
 
  switch(right)
  {
  case 0:
    {
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(3,LOW);
        break;
    }
  case 1:
    {
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(10,LOW);
        digitalWrite(9,LOW);
        digitalWrite(7,LOW);
        digitalWrite(5,LOW);
        digitalWrite(4,LOW);
        digitalWrite(3,LOW);
        break;
    }
  case 2:
    {
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(4,LOW);
        digitalWrite(8,LOW);
        break;
    }
    case 3:
    {
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(4,LOW);
        digitalWrite(10,LOW);
        break;
    }
    case 4:
    {   
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(5,LOW);
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        break;
    }
    case 5:
    {
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(6,LOW);
        digitalWrite(10,LOW);
        break;
    }
    case 6:
    {
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(6,LOW);
        digitalWrite(10,HIGH);
        break;
    }
    case 7:
    {
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(4,LOW);
        digitalWrite(3,LOW);
        digitalWrite(10,LOW);
        digitalWrite(9,LOW);
        break;
    }
    case 8:
    {
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(6,HIGH);
        digitalWrite(10,HIGH);
        break;
    }
    case 9:
    {
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(6,HIGH);
        digitalWrite(10,LOW);
        break;
    }
    default:
    {   
        digitalWrite(Selects,LOW);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(7,HIGH);
    }
  }
}

void moresig(unsigned int num)
{
  // Escrita no display mais significativo
  digitalWrite(Selects,HIGH);
  digitalWrite(EnAB,LOW);
  digitalWrite(G1,HIGH);

  unsigned int left;
  unsigned int div;
  div=cont/10;
  switch(div)
  {
    case 0:
    {
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(3,LOW);
        break;
    }
  case 1:
    {
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(10,LOW);
        digitalWrite(9,LOW);
        digitalWrite(7,LOW);
        digitalWrite(5,LOW);
        digitalWrite(4,LOW);
        digitalWrite(3,LOW);
        break;
    }
  case 2:
    {
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(4,LOW);
        digitalWrite(8,LOW);
        break;
    }
    case 3:
    {
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(4,LOW);
        digitalWrite(10,LOW);
        break;
    }
    case 4:
    {   
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(5,LOW);
        digitalWrite(9,LOW);
        digitalWrite(10,LOW);
        break;
    }
    case 5:
    {
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(6,LOW);
        digitalWrite(10,LOW);
        break;
    }
    case 6:
    {
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(6,LOW);
        digitalWrite(10,HIGH);
        break;
    }
    case 7:
    {
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(6,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(4,LOW);
        digitalWrite(3,LOW);
        digitalWrite(10,LOW);
        digitalWrite(9,LOW);
        break;
    }
    case 8:
    {
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(6,HIGH);
        digitalWrite(10,HIGH);
        break;
    }
    case 9:
    {
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(5,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(3,HIGH);
        digitalWrite(8,HIGH);
        digitalWrite(9,HIGH);
        digitalWrite(10,HIGH);
        digitalWrite(7,LOW);
        digitalWrite(6,HIGH);
        digitalWrite(10,LOW);
        break;
    }
    default:
    {   
        digitalWrite(Selects,HIGH);
        digitalWrite(EnAB,LOW);
        digitalWrite(G1,HIGH);
        digitalWrite(7,HIGH);
    }
  }
}
OxyGen #

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 8.990
  • Helpdesk do sitio
Re: Double Display 7 Segmentos
« Responder #1 em: 13 de Maio de 2010, 18:49 »
Retira os delays entre os lesssing e o moresig, estás a fazer multiplexing por software, logo com um delay de meio segundo é normal que seja tão lento que consegues ver que só está um display acesso de cada vez, retira o delay, assim os dois displays são actualizados muito mais vezes por segundo e assim parecem que estão os dois ligados ao mesmo tempo
Avr fanboy

Offline OxyGen

  • Mini Robot
  • *
  • Mensagens: 92
  • ET - UA
    • Curto.D ET Blog
Re: Double Display 7 Segmentos
« Responder #2 em: 13 de Maio de 2010, 19:12 »
Aí é que está... estou a fazer um multiplexing por hadware... tenho la o HC138 como multiplexer... se retirar os delays entre as 2 funções não vejo os numeros a passar... so vejo oitos... fica tudo muito rápido xD...
OxyGen #

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 8.990
  • Helpdesk do sitio
Re: Double Display 7 Segmentos
« Responder #3 em: 13 de Maio de 2010, 19:57 »
Porque tu estás a controlar a mulplexagem no enorme ciclo de cases e não fora deles, podias tornar o teu código muito mais pequeno se metesses os numeros num array.
Avr fanboy

Offline OxyGen

  • Mini Robot
  • *
  • Mensagens: 92
  • ET - UA
    • Curto.D ET Blog
Re: Double Display 7 Segmentos
« Responder #4 em: 13 de Maio de 2010, 20:34 »
tenho um ciclo de cases para cada display... entao como é que posso controlar fora do ciclo de cases?
OxyGen #

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.627
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Double Display 7 Segmentos
« Responder #5 em: 13 de Maio de 2010, 20:51 »
Então e se mudares a velocidade entre a mudança de cada display?

Offline OxyGen

  • Mini Robot
  • *
  • Mensagens: 92
  • ET - UA
    • Curto.D ET Blog
Re: Double Display 7 Segmentos
« Responder #6 em: 13 de Maio de 2010, 21:27 »
pois... mas isso não iria funcionar... o ideal seria incrementar o contador a cada segundo. ora isso mesmo... vou usar os timers...
OxyGen #

Offline microbyte

  • Mini Robot
  • *
  • Mensagens: 1.322
    • http://ricardo-dias.com/
Re: Double Display 7 Segmentos
« Responder #7 em: 14 de Maio de 2010, 08:52 »
Tipo...
Em vez de alternares entre os 2 displays em 500 ms 2 cada um, tenta alternar em 100ms cada um e inicia um contador até 10 para mudar de número.

Quem diz 100ms, diz 10ms e contas até 100. O efeito é muito melhor.

Offline OxyGen

  • Mini Robot
  • *
  • Mensagens: 92
  • ET - UA
    • Curto.D ET Blog
Re: Double Display 7 Segmentos
« Responder #8 em: 14 de Maio de 2010, 09:34 »
vou experimentar e logo digo...
OxyGen #

Offline squallfxx

  • Mini Robot
  • *
  • Mensagens: 7
Re: Double Display 7 Segmentos
« Responder #9 em: 14 de Maio de 2010, 22:47 »
Como já foi dito, o problema parece-me estar na frequência com que os displays alternam... se alterares o tempo com que eles alternam não irás interferir na contagem.
Como deves saber, quando temos + de um display a funcionar, eles parecem estar sempre ligados, mas na verdade não estão. Apenas trabalha um de cada x.. só tens de aumentar esta velocidade até que baralhe o nosso cérebro :p

Depois actualiza a situação

Offline OxyGen

  • Mini Robot
  • *
  • Mensagens: 92
  • ET - UA
    • Curto.D ET Blog
Re: Double Display 7 Segmentos
« Responder #10 em: 14 de Maio de 2010, 23:39 »
Como ja tinha partido para outro projecto vou montar tudo novamente amanha e vou tentar aplicar cada uma das soluções apresentadas... Em relação ao último post, eu sei que os displays funcionam um de cada vez... Testei o tempo limite de intervalo até que os nossos olhos não vissem mesmo as transições: com 60 ms já não se vêm as transiçoes.... com 100 ms dá dores de cabeça só de olhar... xD
OxyGen #