Termómetro numérico com LEDs

Um dos circuitos que queria fazer com o Arduino era um termómetro digital usando para isso segmentos de LEDs. Para além dos segmentos e do sensor de temperatura LM335, é necessário dois circuitos integrados 74HC595 (shift registers). Estes circuitos recebem um número entre 0 e 255 e de acordo com este número, coloca nas portas de saída um valor alto ou baixo de forma equivalente ao número binário. Para mais informação ver a página “Serial to Parallel Shifting-Out with a 74HC595” já que foram estes os esquemas base em conjunto com partes do circuito sensor de temperatura já apresentado anteriormente.

 

image

 

No entanto, eu pretendia que este circuito na medida do possível fosse portátil, isto é, desligar da porta USB do computador. O que acontecia era que quando alimentado por uma pilha de 9V, os valores apresentados pelos segmentos de LEDs começavam a variar de forma descontrolada e sem nexo. Ainda não percebi qual era o problema e acabei por colocar também uma resistência variável no LM335 para calibrar o valor mas não surtiu efeito.

 

Sketch

/*
 * Termometro digital com segmentos de LEDs
 *
 * 20101227 Luis Sismeiro
 */

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

int numberCode[] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111};

int readA2;
int temperatura;

void setup() {
 pinMode(latchPin, OUTPUT);
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
 Serial.begin(9600);
 Serial.flush();
}

void loop() {
 int uni;
 int dec;

 digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, 0);
 shiftOut(dataPin, clockPin, MSBFIRST, 0);
 digitalWrite(latchPin, HIGH);

 /* obtencao e calculo da temperatura */
 readA2 = analogRead(A2);
 temperatura = int((0.4883 * readA2) - 273.15);
 Serial.println(temperatura);

 if (temperatura < 10) {
 digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, numberCode[temperatura]);
 shiftOut(dataPin, clockPin, MSBFIRST, 0);
 digitalWrite(latchPin, HIGH);
 }
 else if (temperatura >= 10) {
 uni = int(temperatura % 10);
 dec = int(temperatura / 10);
 digitalWrite(latchPin, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST, numberCode[dec]);
 shiftOut(dataPin, clockPin, MSBFIRST, numberCode[uni]);
 digitalWrite(latchPin, HIGH);
 }
 delay(2000);
}

Etiquetas: ,

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s


%d bloggers like this: