Publicidade:

quarta-feira, 22 de julho de 2015

Arduino - Voltímetro com Display de 7 Segmentos

No post anterior (aqui) falei sobre como mostrar números com casas decimais em displays de 7 segmentos. Aproveitando esse mesmo exemplo, fiz um voltímetro, onde é possível ler a tensão de uma fonte externa e mostrar seu valor nos displays.

Vídeo:



código-fonte:

/************************************************************************************************************
**********************************display de 7 segmentos*****************************************************
************************************************************************************************************/
const int  d7seg_pin_segments[] = {6,7,8,9,10,11,12,13};   //pinos para os segmentos:  --> a b c d e f g .
const int  d7seg_pin_enable[]   = {2,3,4,5};               //pinos para habilitar os displays
const byte d7seg_digits[]       = {B11111100, B01100000, B11011010, B11110010, B01100110, 
                                   B10110110, B10111110, B11100000, B11111110, B11110110};  //Babcdefg.  0--9

void d7seg_write(int digit, int pos, boolean point=false) {
  digitalWrite(d7seg_pin_enable[pos], HIGH);
  for(int i=0;i<7;i++) { digitalWrite(d7seg_pin_segments[i],   d7seg_digits[digit] & (1 << (7-i))    ); }
  digitalWrite(d7seg_pin_segments[7], point);
  delay(1);  //alterar aqui pro valor mais adequado
  digitalWrite(d7seg_pin_enable[pos], LOW);
}

void d7seg_write_number(float f, int decimals=0) {
  f = (f+0.000001) * pow(10, decimals);
  for(int i=0; i<sizeof(d7seg_pin_enable)/sizeof(int); i++) {  
    d7seg_write( (unsigned int)(f/pow(10, i)) % 10, i,  (i!=0)&&(decimals==i) );  
  }
}
/************************************************************************************************************
**********************************fim display de 7 segmentos*************************************************
************************************************************************************************************/

/************************************************************************************************************
**********************************voltimetro*****************************************************************
************************************************************************************************************/
const unsigned long r1   = 1000000;  //resistor de 1M
const unsigned long r2   = 100000;   //resistor de 100K
const unsigned int  aRef = 5;        //referencia de 5v
float               tensao = 0;      //tensao lida
unsigned long       millis_ref = 0;
const unsigned long time_refresh = 500; //faz nova leitura a cada 500 ms

float get_voltage(int pin){
  return (analogRead(pin) * aRef) / 1023.0 * ( (r1+r2)/r2 );
}

void show_voltage(){
  if ( (millis()-millis_ref) > time_refresh ) { //intervalo de tempo pra atualizar a leitura. 
    tensao = get_voltage(A0); //calculo da tensão lida
    millis_ref = millis();
  }
  float f = tensao;
  d7seg_write_number(f, f>=1000 ? 0 : (f>=100 ? 1 : (f>=10 ? 2 : 3) ) );  //de acordo com o numero, mostra 0, 1, 2 ou 3 casas decimais
}
/************************************************************************************************************
**********************************fim voltimetro*************************************************************
************************************************************************************************************/

/************************************************************************************************************
**********************************setup/loop*****************************************************************
************************************************************************************************************/
void setup(){
  for(int i=2; i<=13; i++) { pinMode(i, OUTPUT); }
}  

void loop() {
  show_voltage();
}

/************************************************************************************************************
**********************************fim setup/loop*************************************************************
************************************************************************************************************/




Referência: http://br-arduino.org/2015/06/voltimetro-com-arduino-como-montar-programar-e-calibrar.html

Nenhum comentário:

Postar um comentário