fbpixel
Etiquetas: ,
5
(2)

Para obter informações do Arduino sem precisar ligá-lo a um computador, é comum utilizar interfaces como o display de 4×7 segmentos. Veremos neste tutorial como conectar e programar o Arduino para exibir informações no display.

É possível conectar o display de 7 segmentos diretamente aos pinos do Arduino. Para manter os pinos livres para outras funcionalidades, utilizamos um registrador de deslocamento 74HC595.

Material

  • Computador
  • Arduino UNO
  • Display de 4×7 segmentos
  • Registrador de deslocamento 74HC595
  • Cabo Dupont
  • Placa de ensaio (breadboard)

Princípio de funcionamento

O display de 7 segmentos consiste numa série de LEDs posicionados para formar números. Os LEDs são controlados por meio dos pinos do display (1 – 12).

Os conjuntos de LEDs ou dígitos são ativados através dos pinos D1, D2, D3 e D4. Os LEDs são acesos através dos pinos A, B, C, D, E, F e G, e DP para o ponto decimal.

Existem dois tipos de displays, com cátodo comum (série A para alto) ou com anodo comum (série B para baixo). Para a série com anodos, é necessário ligar o comum ao pino 5V para ativar o dígito e passar o pino para o estado BAIXO para acender um LED. No caso de um cátodo comum, é necessário ligar o comum à terra e mudar o pino para o estado ALTO para ligar o LED.

Verifique bem o modelo que tem em mãos. Neste tutorial, utilizamos o display de 4×7 segmentos 5461BS com anodo comum.

Esquema

Utilizamos um registrador de deslocamento 74HC595, cujas saídas Q0-6 e Q7 estão ligadas, respectivamente, às entradas A-F e DP do display,

Código

#define NUM_OF_DIGITS 4

int latch = 4; //74HC595  pin 9 STCP
int cs = 5; //74HC595  pin 10 SHCP
int data = 3; //74HC595  pin 8 DS
int dPins[4] = {11, 10, 9, 8};

//  DP G F E D C B A
//0: 1 1 0 0 0 0 0 0 0xc0
//1: 1 1 1 1 1 0 0 1 0xf9
//2: 1 0 1 0 0 1 0 0 0xa4
//3: 1 0 1 1 0 0 0 0 0xb0
//4: 1 0 0 1 1 0 0 1 0x99
//5: 1 0 0 1 0 0 1 0 0x92
//6: 1 0 0 0 0 0 1 0 0x82
//7: 1 1 1 1 1 0 0 0 0xf8
//8: 1 0 0 0 0 0 0 0 0x80
//9: 1 0 0 1 0 0 0 0 0x90
unsigned char table[] =
{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

void setup() {
  Serial.begin(115200);
  pinMode(latch, OUTPUT);
  pinMode(cs, OUTPUT);
  pinMode(data, OUTPUT);
  for (int j = 0; j < NUM_OF_DIGITS; j++) pinMode(dPins[j], OUTPUT);
}

void loop() {
  //Count from 0 to 9 on each digit
  for (int i = 0; i < NUM_OF_DIGITS; i++) {
    for (int j = 0; j < 10; j++) {
      Display(i, j);
      delay(500);
      Serial.println(j);
    }
    delay(500);
  }
}

void Display(int id, unsigned char num)
{
  digitalWrite(latch, LOW);
  shiftOut(data, cs, MSBFIRST, table[num]);
  digitalWrite(latch, HIGH);
  for (int j = 0; j < NUM_OF_DIGITS; j++) digitalWrite(dPins[j], LOW);
  digitalWrite(dPins[id], HIGH);
}

Uma vez carregado o código, o display deve contar de 0 a 9 em cada dígito.

Bônus: exibição em 4 dígitos

A fim de exibir um número com 4 dígitos, iremos converter este número em 4 dígitos da base 10 usando as seguintes instruções:

      number = k;
      for (int i = 0; i < NUM_OF_DIGITS; i++)
      {
        digit_data[i] = number % 10;
        number /= 10;
      }

Também utilizaremos a função millis() para assegurar que a exibição se atualize corretamente.

#define NUM_OF_DIGITS 4

int latch = 4; //74HC595  pin 9 STCP
int cs = 5; //74HC595  pin 10 SHCP
int data = 3; //74HC595  pin 8 DS

int dPins[4] = {11, 10, 9, 8};

//  DP G F E D C B A
//0: 1 1 0 0 0 0 0 0 0xc0
//1: 1 1 1 1 1 0 0 1 0xf9
//2: 1 0 1 0 0 1 0 0 0xa4
//3: 1 0 1 1 0 0 0 0 0xb0
//4: 1 0 0 1 1 0 0 1 0x99
//5: 1 0 0 1 0 0 1 0 0x92
//6: 1 0 0 0 0 0 1 0 0x82
//7: 1 1 1 1 1 0 0 0 0xf8
//8: 1 0 0 0 0 0 0 0 0x80
//9: 1 0 0 1 0 0 0 0 0x90
unsigned char table[] =
{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};


int digit_data[NUM_OF_DIGITS] = {0};

unsigned int number = 0;
unsigned long previousUpdate = 0, updateTime = 200;

void setup() {
  Serial.begin(115200);
  pinMode(latch, OUTPUT);
  pinMode(cs, OUTPUT);
  pinMode(data, OUTPUT);

  for (int j = 0; j < NUM_OF_DIGITS; j++) pinMode(dPins[j], OUTPUT);
}

void loop() {
  //Count from 0 to 999 on each digit
  unsigned int k = 0;
  while (k < 1000) {
    updateDigits();
    if (millis() - previousUpdate > updateTime) {
      k++;
      previousUpdate = millis();
      number = k;
      Serial.print(k); Serial.print(" (");
      for (int i = 0; i < NUM_OF_DIGITS; i++)
      {
        digit_data[i] = number % 10;
        number /= 10;
        Serial.print(digit_data[i]);
      }
      Serial.println(")");
    }
  }
}

void Display(int id, unsigned char num)
{
  digitalWrite(latch, LOW);
  shiftOut(data, cs, MSBFIRST, table[num]);
  digitalWrite(latch, HIGH);
  for (int j = 0; j < NUM_OF_DIGITS; j++) digitalWrite(dPins[j], LOW);
  digitalWrite(dPins[id], HIGH);
}

void updateDigits() {
  for (int j = 0; j < NUM_OF_DIGITS; j++)
  {
    Display(j, digit_data[j]);
    delay(5);
  }
}

O número deve aumentar a cada 200 milissegundos e ser afixado em todos os 4 dígitos.

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

How useful was this post?

Click on a star to rate it!

Average rating 5 / 5. Vote count: 2

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?