come cambiare l'intensità di un led

Buongiorno a tutti,
io dovrei fare un programma che se premo per meno di un secondo il pulsante il led si accende a intensità 127 e se lo premo una seconda volta per meno di un secondo il led si spegne, mentre se con il led acceso tengo premuto il pulsante per più di un secondo il led incrementa l'intensità fino al massimo 255(tempo incremento 10 per 50ms) e poi decrementa fino a 30, poi posso riaumentare.
potete darmi una mano?
questo è quello che sono riuscito a fare per il momento:

#define led 5
#define Pulsante 7
boolean puls = LOW;
boolean UltimoStato = LOW;
int temponecessario = 1000;
int stato = 0;
int val = 0;
int vecchio_val = 0;
unsigned long UltimoEventoPulsante = 0;

void setup(){ 
  pinMode(Pulsante, INPUT);                // impostiamo il pin 7 come INPUT per il pulsante 
  pinMode(led, OUTPUT);                    // impostiamo il pin 5 come OUTPUT per il LED 
} 

void loop(){
  val = digitalRead(Pulsante);
  unsigned long tempo = millis();

  if(puls != UltimoStato){
    UltimoEventoPulsante = tempo;
  }
  if(tempo - UltimoEventoPulsante > temponecessario){

    
    if ((val == HIGH) && (vecchio_val == LOW)){
      stato = 1 - stato;                  //CONTROLLA SE è SUCCESSO QUALCOSA
    }
    vecchio_val = val;                    //RICORDA IL VALORE PRIMA VAL
    if (stato == 1) {                     //PREMENDO IL PULSANTE
      analogWrite(led, 127);        //IL LED SI ACCENDE
    }
    else {                                //ALTRIMENTI
      analogWrite(led, 0);         //IL LED SI SPEGNE
    }
    
  }else {
    stato = LOW;
  }


}

Ditemi se non si capisce bene quello che deve venire fuori alla fine.

Grazie in anticipo

La formattazione non ci piace, ma...

Funziona? Cioè almeno spegne o accende?

@Salvorhardin
si, fa qualcosa!, se premo il pulsante il led si accende se lo ripremo si spegne

Mi potete aiutare per favore?

Fai una cosa del genere:

  1. identifica il momento in cui il pulsante viene premuto (lo stato precedente era non premuto) e annota millis() in t0;

  2. se viene lasciato, leggi millis();

  3. se millis()-t0 è minore di 300ms,

  • se l'uscita era a un valore diverso da zero, metti l'uscita a zero
  • se l'uscita era a zero, metti l'uscita a 127;
  1. altrimenti (millis()-t0>=300ms):
  • se up==1 incrementa l'uscita di 2 ogni 100ms fino a 255
    quando lasci metti up=0
  • se up==0 decrementa l'uscita di 2 ogni 100ms fino a 0
    quando lasci metti up=1