Library para led de 7-Segment (Library for 7-Segment LED)

(english version below)

Reanalisando o código utilizado para programar os LEDs de 7-Segmentos, verifiquei que não é muito simples, além de deixar o código um pouco bagunçado.

Sendo assim resolvi construir uma biblioteca para facilitar a programação do componente.

Construi duas bibliotecas: uma para controlar o LED sem o uso de Shift Register e outra para quem utiliza o Shift register.

Por enquanto vou descrever a biblioteca que trata sem o uso de shift register, posteriormente em outro post falarei sobre a outra biblioteca.

1. Biblioteca sem o uso do Shift Register (ligação direta nos pinos do Arduino)

Você pode baixar aqui: https://github.com/oleomachado/LM7SegDirect.

Descompacte o arquivo e siga as instruções no arquivo Installation.txt

Um exemplo utilização (no arquivo ir em File/Examples/LM7SegDirect/ para encontrar exemplos)

#include <LM7SegDirect.h>

// Identifique os pinos que voce utilizou.
// Aqui está na sequencia dos segmentos. Os 7 primeiros parametros identificam cada 
// LED de um digito (de A até G)
// O proximo parametro identifica o ponto decimal (.)
// O último parametro indica se é um LED Anodo Comum (true) ou Catodo Comoum (false)

LM7SegDirect disp(2, 3, 4, 5, 6, 7, 8, 9, true);

byte currentValue = 0;
int currentMillis = 0;
int digitQty = 1;   // *** Informe aqui a quantidade de digitos que seu led possui

void setup() {

   // Informe aqui os pinos para cada digito do LED de 7-Segmentos
   // O LED 7-Segmentos de apenas um digito não controla nenhum pino extra, sendo assim
   // deve-se passar 0 para cada digito
   disp.defineDigits(digitQty, 0, 0, 0, 0);
}

void loop() {
  disp.valueWrite(currentValue); 

  //---------------------------------------------------------------------------
  // Para cada digito que existir no componente, um tempo de 5ms é gasto para
  // mostrá-lo. Sendo assim, podemos usar esta informação para calcular 1 
  // segundo e fazer a contagem
  currentMillis = currentMillis + (5 * digitQty);

  if (currentMillis > 1000)
  {
    currentValue++;
    currentMillis = 0;
  }

  if (currentValue > 9)
    currentValue = 0;
}

Veja que agora basta instanciar a classe LM7SegDirect e usá-la para acionar o led. Repare que na criação da instância, todos os pinos dos segmentos devem ser informados, bem como se o LED é do tipo anodo comum ou catodo comum.

Voce pode controlar LEDs do tipo Anodo Comum ou Catodo Comum, porem eu só testei o Anodo Comum pois não tenho LEDs Catodo Comum.

Posteriormente, na função Setup, deve ser definido a pinagem de cada dígito do LED de acordo com o datasheet de cada componente.  Para o LED de apenas 1 digito, informe zero pois este tipo de led não possui controle de pinagem de digito.

Se voce for usar um de 4 digitos, basta alterar  a variável digitQty para 4 e indicar os pinos de cada digito na função defineDigits.

 

(ENGLISH)

 

Looking at the code used to control 7-Segment LEDs, I have the idea to write a library to make it easier.

I build two libraries: one to control the component with Shift Register and another to control it without  Shift register.

For now I will show the library without the need of shift register.

You can download the library here: https://github.com/oleomachado/LM7SegDirect.

Unzip and follow instructions in the file Installation.txt

Now I will show a little example of how to use it (more examples in File/Examples/LM7SegDirect/ in arduino IDE)

#include <LM7SegDirect.h>

// Identify the pins you used
// The call to LM7SegDirect receive as parameters all pins for each segment of the
// LED and the last one is a flag for the type of LED 
// Common Anode (true) or Common Cathode (false)

LM7SegDirect disp(2, 3, 4, 5, 6, 7, 8, 9, true);

byte currentValue = 0;
int currentMillis = 0;
int digitQty = 1;   // *** How many digits are in the 7-Segment

void setup() {

   // Inform the pins for each digit in the 7-Segment
   // If only one digit then inform zeroes
   disp.defineDigits(digitQty, 0, 0, 0, 0);
}

void loop() {
  disp.valueWrite(currentValue); 

  //---------------------------------------------------------------------------
  // For each digit 5 ms are spent to show, so if you multiply the quantity of
  // digits for 5 you have the amount of time ellapsed in the call
  currentMillis = currentMillis + (5 * digitQty);

  if (currentMillis > 1000)
  {
    currentValue++;
    currentMillis = 0;
  }

  if (currentValue > 9)
    currentValue = 0;
}

As you can see, now you just need to create an instance of  LM7SegDirect and use it to control the led.

You can control common anode or common cathode leds here, but I just have tested it with common Anode (I dont have common cathodes).

In the Setup function, you must call defineDigits and pass each digit pin number as in datasheet.  For LEDs with only 1 digit pass zeroes as this kind of LED dont have pins to choose digits.

In the example, if you want to control a 4 digit led, you just need to change  digitQty to  4 and pass the correct pins to  defineDigits.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s