Go Down

Topic: problema con codigo para encender leds (Read 119 times) previous topic - next topic

jon94

Hola, estoy empezando en esto de la programación con arduino y tengo un problema con uno de mis primeros programas, quiero hacer un ``termómetro´´ con 9 leds, que dependiendo de la temperatura se vayan encendiendo o apagando, al ir subiendo la temperatura se van encendiendo los leds (cada grado 1 led) y al ir bajando se apagan. También da la temperatura al puerto de serie.
El problema es que los leds hacen lo que les da la gana, a veces se encienden unos cuantos, a veces todos, unas veces se encienden a medias otras se encienden del todo...
Dejo el codigo, que seguramente tenga algo mal (o todo)
Code: [Select]
int led []={13,12,11,10,9,8,7,6,5};
int TemPin=0;
int TemVal=0;

void setup(){
Serial.begin (9600);
pinMode(TemPin, INPUT);
pinMode (led, OUTPUT);
digitalWrite (led, OUTPUT);
}

void loop(){
//calculo de temperatura del LM35
TemVal=((5.0*analogRead(TemPin)*100)/1024);
delay(1000);
Serial.println (TemVal);

//que leds se encienden en funcion de la temperatura

if (TemVal>=26) digitalWrite (led [13],HIGH);
if (TemVal<26) digitalWrite (led [13],LOW);

if (TemVal>=25) digitalWrite (led [12],HIGH);
if (TemVal<25) digitalWrite (led [12],LOW);

if (TemVal>=24) digitalWrite (led [11],HIGH);
if (TemVal<24) digitalWrite (led [11],LOW);

if (TemVal>=23) digitalWrite (led [10],HIGH);
if (TemVal<23) digitalWrite (led [10],LOW);

if (TemVal>=22) digitalWrite (led [9],HIGH);
if (TemVal<22) digitalWrite (led [9],LOW);

if (TemVal>=21) digitalWrite (led [8],HIGH);
if (TemVal<21) digitalWrite (led [8],LOW);

if (TemVal>=20) digitalWrite (led [7],HIGH);
if (TemVal<20) digitalWrite (led [7],LOW);

if (TemVal>=19) digitalWrite (led [6],HIGH);
if (TemVal<19) digitalWrite (led [6],LOW);

if (TemVal>=18) digitalWrite (led [5],HIGH);
if (TemVal<18) digitalWrite (led [5],LOW);

}

_jose_

#1
Apr 19, 2018, 08:08 pm Last Edit: Apr 19, 2018, 08:10 pm by _jose_
de entrada tienes una confusion sobre el funcionamiento  de los arrays que confundes con el numero de pin.tienes un array de nueve elementos .los indices de un array  comienzan por 0 ,para acceder al pin 13 por ejempo ,que esta en la primera posicion :
Code: [Select]
led[0]
el pin 12:
Code: [Select]
led[1]
etc,etc,asi que repasa tambien como declaras en el setup  los pines como OUTPUT.por otro lado declaras el pin 0 como entrada (no se si has conectado ahi el sensor de temperatura),en muchos modelos de arduino los pines 0 y 1 son los usados por el serial monitor,no deberias usarlos.

jon94

de entrada tienes una confusion sobre el funcionamiento  de los arrays que confundes con el numero de pin.tienes un array de nueve elementos .los indices de un array  comienzan por 0 ,para acceder al pin 13 por ejempo ,que esta en la primera posicion :
Code: [Select]
led[0]
el pin 12:
Code: [Select]
led[1]
etc,etc,asi que repasa tambien como declaras en el setup  los pines como OUTPUT.por otro lado declaras el pin 0 como entrada (no se si has conectado ahi el sensor de temperatura),en muchos modelos de arduino los pines 0 y 1 son los usados por el serial monitor,no deberias usarlos.
gracias, era por el tema de los arrays que no funcionaba el programa, al final he accedido a los pines directamente y ya funciona.

Code: [Select]
int TemPin=0;
int TemVal=0;

void setup(){
 
Serial.begin (9600);
pinMode(TemPin, INPUT);
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(){
//calculo de temperatura del LM35
TemVal=((5.0*analogRead(TemPin)*100)/1024);
delay(1000);
Serial.println (TemVal);

//que leds se encienden en funcion de la temperatura

if (TemVal>=26) digitalWrite (13,HIGH);
if (TemVal<26) digitalWrite (13,LOW);

if (TemVal>=25) digitalWrite (12,HIGH);
if (TemVal<25) digitalWrite (12,LOW);

if (TemVal>=24) digitalWrite (11,HIGH);
if (TemVal<24) digitalWrite (11,LOW);

if (TemVal>=23) digitalWrite (10,HIGH);
if (TemVal<23) digitalWrite (10,LOW);

if (TemVal>=22) digitalWrite (9,HIGH);
if (TemVal<22) digitalWrite (9,LOW);

if (TemVal>=21) digitalWrite (8,HIGH);
if (TemVal<21) digitalWrite (8,LOW);

if (TemVal>=20) digitalWrite (7,HIGH);
if (TemVal<20) digitalWrite (7,LOW);

if (TemVal>=19) digitalWrite (6,HIGH);
if (TemVal<19) digitalWrite (6,LOW);

if (TemVal>=18) digitalWrite (5,HIGH);
if (TemVal<18) digitalWrite (5,LOW);

}

surbyte

Este código será algo mas eficiente

Code: [Select]
void loop(){
//calculo de temperatura del LM35
TemVal= analogRead(TemPin)*500/1024;

Serial.println (TemVal);

//que leds se encienden en funcion de la temperatura

if (TemVal>=26)
digitalWrite (13,HIGH);
else {
digitalWrite (13,LOW);
if (TemVal>=25)
digitalWrite (12,HIGH);
else {
digitalWrite (12,LOW);
if (TemVal>=24)
digitalWrite (11,HIGH);
else {
digitalWrite (11,LOW);
if (TemVal>=23)
digitalWrite (10,HIGH);
else {
digitalWrite (10,LOW);
if (TemVal>=22)
digitalWrite (9,HIGH);
else {
digitalWrite (9,LOW);
if (TemVal>=21)
digitalWrite (8,HIGH);
else {
digitalWrite (8,LOW);
if (TemVal>=20)
digitalWrite (7,HIGH);
else {
digitalWrite (7,LOW);
if (TemVal>=19)
digitalWrite (6,HIGH);
else {
digitalWrite (6,LOW);
if (TemVal>=18)
digitalWrite (5,HIGH);
else
digitalWrite (5,LOW);}

}
}
}
}
}
}
}
delay(1000);
}


Busqué una mejor solución pero no la encontré.

ArduMyth

#4
Apr 20, 2018, 11:14 pm Last Edit: Apr 20, 2018, 11:51 pm by ArduMyth
Yo reduciría un poco.
Sí, soy un maniático y no me gusta ver muchas líneas.
Code: [Select]

byte TemPin = 0;

void setup(){
  Serial.begin(9600);
  pinMode(TemPin, INPUT);
  for(byte miPin = 13; miPin >= 5; miPin--){
    pinMode(miPin, OUTPUT);
  }
}

void loop(){
  int TemVal=((5.0*analogRead(TemPin)*100)/1024);
  delay(1000);
  Serial.println(TemVal);
  
  //que leds se encienden en funcion de la temperatura
  byte checkTemp = 27;
  for(byte miPin = 13; miPin >= 5; miPin--){
    digitalWrite (miPin, (TemVal >= checkTemp--) ? true : false);
  }
}


Saludos.

EDITO:
Cómo veo que tienes problemas con el uso de los arrays pongo el mismo ejemplo que te puse usándolos.
Sólo es añadir un define por ahorrar repetir la división para obtener el lenght del array y cambiar los bucles.

Code: [Select]

#define SIZE(x) (sizeof(x) / sizeof(x[0]))
byte
led[]={13,12,11,10,9,8,7,6,5},
TemPin = 0;

void setup(){
  Serial.begin(9600);
  pinMode(TemPin, INPUT);
  for(byte i = 0; i < SIZE(led); i++){
    pinMode(led[i], OUTPUT);
  }
}

void loop(){
  //calculo de temperatura del LM35
  int TemVal=((5.0*analogRead(TemPin)*100)/1024);
  delay(1000);
  Serial.println(TemVal);
 
  //que leds se encienden en funcion de la temperatura
  byte checkTemp = 27;
  for(byte i = 0; i < SIZE(led); i++){
    digitalWrite (led[i], (TemVal >= checkTemp--) ? true : false);
  }
}

surbyte

Sabes @ArduMyth que pense y pensé en un método mejor y no se me ocurrió tu linea.
Muy bien!!! Anotada.

Go Up