Buenas Tardes, estoy aquí comiéndome la cabeza porque no se por que motivo no me funciona.
El programa es el siguiente: Se compone de cuatro 4 LEDS en el que cada vez que puse el pulsador, ira encendiéndose 1 con un contador.... pero quiero que cuando se encienda el led se quede encendido 5 segundos. independientemente de como estén los demás.
El código que he realizado me pasa que cuando enciende el led (por ahora solo he probado con uno) no se apaga, ¿alguien sabría decirme el porque? o ¿alguien me plantea alguna otra solución?
lo mas seguro que cuenta ya no valga 1 y nunca va a pasar por alli. Saca el control del tiempo fuera de los if.
Y pregunta si pasó el tiempo y el led1 está prendido? lo apagas.
Buenas, ¿Y como seria sacando fuera de los if?
Claro cuando termine el tiempo quiero que se apague. Al igual que los demas cuando se activen y transcurra ese tiempo que se apague.
/*ejemplo de manejo de eventos con leds
diagrama:
GND LEDS ____________
|--- |>¨---|p2 |
|--- |>¨---|p3 ARDUINO |
|--- |>¨---|p4 |
|--- |>¨---|p5 p7|-----/ ----|GND
|____________| boton
ehrja 16/05/2014
*/
byte led[4] = {2,3,4,5};
byte boton = 7;
byte cLed = 0;
boolean pulsedButon;
unsigned long timeLed[4];
unsigned long pause = 5000;
void setup(){
pinMode(boton, INPUT_PULLUP);
for(int i =0; i < 3; i++) pinMode(led[i],OUTPUT);
// Serial.begin(9600); //debug only
pinMode(13,OUTPUT);
}
void loop(){
//-- este if se encarga de reiniciar el contador de los leds
if(cLed > 3) cLed =0;
//delay(1000);
//---------------------------------------------------------------
//-- esta parte se encarga de leer el estado del boton
if(!digitalRead(boton)){
digitalWrite(13,HIGH); //<-- indicador encendido
delay(200);//--- delay anti rebote, evita que se activen mas de 1 led al tiempo.
pulsedButon = true;//-- *var indispensable para condicion que asegurar una sola pasada
// en la siguiennte parte.
//Serial.println(cLed); //debug only
}
//--------------------------------------------------------------
/* esta parte se asegura de cargar el tiempo que le toca estar encendido a cada led*/
if(pulsedButon){
pulsedButon = false; //-- *poniendola a False se asegura que no pasara en el siguiente ciclo.
digitalWrite(13,LOW);//<-- indicador apagado
//--------------------------------------------------------------
/*esta parte se encarga de asignar el tiempo en la variable correspondiente al led, teniendo en cuenta cLed
que es la variable que cuenta el led que se corresponde con las pulsaciones al boton de 0 a 3, aquí hay que
tener en cuenta que si cLed llega a 3 la siguiente pocicion no tiene led asi que no pasara nada, por lo tanto
al inicio del loop() nos aseguramos de reiniciar esta variable a 0 si llego a su limite, que es 3 en este caso.*/
switch(cLed)
{
case 0:
timeLed[cLed]= millis()+ pause;
digitalWrite(led[cLed],HIGH);
cLed = cLed++;
break;
case 1:
timeLed[cLed]= millis()+ pause;
digitalWrite(led[cLed],HIGH);
cLed = cLed++;
break;
case 2:
timeLed[cLed]= millis()+ pause;
digitalWrite(led[cLed],HIGH);
cLed = cLed++;
break;
case 3:
timeLed[cLed]= millis()+ pause;
digitalWrite(led[cLed],HIGH);
cLed = cLed++;
break;
}
}
//-------------------------------------------------------
//---por ultimo nos queda verifica el tiempo transcurrido para cada led.
// si es mas pequeño qe millis apaga el led correspondiente.
// esto significa que ya ha pasado el tiempo especificado en pause
for (int i = 0; i <=3 ; i++){
if (timeLed[i] < millis()) digitalWrite(led[i],LOW);
}
}
Notas:
Con este ejemplo me ha pasado algo curioso que no puedo explicar, el led ubicado en la posición 5 tiene menos brillo que los de mas, he cambiado el arduino y los leds, siempre lo mismo.
Saludos.
Muchas gracias por tu comentario y tu código, pero esto no tiene nada que ver con lo que me pasaba a mi ni con el programa que yo quería conseguir. por lo menos al meter este código en mi placa no funciona de esa manera.
Yo quería que cuando accionara el pulsador, se encender el led que le tocara y cuando pasara un determinado tiempo se apagara. Así mismo con los demás leds que actúan independientemente de como estén los estados de los demás leds.
Así que con esta explicación, ¿me podrías hechar una mano? o ¿alguien del foro me podría ayudar?
No entendí pero en todo caso parece que estoy muy cerca, te deje comentarios en el código para guiarte, trata de estructurar lo a tu gusto y si tienes problemas cuelga lo por aquí y te echamos una mano.
Mira si te sirve esto, lo he probado y funciona bien:
/*
creado el 19 de may de 2014
modificado el 19 de may de 2014
by cas6678
*/
// Variables que no cambian
const int pulsador = 7; // Pin de entrada del pulsador
const int ledA = 8; // Pin de salida led A
const int ledB = 9; // Pin de salida led B
const int ledC = 10; // Pin de salida led C
const int ledD = 11; // Pin de salida led D
// Variables que cambian
int pulsos = 0; // pulsos
int estadoActual = 0; // estado actual del pulsador
int ultimoEstado = 0; // ultimo estado del pulsador
unsigned long timeA; // guarda el tiempo en que se enciende el led A
unsigned long timeB; // guarda el tiempo en que se enciende el led B
unsigned long timeC; // guarda el tiempo en que se enciende el led C
unsigned long timeD; // guarda el tiempo en que se enciende el led D
void setup() {
pinMode(pulsador, INPUT); // Inicializa el pin de entrada del pulsador
pinMode(ledA, OUTPUT); // Inicializa el pin de salida del led A
pinMode(ledB, OUTPUT); // Inicializa el pin de salida del led B
pinMode(ledC, OUTPUT); // Inicializa el pin de salida del led C
pinMode(ledD, OUTPUT); // Inicializa el pin de salida del led D
Serial.begin(9600); // Inicializa el monitor para controlar desde el PC
}
void loop() {
estadoActual = digitalRead(pulsador); // lee el estado del pulsador
if (estadoActual != ultimoEstado) { // compara el estadoActual con el ultimo estado
if (estadoActual == HIGH) { // compara si es HIGH para:
pulsos++; // incrementar el contador del pulsador
Serial.println("on"); // escribe on en el monitor
Serial.println(pulsos); // escribe el numero de pulsos en el monitor
switch (pulsos){ // hace cosas diferentes ya sea 1,2,3 o 4 el dato de la variable pulsador
// encendera el led correspondiente y guardara en timeX la hora de encendido
case 1:
digitalWrite(ledA, HIGH); // enciende led A
timeA = millis(); // guarda hora de encendido del led A
break;
case 2:
digitalWrite(ledB, HIGH); // enciende led B
timeB = millis(); // guarda hora de encendido del led B
break;
case 3:
digitalWrite(ledC, HIGH); // enciende led C
timeC = millis(); // guarda hora de encendido del led C
break;
case 4:
digitalWrite(ledD, HIGH); // enciende led D
timeD = millis(); // guarda hora de encendido del led D
break;
}
}
else { // compara si es LOW para:
Serial.println("off"); // escribe off en el monitor
}
}
ultimoEstado = estadoActual; // guarda el estadoActual en el ultimoEstado
delay (100); // delay antirebote
if (pulsos == 4) {
pulsos = 0;
}
if (timeA +5000 < millis()) {
digitalWrite(ledA, LOW); // apaga led A si han pasado mas de 5 segundos de su encendido
}
if (timeB +5000 < millis()) {
digitalWrite(ledB, LOW); // apaga led B si han pasado mas de 5 segundos de su encendido
}
if (timeC +5000 < millis()) {
digitalWrite(ledC, LOW); // apaga led C si han pasado mas de 5 segundos de su encendido
}
if (timeD +5000 < millis()) {
digitalWrite(ledD, LOW); // apaga led D si han pasado mas de 5 segundos de su encendido
}
}
El pin de entrada para el pulsador es el 7 y los de salida para los led son los 8,9,10 y 11.
El error de tu codigo es que, ademas de que solo intentas apagar el led del pin 2, que el if que le haces nunca te pasara por el else. Tu preguntas si milis es menor que t.encendido y la verdad es que siempre lo sera porque en la linea anterior haces que sea asi:
Gracias a la ayuda prestada por todos vosotros, vuestro códigos Ehrja y cas6678 no funcionaban, pero me han servido de ayuda para poder hacer el programa, y tomando la respuesta de maxid y dándole vueltas a la cabeza al final e sacado los tiempos fuera de los if para volver ha hacer otra lectura y por fin e conseguido hacer mi código y poder hacerme con el dominio del tiempo, asi que ahora depurare mi programa.