Encender 3 leds con pulsadores en binario

Hola tengo un problema, no consigo crear un codigo para que ao pulsar un boton el contador binario me encende un led en una sequencia de 3 leds, y luego el otro ..asi 001 010 011 100 101 110 111, y ao a pulsar el otro boton me haga 110 101 100 011 010 001 000. pero que me cambie a cada pulsacion, y no todo automaticamente( pulso up 001....pulso up 010....)(pulso down 010...001) esto lo quiero para controlar un dimmer AC que tengo montado , el paperdimmer, pero lo tienen con potenciometro y automatico pero no lo que busco. GRACIAS.

pongo mi codigo tengo dudas en el programa
byte PORTA_U = 11;
byte PORTA_D = 12;
byte D1 = 3; // SALIDA 1
byte D2 = 4; // SALIDA 2
byte D3 = 5; // SALIDA 3
byte TIME = 200; // TIEMPO ESPERA
boolean sal1= LOW;
boolean sal2= LOW;
boolean sal3= LOW;

void setup()
{
Serial.begin (9600);
delay(1000);

pinMode(PORTA_U,INPUT); //INICIALIZA EL SISTEMA
digitalWrite(PORTA_U,1);// liga pullup
Serial.println("pullup 1");
delay(TIME);
pinMode(PORTA_D,INPUT);
digitalWrite(PORTA_D,1); // liga pullup
Serial.println("pullup 2");
delay(TIME);
pinMode(D1, OUTPUT);
Serial.println("out 1");
delay(TIME);
pinMode(D2,OUTPUT);
Serial.println("out 2");
delay(TIME);
pinMode(D3,OUTPUT);
Serial.println("out 3");
Serial.println("INICIO COMPLETADO");
}

// Programa
void loop()
{
byte UP = digitalRead(PORTA_U);
byte DOWN = digitalRead(PORTA_D);

if(UP == 0)

//aqui no se el codigo que poner

if(DOWN == 0)

//aqui tampoco

He resuelto despues de dias rompiendo la cabeza...

Si se puede mejorar me diga por favor.

byte PORTA_U = 11;  
byte PORTA_D = 12;
int count=0;
int countleds=0;
/*byte D1 = 3; // SALIDA 1
byte D2 = 4; // SALIDA 2
byte D3 = 5; // SALIDA 3*/
int pinLeds[] = {5,4,3};
byte TIME = 200; // TIEMPO ESPERA
/*boolean sal1= LOW;
boolean sal2= LOW;
boolean sal3= LOW;*/



void setup()
{
  Serial.begin (9600);
  delay(1000);
 
  pinMode(PORTA_U,INPUT); //INICIALIZA EL SISTEMA
  digitalWrite(PORTA_U,1);// liga pullup
  Serial.println("pullup 1");
 delay(TIME);
  pinMode(PORTA_D,INPUT);
  digitalWrite(PORTA_D,1); // liga pullup
  Serial.println("pullup 2");
  delay(TIME);
/*  pinMode(D1, OUTPUT);
  Serial.println("out 1");
delay(TIME);
  pinMode(D2,OUTPUT);
  Serial.println("out 2");
 delay(TIME); 
  pinMode(D3,OUTPUT);
  Serial.println("out 3");*/
  for (count=0;count<3;count++) {
    pinMode(pinLeds[count], OUTPUT);}
    
 Serial.println("INICIO COMPLETADO");
}

// Programa
void loop()
{
  byte UP = digitalRead(PORTA_U);
  byte DOWN = digitalRead(PORTA_D);
  
  if(UP == 0)
    {
      if (countleds<8,countleds++);
      
      switch (countleds)
        {                   
          case 0:
           digitalWrite (pinLeds[0],LOW);
           digitalWrite (pinLeds[1],LOW);
           digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 1:
             digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 2:
                 digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 3:
                 digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 4:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 5:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 6:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;      
          case 7: 
               digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;          
        }             
     }delay(TIME);
     
      if(DOWN == 0)
    {
      if (countleds>0,countleds--);
            switch (countleds)
        {                   
          case 0:
           digitalWrite (pinLeds[0],LOW);
           digitalWrite (pinLeds[1],LOW);
           digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 1:
             digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 2:
                 digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 3:
                 digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 4:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 5:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 6:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;      
          case 7: 
               digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;          
        }             
     }delay(TIME);
     
}

¿Te funciona tal y como tú quieres? Por lo que veo creo que si mantienes activado un pulsador el ciclo hace que siga contando pasos y el ciclo de los LED no se para.

Aparte de eso yo lo habría programado haciendo un detector de flanco para cada pulsador. Ese detector de flanco suma o resta de la variable contador y a continuación sólo hay que hacer un switch del valor de ese contador.
Tu programa no es que esté mal (aparte de que siga contando pasos si mantienes activado el pulsador) pero veo más estructurado lo que te sugiero además de que está bien eso de ir practicando la programación de pulsadores y su activación en programa por flanco ya que se emplea en muchas ocasiones.

Hola y como seria este detector de flancos, como quedaria el codigo?
si funciona como quiero pero claro lo quiero mejorar, ya que tengo otras ideas en mente,
Gracias

En este enlace

http://arduino.cc/forum/index.php/topic,96810.0.html

está explicado cómo hacer la detección de flancos con un ejemplo resuelto.

O Gracias, pero no necesito este detector de momento, lo que si quiero reducir el codigo o hacerlo de otra manera el SWITCH , es que me parece muy extenso. o lo pongo en void intensidad() pero quiero saber si es posible conseguir el mismo efecto con otro codigo mas corto.

ahoras esta asi lo queria asi o algo que simplifique el
primer ejemplo sin switch
switch intensidad() switch intensidad() que active los pinos 2,3,4
con up y down en orden
0: intesidad pin 1 low 0: intesidad pin leds(0,0,0) binario 000,001,010
intesidad pin 2 low
intesidad pin 3 low

gracias si podeis me decir algo

Bueno, tal como te dije el detector de flancos es para dejar un solo switch.

hola, por mas que he leido no logro entender como dejar un switch con el detector de flancos, :(, si me puedes ayudar con algun ejemplo sobre mi codigo agradeceria, lo he leido en la otra pagina pero no logro que funcione mi cerebro jejejejej

No lo he probado pero sería así.

byte PORTA_U = 11;  
byte PORTA_D = 12;
int count=0;
int countleds=0;
/*byte D1 = 3; // SALIDA 1
byte D2 = 4; // SALIDA 2
byte D3 = 5; // SALIDA 3*/
int pinLeds[] = {5,4,3};
byte TIME = 200; // TIEMPO ESPERA
/*boolean sal1= LOW;
boolean sal2= LOW;
boolean sal3= LOW;*/

int PulsadorUpEstadoActual = 1;    //imagino que tienes las entradas con pullup y los pulsadores a GND
int PulsadorDownEstadoActual = 1;
int PulsadorUpEstadoAnterior = 1;
int PulsadorDownEstadoAnterior = 1;

void setup()
{
  Serial.begin (9600);
  delay(1000);
 
  pinMode(PORTA_U,INPUT); //INICIALIZA EL SISTEMA
  digitalWrite(PORTA_U,1);// liga pullup
  Serial.println("pullup 1");
 delay(TIME);
  pinMode(PORTA_D,INPUT);
  digitalWrite(PORTA_D,1); // liga pullup
  Serial.println("pullup 2");
  delay(TIME);
/*  pinMode(D1, OUTPUT);
  Serial.println("out 1");
delay(TIME);
  pinMode(D2,OUTPUT);
  Serial.println("out 2");
 delay(TIME); 
  pinMode(D3,OUTPUT);
  Serial.println("out 3");*/
  for (count=0;count<3;count++) {
    pinMode(pinLeds[count], OUTPUT);}
    
 Serial.println("INICIO COMPLETADO");
}

// Programa
void loop()
{
  PulsadorUpEstadoActual = digitalRead(PORTA_U);
  PulsadorDownEstadoActual = digitalRead(PORTA_D);
  
  if (PulsadorUpEstadoActual == 0 && PulsadorUpEstadoAnterior == 1) countleds = countleds++;
  if (PulsadorDownEstadoActual == 0 && PulsadorDownEstadoAnterior == 1) countleds = countleds--;
  countleds = constrain(countleds, 0, 7);
  PulsadorUpEstadoAnterior = PulsadorUpEstadoActual;
  PulsadorDownEstadoAnterior = PulsadorDownEstadoActual;
      
      switch (countleds)
        {
          case 0:
           digitalWrite (pinLeds[0],LOW);
           digitalWrite (pinLeds[1],LOW);
           digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 1:
             digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 2:
                 digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 3:
                 digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 4:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 5:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
          case 6:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;      
          case 7: 
               digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;          
        }
        
     delay(TIME);
     
}

Hola he implementado el codigo pero quiero saber como hago para que me imprima una sola ve el estado de alarma ACTIVADO o DESACTIVADO, porque me sigue imprimiendo una y otra ves, por el loop

he logrado hacer que se active o desactive al presionar un 3º boton

// Programa
void loop()
{

  PulsadorArmadoEstadoActual = digitalRead(BOTON_ACT);
 //AVCTIVA DESACTIVA ALARMA


if (PulsadorArmadoEstadoActual == 0 && PulsadorArmadoEstadoAnterior == 1) ARMADO = !ARMADO;
//PulsadorArmadoEstadoActual = PulsadorArmadoEstadoAnterior;
 
 
 switch (ARMADO)
{
  case 1:
  
  Serial.println("ALARMA 1 ACTIVADA");
   Serial.println(ARMADO);
  if(digitalRead(pirPin) == HIGH)
  {
       digitalWrite(ledPin, HIGH);   //LED visualiza el estado de la salida del sensor
       if(lockLow){  
         //Se asegura de que esperar a que la transición a la baja antes de cualquier salida se hace otra:
         lockLow = false;            
         Serial.println("---");
         Serial.print("movimiento encontrado a los ");
         Serial.print(millis()/1000);
         Serial.println(" segundos "); 
         delay(50);
         for (countleds=0;countleds<6;countleds++)// movimento detectado se encende la luz
    {
   delay(500);

   Serial.println(countleds);
      
      switch (countleds)
        {                   
          case 0:
           digitalWrite (pinLeds[0,1,2],LOW);
           //digitalWrite (pinLeds[1],LOW);
           //digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
           
          case 1:
             digitalWrite (pinLeds[0,1],LOW);
              //digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
           
          case 2:
                 digitalWrite (pinLeds[0,2],LOW);
              digitalWrite (pinLeds[1],HIGH);
               //digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
           
          case 3:
                 digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1,2],HIGH);
              // digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
         
          case 4:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1,2],LOW);
             //  digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
         
          case 5:
                 digitalWrite (pinLeds[0,2],HIGH);
              digitalWrite (pinLeds[1],LOW);
              // digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);      
           break;
         }        
        } 
         }         
         takeLowTime = true;
         
       }

     if(digitalRead(pirPin) == LOW){       
       digitalWrite(ledPin, LOW);  //LED visualiza el estado de la salida del sensor

       if(takeLowTime){
        lowIn = millis();          // guardar el momento de la transición de alta a baja
        takeLowTime = false;       //  asegurarse de que esto sólo se hace al comienzo de una fase de baja
       }
       //Si el sensor es baja para más de la pausa dada, 
       //Asumimos que el movimiento no más que va a pasar
       
       if(!lockLow && millis() - lowIn > pause){  
           //Se asegura de este bloque de código sólo se ejecuta de nuevo después de 
           //Una secuencia de movimiento se ha detectado nuevo
           lockLow = true;                        
           Serial.print("movimiento detenido a los ");      
           Serial.print((millis() - pause)/1000);
           Serial.println(" segundos ");
           delay(50);
           for (countleds;countleds>0;countleds--)// movimento parado se apaga la luz
   {
   delay(300);

   Serial.println(countleds);
      
      switch (countleds)
        {                   
          case 0:
           digitalWrite (pinLeds[0],LOW);
           digitalWrite (pinLeds[1],LOW);
           digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);

           break;
          case 1:
             digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);

           break;
          case 2:
                 digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);

           break;
          case 3:
                 digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);

           break;
          case 4:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);

           break;
          case 5:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           

           break;
         
        }        
        } 
                  
           } 
 
     }
      
   
 
 //if (ARMADO==0)
case 0:
    
  PulsadorUpEstadoActual = digitalRead(PORTA_U);
  PulsadorDownEstadoActual = digitalRead(PORTA_D);
  
  if (PulsadorUpEstadoActual == 0 && PulsadorUpEstadoAnterior == 1) countleds = countleds++;
  if (PulsadorDownEstadoActual == 0 && PulsadorDownEstadoAnterior == 1) countleds = countleds--;
  countleds = constrain(countleds, 0, 7);
 PulsadorUpEstadoAnterior = PulsadorUpEstadoActual;
 PulsadorDownEstadoAnterior = PulsadorDownEstadoActual;   
    
      switch (countleds)
        {                   
          case 0:
           digitalWrite (pinLeds[0,1,2],LOW);
           //digitalWrite (pinLeds[1],LOW);
           //digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
           
          case 1:
             digitalWrite (pinLeds[0,1],LOW);
              //digitalWrite (pinLeds[1],LOW);
               digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
           
          case 2:
                 digitalWrite (pinLeds[0,2],LOW);
              digitalWrite (pinLeds[1],HIGH);
               //digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
           
          case 3:
                 digitalWrite (pinLeds[0],LOW);
              digitalWrite (pinLeds[1,2],HIGH);
              // digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
         
          case 4:
                 digitalWrite (pinLeds[0],HIGH);
              digitalWrite (pinLeds[1,2],LOW);
             //  digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;
         
          case 5:
                 digitalWrite (pinLeds[0,2],HIGH);
              digitalWrite (pinLeds[1],LOW);
              // digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);      
           break;
           
           case 6:
                 digitalWrite (pinLeds[0,1],HIGH);
             // digitalWrite (pinLeds[1],HIGH);
               digitalWrite (pinLeds[2],LOW);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;   
           
          case 7: 
               digitalWrite (pinLeds[0,1,2],HIGH);
              //digitalWrite (pinLeds[1],HIGH);
              // digitalWrite (pinLeds[2],HIGH);
           Serial.println(pinLeds[0,1,2]);
           Serial.println(countleds);
           break;   
        }       
         }  
         delay(1000);

Si quieres ver el estado de la alarma imagino que tendrás alguna variable que te indique ese estado. Pues dimplemente tienes que hacer lo mismo que has hecho con el pulsador con la variable.