sábado, 26 de novembro de 2016

Display 7 segmentos com Arduino

O display de 7 segmentos


fonte: próprio autor

Esse display possibilita que seja escrito números decimais de 0 a 9, além de outros símbolos comumente utilizados como sinais ou letras.


entre as tecnologias de fabricação existentes para fabricação desses componentes, o mais comum é o display a LED, onde cada segmento é composto por um LED e dividi-se em dois tipos denominados catodo comum e anodo comum.


Como o próprio nome diz, o display catodo comum é aquele que possui todos os catodos dos LEDs interligados, em comum, onde para o acionamento (acender), é necessário aplicar o nível lógico 1 no anodo. No anodo comum todos os anodos dos LEDs estão interligados, sendo necessário o nível lógico 0 para ser acionado.
Então para fazer funcionar alguns comando com Arduino basta acionar um led por saída do e combinar os acionamentos.


fonte: www.physics.udel.edu

Vamos precisar para esse simples tutorial:

1 Arduino Uno (ou compatível)
1 Display 7 segmentos
8 resistores de 220 ohms
1 resistor de 330 ohm
1 resistor de 10 k
1 chave pushbutton
1 protoboard
fios jumpers

Projeto 1 

Na primeira montagem vai ser demonstrado led a led acionando no display, testando as saídas digitais dos pinos 2 a 9.
*Atenção: em todos os projetos os estados altos (HIGH) ou baixos (LOW), vai depender do tipo de display que foi escolhido, catodo ou anodo em comum, alterações em algumas linhas dos códigos podem ser necessárias.


fonte: próprio autor

Utilize o código fonte para testar o programa, lembre-se de que a escolha do display anodo comum ou catodo comum fica conforme a disponibilidade do usuário, atentando-se sempre para a ligação.

/*-----------------------------------------------------------------------
Display LED 7 segmentos
Teste das portas
baseado no original de Just4Fun Media
*************************************************************************
www.mecatronizando.com.br
**************************************************************************
 */
void setup() {
 
for(int x = 2; x < 10; x++) {
  pinMode(x,OUTPUT);
}
}

void loop() {
 
for(int x = 2; x < 10; x++) {
  digitalWrite(x,HIGH);
  delay(1000);
  digitalWrite(x, LOW);
}
for(int x = 2; x < 10; x++) {
  digitalWrite(x,HIGH);
}
delay(1000);
for(int x = 2; x < 10; x++) {
  digitalWrite(x,LOW);
}
}

Projeto 2

Utilizando a mesma montagem do projeto anterior, carregue o código para ver valores crescentes de 0 a 9 no display.


fonte: próprio autor

/*-----------------------------------------------------------------------
Display LED 7 segmentos
Ciclo numerico 0-9
por Tony Emerson Marim 26/11/2016

**************************************************************************
www.mecatronizando.com.br
**************************************************************************
 */
void setup() {
  // put your setup code here, to run once:
for(int x = 2; x < 10; x++) {
  pinMode(x,OUTPUT);
}
}

void loop() {
  // put your main code here, to run repeatedly:
  //ZERO
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    delay(1000);
  //UM
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    delay(1000);
  //DOIS
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //TRES
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //QUATRO
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //CINCO
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //SEIS
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //SETE
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    delay(1000);
   //OITO
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //NOVE
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    delay(1000);
  //"DEZ"
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
  }


Projeto 3

O próximo projeto faz uma integração do usuário com o display por meio do monitor serial do Arduino. O numero digital no teclado é exibido no display.
As ligações do circuito permanecem as mesmas anteriores.


/*-----------------------------------------------------------------------
Teste display 7 segmentos serial
Interface com monitor serial
baseado no original de Just4Fun Media
por Tony Emerson Marim 26/11/2016
*************************************************************************
www.mecatronizando.com.br
**************************************************************************
 */

void setup() {
  // put your setup code here, to run once:
  for(int x = 2; x < 10; x++) {
  pinMode(x,OUTPUT);
  Serial.begin(9600);
  while (!Serial) {
  ; // wait for serial port to connect. Needed for native USB port only
  }
  
}
}

void loop() {
  
  if (Serial.available()) {
    char Num = (Serial.read());
  switch (Num) {
    case '0':
      digitalWrite(2, HIGH);
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      Serial.write(Num);
      break;
  
  case '1':
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '2':
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '3':
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '4':
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '5':
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '6':
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '7':
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '8':
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
  
  case '9':
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
    
  default:
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    Serial.write(Num);
    break;
    
  }
  }
}


Projeto 4

Nesse quarto e último projeto, o display vai exibir números de 0 a 9 em ordem crescente. Conforme a necessidade do usuário um botão tipo pushbutton deve ser adotado e a velocidade de troca dos valores dos números exibidos dependem do toque no botão.
Nesse circuito vamos mudar as ligações em relação aos últimos circuitos e criar um esquema mais "enxuto". Basta seguir o desenho abaixo e copiar e colar o código na IDE do seu Arduino.


fonte: próprio autor

/*-----------------------------------------------------------------------
Teste display 7 segmentos com botão
por Tony Emerson Marim 26/11/2016
*************************************************************************
www.mecatronizando.com.br
**************************************************************************
 */

byte numbers[10] = {
B11111100, B01100000, B11011010, B11110010, B01100110,
B10110110, B10111110, B11100000, B11111110, B11100110};

void setup() {
for(int i = 2; i <= 8; i++) {
pinMode(i, OUTPUT);
}
pinMode(9, INPUT);
}
 
int counter = 0;
bool botao = true;
int valor_saida = LOW;
 
void loop() {
if(botao) {
int botao_saida = digitalRead(9);
if(valor_saida == LOW && botao_saida == HIGH) {
counter = (counter + 1) % 10;
}
valor_saida = botao_saida;
} else {
delay(1000);
counter = (counter + 1) % 10;
}
writeNumber(counter);
}
 
void writeNumber(int number) {
if(number < 0 || number > 9) {
return;
}
byte mask = numbers[number];
byte currentPinMask = B10000000;
for(int i = 2; i <= 8; i++) {
if(mask & currentPinMask) digitalWrite(i,HIGH);
else digitalWrite(i,LOW);
currentPinMask = currentPinMask >> 1;
  }
}

No vídeo abaixo é possível ver todos os projetos da página funcionando conforme os passos apresentados. Caso seja necessário, todos os arquivos podem ser baixados por esse LINK.




Gostou?
Curta nossa página no Facebook!
Assine o nosso canal no Youtube, curta e compartilhe para podermos estar sempre trazendo um pouco de programação.

Bons Estudos!




Referências:
Elementos de eletrônica digital
Capuano, Francisco Gabriel/ Idoeta, Ivan Valeije

Nenhum comentário:

Postar um comentário