Obviar orden de interruptor

Hola,

Necesito enviar un pulso positivo (mantener el pulso unos 2 segundos y volver al negativo) cuando le doy al ON un interruptor y cuando le de al OFF al interruptor que no haga nada hasta que le vuelva a dar a ON y empiece el nuevo pulso.

Con información que he obtenido en el foro he conseguido que envíe el pulso al darle al ON, pero al darle al OFF envía otro nuevo pulso de 2 segundos. Ese segundo pulso es el que quiero obviar.

Cualquier información sería muy util.

Muchas gracias de antemano.

#define ON HIGH                 
#define OFF LOW                  
byte Pinentrada=2;
byte Pinled=12;
unsigned long T_Control=0;      
unsigned long T_Apagar=1000;    
bool EstadoPin=false;           
bool AnteriorEstadoPin=false;
void setup()
{
  pinMode(Pinled, OUTPUT);      
  pinMode(Pinentrada, INPUT);
  digitalWrite (Pinled, OFF);
}
void loop()
{ while (digitalRead(Pinentrada)==ON);{
  
  EstadoPin=digitalRead(Pinentrada);    
  if (AnteriorEstadoPin != EstadoPin)  
  {
    T_Control=millis()+T_Apagar;        
    digitalWrite (Pinled, ON);                 
  }
  AnteriorEstadoPin=EstadoPin;
  if (millis()>T_Control && T_Control>0)
  {
    digitalWrite (Pinled, OFF);          
    
    T_Control=0;                       
    
  }
  }
}

Consulta tienes una resistencia de 10k entre pin 2 y GND ?

void loop()
{ while (digitalRead(Pinentrada)==ON);{   //Error, quita el ;

Prueba lo siguiente:

#define ON HIGH                 
#define OFF LOW                  
const byte Pinentrada = 2;
const byte Pinled = 13;
unsigned long T_Control = 0;      
bool Estado = true;

void setup(){
   pinMode(Pinled, OUTPUT);      
   pinMode(Pinentrada, INPUT);
   digitalWrite(Pinled, OFF);
}
void loop(){ 
   if (digitalRead(Pinentrada) == ON && Estado){
      digitalWrite(Pinled, ON);     //Prende LED
      T_Control = millis();          //Toma tiempo
      Estado = false;                  //Desarma circuito
   }
   if (millis() - T_Control > 1000){
      digitalWrite(Pinled, OFF);    //Apaga LED
   }
   if (digitalRead(Pinentrada) == OFF){
      Estado = true;                   //Rearma circuito
   }
}

Nota que dentro del loop() hay 3 tareas independientes:

  1. Prender el LED, tomar el tiempo y desarmar circuito (Estado = false;), al prender el interriptor si circuito esta armado (Estado = true)
  2. Apagar el LED al cumplirse el tiempo, independiente de posicion de interruptor.
  3. Rearmar el circuito (Estado = true;) cuando apagas interruptor

Muchas gracias por tu respuesta.

Sí que tengo la resistencia entre dichos pines.

Ahora estoy intentando otra cosa pero no logro coneguirla. Lo que me gustaría es que al abrir de nuevo el interruptor (Cuando el Pinentrada == LOW) se encendiera un segundo LED y se apagara el primero, y al cabo de un pequeño tiempo se apagara también el segundo.

Solo consigo que el segundo se mantenga encendido al abrir el interruptor.

#define ON HIGH                 
#define OFF LOW                  
const byte Pinentrada = 2;
const byte Pinled = 12;
const byte Pinled2 = 8;
unsigned long T_Control = 0;      
bool Estado = true;

void setup(){
   pinMode(Pinled, OUTPUT);      
   pinMode(Pinentrada, INPUT);
   digitalWrite(Pinled, OFF);
}
void loop(){ 
   if (digitalRead(Pinentrada) == ON && Estado){
      digitalWrite(Pinled, ON);     //Prende LED
      digitalWrite(Pinled2, OFF);
      T_Control = millis();          //Toma tiempo
      Estado = false;                  //Desarma circuito
   }
   if (millis() - T_Control > 1000){
      digitalWrite(Pinled, OFF);    //Apaga LED
      
   }
   if (digitalRead(Pinentrada) == OFF){
    digitalWrite(Pinled2, ON);
    digitalWrite(Pinled, OFF);
    
      Estado = true;                   //Rearma circuito
   }
}

alejandrocaler:
Ahora estoy intentando otra cosa pero no logro coneguirla. Lo que me gustaría es que al abrir de nuevo el interruptor (Cuando el Pinentrada == LOW) se encendiera un segundo LED y se apagara el primero, y al cabo de un pequeño tiempo se apagara también el segundo.

Prueba esto:

#define ON HIGH                 
#define OFF LOW                  
const byte Pinentrada = 2;
const byte Pinled_1 = 12;
const byte Pinled_2 = 8;
unsigned long T_Control_1 = 0;      
unsigned long T_Control_2 = 0;      
bool Estado = true;

void setup(){
   pinMode(Pinled_1, OUTPUT);      //LED 1
   pinMode(Pinled_2, OUTPUT);      //LED 2
   pinMode(Pinentrada, INPUT);
}
void loop(){ 
   if (digitalRead(Pinentrada) == ON && Estado){
      digitalWrite(Pinled_1, ON)     //Prende LED 1
      T_Control_1 = millis();         //Toma tiempo 1
      Estado = false;                    //Desarma circuito
   }
   if (millis() - T_Control_1 > 1000){
      digitalWrite(Pinled_1, OFF);    //Apaga LED 1
   }
   if (digitalRead(Pinentrada) == OFF && !Estado){
      digitalWrite(Pinled_2, ON);     //Prende LED 2
      T_Control_2 = millis();          //Toma tiempo 2
      Estado = true;                      //Rearma circuito
   }
   if (millis() - T_Control_2 > 1000){
      digitalWrite(Pinled_2, OFF);    //Apaga LED 2
   }
}