Proyecto LED FADE y pulsador (espada de luz)

Hola!
intento modificar una espada de luz.
El objetivo es:
Pulsando X segundos el pulsador, se encienda el LED de 0 a 255 progresivamente
Pulsando X segundos el pulsador, se apaga el LED de 255 a 0 progresivamente

El problema es que lo que tengo hecho, solo se enciende si suelto el pulsador antes de los 3 primeros segundos, y solo se apaga si paso de los 3 segundos y cuando suelto el pulsador… asi que si dejo 10 segundos el pulsador, no se apaga hasta despues de soltar el pulsador.

otra cosa que quiero hacer es que durate el tiempo que este encendido el led, baje y suba la intensidad, por ejemplo de 200 a 255, aleatoriamente y progresivamente. (esto ya es otro mundo creo)

tengo este codigo hecho: (es un copia y pega de varios encontrados)

//PULSACION
boolean pul_1;
boolean P1_corta;
boolean P1_larga;
int repeat = 10;
  
//temporizacion para pulsadores
      
unsigned long T_inicio_pulsacion=0;
unsigned long T_pulsado=0;


  
void setup(){
 pinMode(ledverde,OUTPUT);
 pinMode(pulsador1,INPUT);


  Serial.begin(9600);  
}

  void loop(){
    //leo el estado de las entradas
  pul_1= digitalRead(pulsador1) ;
 
 if (pul_1==HIGH && T_inicio_pulsacion==0){
 T_inicio_pulsacion=millis();//inicializo el tiempo e impido que vuelva a funcionara hasta T_actual valga cero,
   }
   
 //calculo de la duraccion de la pulsación (T_pulsado)T_inicio_pulsacion
 if (T_inicio_pulsacion!=0){
  if (pul_1==LOW && millis()-T_inicio_pulsacion>= 3000){
  P1_larga=1;
  T_inicio_pulsacion=0;
  }
 if (pul_1==LOW&& millis()-T_inicio_pulsacion> 20 && millis()-T_inicio_pulsacion<3000)  {
   P1_corta=1;
   T_inicio_pulsacion=0;
 }
  if (pul_1==LOW&& millis()-T_inicio_pulsacion< 20)T_inicio_pulsacion=0;
 }



 
  if (P1_corta==1){
   for(i=0; i<256; i++){ 
   analogWrite(ledverde,i);
    delay(10);}
 
   P1_corta=0;
}
 if (P1_larga==1){
    for(i=255; i>-1; i--){
    analogWrite(ledverde,i);
    delay(10);
    }
   P1_larga=0;
 }
 

  }

ya no se por donde tirar :frowning:

Lo primero es que deberás aprender a Editar tu primer post porque el tag o etiqueta usado para postear el código no es el correcto. Debe ser reste </> y no el de citas o quote.
Ve a More, luego Modify y estas en modo Edicion. Usa el ultimo icono de la derecha que dice View Source y podrás ver entre corchetes [.quote] al comienzo y [./quote] al final. Yo lo he puesto con . punto decimal para hacerlo visible.
Tu modifica quote por code y luego postea y se verá bien.

Tu respuesta.

//PULSACION
boolean pul_1;
boolean P1_corta;
boolean P1_larga;
int repeat = 10;
  
//temporizacion para pulsadores
      
unsigned long T_inicio_pulsacion = 0;
unsigned long T_apagado10seg     = 0;
unsigned long T_pulsado 		 = 0;


  
void setup(){
	pinMode(ledverde,OUTPUT);
	pinMode(pulsador1,INPUT);


	Serial.begin(9600);  
}

void loop() {

	//leo el estado de las entradas
	pul_1 = digitalRead(pulsador1);

	if (pul_1 && T_inicio_pulsacion == 0) {
		T_inicio_pulsacion = millis();			//inicializo el tiempo e impido que vuelva a funcionara hasta T_actual valga cero,
	}

	//calculo de la duraccion de la pulsación (T_pulsado)T_inicio_pulsacion

	if (T_inicio_pulsacion != 0) {
		if (pul_1) {
			if (millis() - T_inicio_pulsacion > 3000UL) {
				P1_larga = true;
				T_inicio_pulsacion = 0;
			}
			if (millis()-T_inicio_pulsacion < 20)
				T_inicio_pulsacion = 0;
			if (millis()-T_inicio_pulsacion> 20 && millis()-T_inicio_pulsacion<3000) {
				P1_corta = true;
				T_inicio_pulsacion = 0;
			}
		}
	}
 
	if (P1_corta) {
	    for (i=0; i<256; i++) { 
	        analogWrite(ledverde,i);
	    	delay(10);
	    }
	 	P1_corta = false;
		T_apagado10seg = millis()+10000UL; // inicio cuenta x 10 segundos 
	}
	 	
 	if (P1_larga) {
    	for (i=255; i>-1; i--) {
    		 analogWrite(ledverde,i);
    		 delay(10);
    	}
   		P1_larga = false;
 	}
 	if (!T_inicio_pulsacion && !pul_1 && millis() > T_apagado10seg) {// sin gatillo y sin otras operaciones
 																	// espero 10 segundos
 	   digitalWrite(ledverde, LOW);   // simplemente lo apago
 	   T_apagado10seg = millis();
 	}
 }

Te agregué un par de líneas al final y algunas cosas que mejoran la lectura, nada significativo.
Mira a ver si se apaga el led cuando está 10 segundos sin disparar.

lo siento por lo del CODE.

Muchas gracias por la contestacion

lo he probado con el mismo circuito que antes y no funciona.

la idea principal es esta:

El objetivo es:
Pulsando X segundos el pulsador, se encienda el LED de 0 a 255 progresivamente
Mientras esta encendido , hacer una especie de "latido", Bajar la intensidad de 255 a 200 progresibamente y en modo aleatorio. tipo lo que hace esa espada. SaberForge Venom Hero Edition Review - YouTube
Pulsando X segundos el pulsador, se apaga el LED de 255 a 0 progresivamente

Consigo a medias que se encienda y se apague progresivamente, pero con algun problemilla, y el "latido" ni idea de como hacerlo :frowning:

lo he probado con el mismo circuito que antes y no funciona.

Que no funciona?