Estoy tratando de construir un termómetro muy simple usando registros de cambio, LED de 7 segmentos y un LM35. La idea del proyecto es aprender más sobre los registros de turnos y cómo usarlos. Lo que he hecho hasta ahora es este lío:
Esmuybásico,375HC595Ncon3LEDde7segmentosyunLM35.EstoyusandoestecódigoparacontrolarlosLEDyobtenerlainformacióndelsensor:
/***DigitalThermometer**Acoolandsimpledigitalthermometerusing:*-3x74HC595shiftregisters*-3xCommonanode7-segmentdisplays*-1xLM35analogthermometer*-22x1kresistors**@authorNathanCampos<[email protected]>*@version1.0*//***LEDArrayBitsandpins.*D*ABCPDEFG*11101111*/constinttemp=A0;constintdata=2;constintlatch=3;constintclock=4;constintclr=-1;/***Arduinosetup.*/voidsetup(){Serial.begin(9600);pinMode(data,OUTPUT);pinMode(latch,OUTPUT);pinMode(clock,OUTPUT);if(clr!=-1){pinMode(clr,OUTPUT);}}/***CleartheShiftRegister.*/voidshift_clear(){if(clr!=-1){//Theclearpinisset.digitalWrite(latch,LOW);digitalWrite(clr,LOW);digitalWrite(clr,HIGH);digitalWrite(latch,HIGH);}else{//shiftallthezeros.}}/***ShiftsomedataintotheShiftRegister.**@paramshift1Bytestoshiftintothefirstshiftregister.*@paramshift2Bytestoshiftintothesecondshiftregister.*@paramshift3Bytestoshiftintothethirdshiftregister.*/voidshift_write(byteshift1,byteshift2,byteshift3){digitalWrite(latch,LOW);//PullLOWtostartsendingdata.shiftOut(data,clock,LSBFIRST,shift3);shiftOut(data,clock,LSBFIRST,shift2);shiftOut(data,clock,LSBFIRST,shift1);digitalWrite(latch,HIGH);//PullHIGHtostopsendingdata.}/***Getthebitstolightadigitinthe7-segmentdisplay.**@paramdigitAnumericcharacter.*@paramlight_decimalWanttolightthedecimalcharacter?*@returnTheshiftregisterbytetolightadigit.*/bytelight_digit(unsignedintdigit,boollight_decimal){bytelight=B00000000;//Buildthebinaryfortheshiftregister.switch(digit){case0:light=B11101110;break;case1:light=B01100000;break;case2:light=B11001101;break;case3:light=B11101001;break;case4:light=B01100011;break;case5:light=B10101011;break;case6:light=B10101111;break;case7:light=B11100000;break;case8:light=B11101111;break;case9:light=B11100011;break;default://Lookslikeweshouldreturna"E" of Error.
light = B10001111;
break;
}
if (light_decimal) {
// Looks like we need some decimal action going.
light = light | B00010000;
}
return light;
}
/**
* Get a digit at a specified position from a integer.
*
* @param number The number to be divided.
* @param digit Which digit to be get.
* @return The digit.
*/
unsigned int get_digit(unsigned int number, unsigned int digit) {
static int powers[] = { 1, 10, 100 };
if (number <= 999) {
return (number / powers[digit]) % 10; // The digit.
} else {
return 10; // Just so we'll get a Error digit.
}
}
/**
* Light a 3 digits number.
*
* @param number The number to be shown.
*/
void light_number(unsigned int number) {
// Get each number.
byte first = light_digit(get_digit(number, 2), false);
byte second = light_digit(get_digit(number, 1), true);
byte third = light_digit(get_digit(number, 0), false);
// Shift the registers.
shift_write(first, second, third);
}
/**
* Check for the temperature and return a integer for the LEDs.
*
* @return Integer for the LEDs.
*/
unsigned int check_temperature() {
delay(20);
int reading = analogRead(temp);
float voltage = reading * (5.0 / 1023);
float celcius = (voltage - 0.5) * 100;
Serial.println(voltage);
//Serial.print(celcius);
//Serial.println(" C");
return celcius * 10;
}
/**
* Arduino main loop.
*/
void loop() {
//check_temperature();
light_number(check_temperature());
delay(2000);
}
El problema es que las lecturas del monitor serial de Arduino son "incorrectas" ya que la temperatura de la habitación es ~ 23C:
0,85 - 0,74 - 0,73 - 0,78 - 0,80 - 0,72 - 0,71 - 0,81 - 0,61 - 0,61 - 0,71 - 0,81 - 0,79 - 0,69 - 0,74 - 0,78 - 0,80 - 0,77 - 0,74 - 0,78 - 0,80 - 0,71 - 0,67 - 0,71 - 0,71 - 0.67 - 0.71 - 0.67
Cuando mido el voltaje entre el pin de tierra y el pin de salida, obtengo la salida correcta para la temperatura actual (0.23):
Simedíelvoltajeentrelatierrayelpin+Vsobtengo3.84V:
Dado que este es un proyecto de aprendizaje, me encantaría saber por qué sucede esto y cómo corregirlo. Creo que el problema podría estar relacionado con la energía que usa la matriz de LED, si es necesario, puedo usar una fuente de alimentación externa de 5V y dejar que el Arduino se alimente solo con el sensor.