Go Down

Topic: Ayuda para un novato (Read 1 time) previous topic - next topic

EzeQuiel

Hola quiero encender 3 o mas led de manera alternada sin usar el delay(). Estoy usando la función millis(), y con dos Led me funciona pero cuando quiero encender el tercero lo hace en distinto tiempo que los dos anteriores. acá va el código.

int ledT1 = 13;   // Led testigo (led Rojo)
int ledT2 = 12;   // Led testigo (led verde)
int ledOpc1 = 8; // led amarillo
int ledOpc2 = 9; // led rojo bis
int boton = 2;  // pin donde se encuentra el pulsador
int LedT1State = LOW; 
int LedT2State = LOW;
int LedT3State = LOW;
boolean estadoP1;

long previousMillis = 0;   
long verdetime = 0;
long amatime = 0;

long intRojo = 4000;   // intervalo del parpadeo (en milisegundos)
long intVerde = 4000;  //segundo intervalo
long intAma = 4000;
void setup()
{

pinMode(ledT1, OUTPUT);
pinMode(ledT2, OUTPUT);
pinMode(ledOpc1, OUTPUT);
pinMode(ledOpc2, OUTPUT);
pinMode(boton, INPUT);
previousMillis = millis();
verdetime = (millis()+1000);
amatime = (millis()+1000);
}

void loop()
{
unsigned long currentMillis = millis();    // Se toma el tiempo actual


estadoP1 = digitalRead(boton);
  if ((estadoP1 == true) & (LedT1State==HIGH))
             {
               digitalWrite( ledOpc1, LOW);
             }

if (millis() - previousMillis > intRojo){
    previousMillis = currentMillis;

    if (LedT1State == LOW)
    {
        LedT1State = HIGH;
     }
     else
    {
        LedT1State = LOW;
    }

    digitalWrite(ledT1, LedT1State);

}
//------------------------------fin Led Testigo rojo -----------------------------------

//------------------------------Comienzo luz verd ------------------------------
  estadoP1 = digitalRead(boton);
  if ((estadoP1 == true) & (LedT2State==HIGH))
             {
                  digitalWrite( ledOpc1, HIGH);             
             }
             
  if (millis() - verdetime > intVerde){

verdetime = currentMillis;

    if (LedT2State == LOW)
    {     
       LedT2State = HIGH;
    }
    else
    {
       LedT2State = LOW;
    }

    digitalWrite(ledT2, LedT2State);

}
////---------------------- Fin Led Testigo verde ----------------------------

if (millis() - amatime >= intAma){
    amatime = currentMillis;

    if (LedT3State == LOW)
    {     
       LedT3State = HIGH;
    }
    else
    {
       LedT3State = LOW;
    }

digitalWrite(ledOpc1, LedT3State);

 
}

La idea es que vayan encendiéndose de manera alternada y que al presionar un pulsador haga algo x.
por ejemplo enciende led1 espera 3 seg se apaga y se enciende el led2 se apaga y se enciende el led3 y se apaga.

Si me pueden ayudar les agradezco (porque me bloquee :D)

#1
Jul 20, 2012, 12:15 am Last Edit: Jul 20, 2012, 12:18 am by JRodrigo Reason: 1
Intenta simplificar, veo mucho código para hacer algo muy simple, contra más código más posibilidades de error tienes.

Este código es una secuencia de 4 LED utilizando la funcion millis()

Quote
int ledT1 = 13;   // Led testigo (led Rojo)
int ledT2 = 12;   // Led testigo (led verde)
int ledOpc1 = 11; // led amarillo
int ledOpc2 = 10; // led azul


unsigned long time = 0;
unsigned long tRojo = 4000;
unsigned long tVerde = 4000;
unsigned long tAmar = 4000;
unsigned long tAzul = 4000;


void setup() {                
 pinMode(ledT1, OUTPUT);
 pinMode(ledT2, OUTPUT);  
 pinMode(ledOpc1, OUTPUT);  
 pinMode(ledOpc2, OUTPUT);  
}

void loop() {
 
 if ( time + tRojo > millis() ) {
   digitalWrite(ledOpc2, LOW);
   digitalWrite(ledT1, HIGH);  
 } else if ( time + tRojo + tVerde > millis() ) {
   digitalWrite(ledT1, LOW);
   digitalWrite(ledT2, HIGH);
 } else if ( time + tRojo + tVerde + tAmar > millis() ) {
   digitalWrite(ledT2, LOW);
   digitalWrite(ledOpc1, HIGH);
 } else if ( time + tRojo + tVerde + tAmar + tAzul > millis() ) {
   digitalWrite(ledOpc1, LOW);
   digitalWrite(ledOpc2, HIGH);
 } else {
   time = millis();    
 }
 
}


PD: Revisa esto http://arduino.cc/playground/Es/Consejos para un futuro  :)

Un saludo!

EzeQuiel

Muchas gracias !!!! ahora otra pregunta si yo quiero detectar un pulsador por ejemplo cuando esta encendida el led amarillo como tendría que hacer ?. Muchas gracias de nuevo.

EzeQuiel

Gracias JRodrigo por tu respuesta, me aclaraste el panorama  :D y con respecto a detectar el boton lo solucione con un switch() así que cierro el post.



Saludos....

Go Up