TELERRUPTOR
Con cada pulsación los led cambian de estado.

Telerruptor


 /*Con  pulsador 1 enciendo y apago el led verde, con el dos el amarillo y con el tres el rojo y amariillo2
al pulsar una vez el pulsador no responde hasta 0,5 segundos despues
para eliminar rebotes y dar tiempo a soltar
*/

int ledverde=12;
int ledamarillo=11;
int ledrojo=10;
int ledverde1=9;
int pulsador1=5;
int pulsador2=6;
int pulsador3=7;


    boolean pul_1;
    boolean flanco1=0;
    boolean pul_2;
    boolean flanco2=0;
    boolean pul_3;
    boolean flanco3=0;
    boolean ledV; //ver el estado del led
    boolean ledA; //ver el estado del led
    boolean ledR; //ver el estado del led
    boolean ledV1; //ver el estado del led
  

 

 
void setup(){
 pinMode(ledverde,OUTPUT);
 pinMode(ledamarillo,OUTPUT);
 pinMode(ledrojo,OUTPUT);
 pinMode(ledverde1,OUTPUT);
 pinMode(pulsador1,INPUT);
 pinMode(pulsador2,INPUT);
 pinMode(pulsador3,INPUT);

  Serial.begin(9600); 
}
 

  void loop(){
    //leemos el estado de las entradas
    pul_1=digitalRead(pulsador1);
    pul_2=digitalRead(pulsador2);
    pul_3=digitalRead(pulsador3);

 
    //leemos el estado de la salidas
    ledV=digitalRead(ledverde);//0 apagado 1 encendido
    ledA=digitalRead(ledamarillo);//0 apagado 1 encendido
    ledR=digitalRead(ledrojo);//0 apagado 1 encendido
    ledV1=digitalRead(ledverde1);//0 apagado 1 encendido
 
  //PULSADOR 1
 if (pul_1==LOW) flanco1=0;
 if (pul_1==HIGH && flanco1==0)
      {
      flanco1=1;// al activarse flanco a uno en el siguiente ciclo no se ejecuta la condicion.
      ledV=!ledV;
      digitalWrite (ledverde,ledV);// como el led estaba encendido lo apago.
      }
  
    //PULSADOR 2
 if (pul_2==LOW) flanco2=0;
 if (pul_2==HIGH && flanco2==0)
      {
      flanco2=1;// al activarse flanco a uno en el siguiente ciclo no se ejecuta la condicion.
      ledA=!ledA;
      digitalWrite (ledamarillo,ledA);// como el led estaba encendido lo apago.
      }
  
  
     //PULSADOR 3
 if (pul_3==LOW) flanco3=0;
 if (pul_3==HIGH && flanco3==0)
      {
      flanco3=1;// al activarse flanco a uno en el siguiente ciclo no se ejecuta la condicion.
      ledR=!ledR;
         ledV1=!ledV1;
      digitalWrite (ledrojo,ledR);// como el led estaba encendido lo apago.
      digitalWrite (ledverde1,ledV1);
         }
  
  
  
  
  
  
  }//fin de programa

TELERRUPTOR  Y ANTIRREBOTES

Para evitar que en el momento de la pulsación se realizen lecturas erroneas por rebotes, realizo 2 lecturas en un intervalos de 20ms, si son igulales, considero que la lectura es correcta.

telerruptor y antirrebotes

 /*Con  pulsador 1 enciendo y apago el led verde, con el dos el amarillo y con el tres el rojo y amariillo2
al pulsar una vez el pulsador no responde hasta 0,5 segundos despues
para eliminar rebotes y dar tiempo a soltar
*/

int ledverde=12;
int ledamarillo=11;
int ledrojo=10;
int ledverde1=9;
int pulsador1=5;
int pulsador2=6;
int pulsador3=7;


    boolean pul_1;
    boolean flanco1=0;
    boolean pul_2;
    boolean flanco2=0;
    boolean pul_3;
    boolean flanco3=0;
    boolean ledV; //ver el estado del led
    boolean ledA; //ver el estado del led
    boolean ledR; //ver el estado del led
    boolean ledV1; //ver el estado del led
  //Eliminacion de rebotes
  //variables para eliminar rebotes
    boolean pul_1a;  
    boolean pul_1b;
    boolean pul_2a;  
    boolean pul_2b;
    boolean pul_3a;  
    boolean pul_3b;

    unsigned int tiempo_ciclo=20;// la duracion en la que va a producirse el pulso,  puede oscilar entre 65536 ms (65 segundos.)
    unsigned long tiempo_inicio=0;


 
void setup(){
 pinMode(ledverde,OUTPUT);
 pinMode(ledamarillo,OUTPUT);
 pinMode(ledrojo,OUTPUT);
 pinMode(ledverde1,OUTPUT);
 pinMode(pulsador1,INPUT);
 pinMode(pulsador2,INPUT);
 pinMode(pulsador3,INPUT);
 


  Serial.begin(9600); 
}
 

  void loop(){
   
//elimitar los rebotes con dos lecturas de iguales en un intervalo de 20ms

   
 if (tiempo_inicio==0)
     {
    tiempo_inicio=millis();//si la variable tiempo_inicio vale cero carga el valor de tiempo actual
    pul_1a=digitalRead(pulsador1);
    pul_2a=digitalRead(pulsador2);
    pul_3a=digitalRead(pulsador3);
     }  

    if (millis()>tiempo_inicio+tiempo_ciclo)// si el tiempo desde que cargue la variable supera el tiempo cilclo
{
    pul_1b=digitalRead(pulsador1);
    pul_2b=digitalRead(pulsador2);
    pul_3b=digitalRead(pulsador3);
//si la lectura de los pulsadores en 20ms es igual la tomo como buena
  if (pul_1a==pul_1b)pul_1=pul_1a;
  if (pul_2a==pul_2b)pul_2=pul_2a;
  if (pul_3a==pul_3b)pul_3=pul_3a;
tiempo_inicio=0;// tiempo_inicio al ponerlo a 0, lca preparo para carga un nuevo tiempo.
 }



 
   
   
 


 
    //leemos el estado de la salidas
    ledV=digitalRead(ledverde);//0 apagado 1 encendido
    ledA=digitalRead(ledamarillo);//0 apagado 1 encendido
    ledR=digitalRead(ledrojo);//0 apagado 1 encendido
    ledV1=digitalRead(ledverde1);//0 apagado 1 encendido
 
  //PULSADOR 1
 if (pul_1==LOW) flanco1=0;
 if (pul_1==HIGH && flanco1==0)
      {
      flanco1=1;// al activarse flanco a uno en el siguiente ciclo no se ejecuta la condicion.
      ledV=!ledV;
      digitalWrite (ledverde,ledV);// como el led estaba encendido lo apago.
      }
  
    //PULSADOR 2
 if (pul_2==LOW) flanco2=0;
 if (pul_2==HIGH && flanco2==0)
      {
      flanco2=1;// al activarse flanco a uno en el siguiente ciclo no se ejecuta la condicion.
      ledA=!ledA;
      digitalWrite (ledamarillo,ledA);// como el led estaba encendido lo apago.
      }
  
  
     //PULSADOR 3
 if (pul_3==LOW) flanco3=0;
 if (pul_3==HIGH && flanco3==0)
      {
      flanco3=1;// al activarse flanco a uno en el siguiente ciclo no se ejecuta la condicion.
      ledR=!ledR;
         ledV1=!ledV1;
      digitalWrite (ledrojo,ledR);// como el led estaba encendido lo apago.
      digitalWrite (ledverde1,ledV1);
         }
  
  
  
  
  
  
  }//fin de programa

Tiempo y valor máximo de las variables


Y es que al utilizar la variables donde almaceno el tiempo, como int, esta se me desborda a los pocos minutos de empezar a contar el programa, y el problema de logica es que el valor de millis() almacenado puede  se negativo y aaggghhh,
Simplifico almaceno el tiempo millis() en una variable que toma valores solo positivos y me quito el problema de que al leer los millis() me almacene un numero negativo.

unsigned int tiempo=millis();
unsigned long tiempo=millis();
unsigned float tiempo=millis();

Nota:
long almacena la variable en 4 bytes
unsigned solo considera numeros positivos a partir de cero
la variable almacenada puede tener un valor desde
0 a 232=4.294.967.296
Como estamos contado milisegundos
4294967,296 segundos
divido por sesenta y obtengo los minutos
71582788 minutos
Divido por sesenta y obtengo las horas
1193046 horas
Divido por 24 y obtengo los dias
49710 dias
como millis se desborda aproximadamente a los 9 dias esta variable es mas que suficiente.




  


 







  
El mejor profesor es tu ultimo error.