arduino y siete segmentos con dos dígitos

Traté de hacer un sistema de detección usando arduino UNO R3 con sensor LM35 y una unidad de visualización de siete segmentos con dos dígitos.

Hice todas las conexiones de la siguiente manera (sé que es Missy pero creo que el cableado es correcto):ingrese la descripción de la imagen aquí

e intenté hacer este programa pero no funcionó:

int analogPin = 3;     // potentiometer wiper (middle terminal) connected to analog pin 3
                       // outside leads to ground and +5V
int val = 0;           // variable to store the value read

byte seven_seg_digits[10][7] =                                                           
                                                            { 
                                                           { 1,1,1,1,1,1,0 },  // = 00
                                                           { 0,1,1,0,0,0,0 },  // = 01
                                                           { 1,1,0,1,1,0,1 },  // = 02
                                                           { 1,1,1,1,0,0,1 },  // = 03
                                                           { 0,1,1,0,0,1,1 },  // = 04
                                                           { 1,0,1,1,0,1,1 },  // = 05
                                                           { 1,0,1,1,1,1,1 },  // = 06
                                                           { 1,1,1,0,0,0,0 },  // = 07
                                                           { 1,1,1,1,1,1,1 },  // = 08
                                                           { 1,1,1,0,0,1,1 },   // = 09
                                                            };
    void setup()
{
  Serial.begin(9600);          //  setup serial
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT); 
  pinMode(2, OUTPUT);  
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);  
  pinMode(12, OUTPUT);  
  pinMode(13, OUTPUT);  

}

void loop()
{

  val = analogRead(analogPin);    // read the input pin
  float temp= val*5 ; //calculating the voltage
  temp /= 1024 ;    //calculating the voltage
  temp = (temp) * 100 ;// as 1V/100c
  int pin=0 ; //for first seven segment pins 0,1,2,3,4,5,6 is connected with a,b,c,d,e,s,g
  int pin1=7;
  Serial.println("temperature in C =");Serial.println(temp);             // debug value
  int tempL; //low number
  tempL=int(temp*10);
  int tempH;//high number
  tempH=int(temp/10);
  for(int j=0;j<7;j++) 
  {
    digitalWrite(pin,seven_seg_digits[tempL-1][j]);
  pin++;}
  for(int i=0;i<7;i++)
  {
   digitalWrite(pin1,seven_seg_digits[tempL-1][i]);
 pin1++;}
  delay(2000);
}

Tengo un problema de remolque: 1- pin 0 y pin 1 siempre altos. 2- cuando calculo la temperatura al convertir el número devuelto a voltios y luego a temperatura, tuve una respuesta incorrecta como veo en el monitor y el número de la pantalla también es incorrecto, el número que aparece no es real ni siquiera para

cuando veo la salida de LM35 usando un medidor de voltaje, veo 0.3 [v], lo cual es sensato porque es verano y la temperatura es de alrededor de 30 aquí en Medio Oriente.

este video lo grabe en vivo (disculpen mi mal ingles) para explicar mas : http://youtu.be/iQobAe4ie_8

y espero que alguien pueda explicar sobre la "compensación" de la que habla este enlace .

ingrese la descripción de la imagen aquí

Agregue lo que ve en el monitor.
@jippie temperatura en C = 109,37 temperatura en C = 101,07 temperatura en C = 118,65 temperatura en C = 116,21 temperatura en C = 115,23 temperatura en C = 104,49
¿Está seguro de que el programa en su pregunta anterior es el mismo que la versión que está ejecutando? ¿Qué valores esperas? Por favor agregue la respuesta a la pregunta inicial.
si claro es lo mismo
@jippie, lamento no haber copiado el código... el anterior es después de cambiar de int a float
Eso explica muchas cosas, OK. Gracias por esa aclaración.

Respuestas (1)

Adivinar cuál es el problema al que te enfrentas porque no das suficientes detalles.

int val = 0;
val = analogRead(analogPin);    // read the input pin
int temp= val*5 ; //calculating the voltage
temp /= 1024 ;    //calculating the voltage
temp = (temp) * 100 ;// as 1V/100c

Está utilizando matemáticas enteras, para Arduino esto significa que tanto val como temp son números enteros que van desde -32768 a +32767.

Leyó un valor de ADC, este valor oscila entre 0 y 1023 y no configuró el voltaje de referencia. Esto significa que leer 0 es igual a GND / 0V y leer 1023 es igual a +Vdd = 5V (aprox. varía con su fuente de alimentación, posiblemente sea USB).

Digamos que su voltaje de suministro es de 5V y el voltaje en el pin de entrada es de 0.7V. El analogRead(analogPin);devolverá 1024 × 0.7 / 5 = 143.

A continuación, multiplica ese número: 143 × 5 = 715, hasta ahora todo bien.

Luego divide este número por 1024, aquí es donde su programa falla: 715 / 1024 = 0.689 pero estamos haciendo cálculos de números enteros , y los números enteros solo contienen números enteros y todos los números después del punto decimal serán cortados. También lo tempes 0 en este punto. No importa cuánto multipliques el resultado a partir de este punto, siempre será 0.

Cambie int tempa float temp, eso debería resolver su problema. Le indica al compilador que no use números enteros, sino que use un número flotante en su lugar.

Aquí también hay un error:

int tempL; //low number
tempL=int(temp*10);
int tempH;//high number
tempH=int(temp/10);

cambiarlo a:

int tempH;//high number
tempH=int(temp/10);
int tempL; //low number
tempL=int(temp-tempH*10);