Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

domingo, 22 de julho de 2012

Comandando displays de LEDs com 74HC595 - parte II

Agora, vamos ver como foi feito o software para "domar" os displays. Para isso, criei uma library do Arduino e disponibilizei, free as usual, no Google Code, é só clicar.

É uma biblioteca baseada numa outra que fiz para LEDs RGB, que também está no GC e pode ser visualizada aqui. Para saber como criar uma lib, em português, clique . Já no idioma de sir Mick Jagger, clique .

Não se esqueça de renomear os arquivos da lib, retirando o número da versão do nome. Ou então baixe o arquivo .zip da última versão.

Aqui vai a interface da lib, devidamente comentada:


class LED8SegDisplay595
{

public:

// Constructor

//   int _displayCount: number of 8 segment displays to be managed

//   int _clockPin: number of Arduino port that´s connected the clock pin of the first 595 CI (CI pin 12)

//   int _latchPin: number of Arduino port that´s connected the latch pin of the first 595 CI (CI pin 11)

//   int _dataPin: number of Arduino port that´s connected the data pin of the first 595 CI (CI pin 14)

     LED8SegDisplay595(int _displayCount, int _clockPin, int _latchPin, int _dataPin);

//   set the corresponding display mask (from now on, it will be considered common cathod)

     void setDisplayMask(byte display);

//   clear display mask

     void clearDisplayMask(byte display);    

//   show error message Er.     

     void errorMessage(int millissecs);

//   write a value in the displays

     void write(byte value);

     void write(float value, int decimalPlaces);

     int debug;    //Indicates debug mode 

     byte displayMask[8]; //=  {B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000};       

     char buf[33];

     long errMilissecs;

   private:

     int displayCount;  //Number of LEDs to manage 

     int clockPin;  //Pin connected to Pin 11 of 74HC595 (Clock)

     int latchPin;  //Pin connected to Pin 12 of 74HC595 (Latch)

     int dataPin;   //Pin connected to Pin 14 of 74HC595 (Data)

     void shiftOut(byte dataOut);

};

O uso é muito simples, abaixo um exemplo "b-a-bá":


// Exemplo b-a-bá do display de oito segmentos.



#include <Arduino.h>

// inclui a lib

#include <LED8SegDisplay595.h>



// define o display: 2 é o número de displays, 12 é o pino clock do primeiro 595, que

// está ligado ao Arduino, 8 é o pino latch do mesmo CI e o 11 é o pino dados.

LED8SegDisplay595 ls(2,12,8,11);



void setup() {

}



void loop()

{

// dããããã... 

  ls.write(1);

  delay(1000);

  ls.write(2);

  delay(1000);

  ls.write(3.1,2);

  delay(1000);

}



O método mais importante é o write, em duas versões, uma para números inteiros, e uma para float, onde vc indica o número de casas decimais que o display irá mostrar. Nesse caso, se vc especificar mais casas do que cabe no display, ele vai limitar ao número de casas que couber. Em ambos os métodos, se vc fornecer um número que não caiba no display, ele vai mostrar a mensagem 'Er.' no display. Vamos agora analisar os outros métodos importantes:
// Construtor, já explicado.

LED8SegDisplay595(int _displayCount, int _clockPin, int _latchPin, int _dataPin);

// se vc tiver displays com catodo comum em vez de anodo comum, basta chamar 
// esse método para cada display com essa característica e a lib vai considerar
// isso. Claro que a ligação será diferente, vc terá que ligar o comum desses 
// displays ao positivo do seu circuito. Quanto quiser acionar um segmento,
// o display vai "aterrar" o pino correspondente, fazendo o display funcionar.

     void setDisplayMask(byte display);

// Desliga o indicador de catodo comum
     void clearDisplayMask(byte display);    

// Mostra a mensagem "Er." durante millisecs milissegundos.

     void errorMessage(int millissecs);

// escreve um valor inteiro nos displays

     void write(byte value);

// escreve um valor float nos displays, com decimalPlaces casas decimais.
     

     void write(float value, int decimalPlaces);

Abaixo, um vídeo demostrando as várias features funcionando, para melhor entendimento do potencial do uso da lib.
Se vc montar o circuito com o sensor de temperatura indicado na segunda montagem da parte I desse post, o demo vai funcionar totalmente. Porém, se vc só ligar dois displays, sem sensor nem campainha o circuito vai funcionar da mesma forma, sem a rotina de mostrar a temperatura.

As funcionalidades são as seguintes:


  // escreve alguns números inteiros no display

  writeSomeNumbers();

  // faz uma contagem regressiva de 100 até 0, em décimos de segundo  

  reverseCounter();

  // escreve alguns números como se o display fosse catodo (+) comum. Como o display é anodo comum,

  // os números aparecem "negativos", quer dizer, vc lê o número na parte apagada do display

  reverseNumbers();

  //  escreve alguns números com ponto decimal

  writeFloat();

  // exibe a mensagem de erro.

  errorMessageOverflow();

  //  inicia a rotina de medir temperatura. Fica nela até que o circuito seja resetado ou desligado.

  temperatureAlarm();



É isso, galera. Uma limitação? A lib por enquanto só trabalha com números positivos. Alguém se habilita a "pegar daí"?

Abracadabraço!