arduino y siete segmentos con dos dígitos

3

Intenté hacer un sistema de detección utilizando 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):

ytratédehaceresteprogramaperonofuncionó:

intanalogPin=3;//potentiometerwiper(middleterminal)connectedtoanalogpin3//outsideleadstogroundand+5Vintval=0;//variabletostorethevaluereadbyteseven_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};voidsetup(){Serial.begin(9600);//setupserialpinMode(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);}voidloop(){val=analogRead(analogPin);//readtheinputpinfloattemp=val*5;//calculatingthevoltagetemp/=1024;//calculatingthevoltagetemp=(temp)*100;//as1V/100cintpin=0;//forfirstsevensegmentpins0,1,2,3,4,5,6isconnectedwitha,b,c,d,e,s,gintpin1=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 arrastre: 1- pin 0 y pin 1 siempre alto. 2- cuando calculo la temperatura de convertir el número devuelto a voltio, luego a la temperatura normal, tuve una respuesta incorrecta como la que veo en el monitor y el número de la pantalla también es incorrecto, el número que aparece no se corresponde incluso con

cuando veo la salida de LM35 usando un medidor de voltaje, veo 0.3 [v] que es sensible porque es verano y la temperatura es aproximadamente 30 aquí en el Medio Oriente.

este video grabador en vivo (disculpe mi mal inglés) para explicar más: enlace

y espero que alguien pueda explicar sobre "compensación" que este enlace hable sobre.

    
pregunta yahya tawil

1 respuesta

5

Adivina cuál es el problema al que te enfrentas ya que 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ás usando números enteros, 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 varía de 0 a 1023 y no estableció el voltaje de referencia. Esto significa que la lectura 0 es igual a GND / 0V y la lectura 1023 es igual a + Vdd = 5V (varía aproximadamente con su fuente de alimentación, posiblemente siendo USB).

Diga que la tensión de suministro es de 5 V y que la tensión en el pin de entrada es de 0.7V. El analogRead(analogPin); devolverá 1024 × 0.7 / 5 = 143.

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

Luego divides este número por 1024, aquí es donde tu programa sale mal: 715/1024 = 0.689 pero estamos haciendo enteros y los enteros tienen números enteros Sólo y todos los números después del punto decimal serán cortados! Entonces temp es 0 en este punto. No importa cuánto multiplique el resultado de este punto, siempre será 0 .

Cambie int temp a float temp , eso debería resolver su problema. Le indica al compilador que no use 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);

Cambie a:

int tempH;//high number
tempH=int(temp/10);
int tempL; //low number
tempL=int(temp-tempH*10);
    
respondido por el jippie

Lea otras preguntas en las etiquetas