Problema con PWM

solo che ci sono problemi:
-apro il serial monitor, digito 20 per fare accendere il led in modo lieve, a questo punto succede che la prima volta che do il numero non cambia nulla, il led rimane spento e non si visualizza il messaggio di risposta da arduino, la seconda volta il valore viene letto ma viene interpretato come un 202, facendo accendere così il led ad una forte intensità, la terza volta che do il 20 in input funziona tutto bene

-provo con 50, la prima volta mi viene restituito valore di 305, la seconda niente, la terza un 505 e la quarta finalmente 50

-PER FARE ANDARE I NUMERI A 3 CIFRE HO MODIFICATO IL TUO CODICE METTENDO 2 PARENTESI GRAFFE DOPO IL CICLO WHILE, SPERO DI AVER FATTO GIUSTO, ALTRIMENTI AI NUM. DI 3 CIFRE VENIVA TRONCATA L'ULTIMA CIFRA

Io uso questa funzione che mi permette di leggere numeri anche senza mandare gli zeri prima.

void acquis(){
  for(i = 0; i < 10; i ++) {  //pulisce il buffer
    buf[i] = 0;
  }
  for(i = 0; Serial.available() > 0; i ++) {  //in caso di errore segnala e esce dalla funzione
    if (i > 10) {
      Serial.println("Errore");
      Serial.flush();
      return;
    }
    buf[i] = Serial.read();  //memorizza nel buffer i dati in arrivo
  }
  if (i > 0){
    T = 0;
    i --;
    for (esp = 0; i >= 0; i --) {  //converte i caratteri del buffer in un numero intero
      T += (buf[i] - 48)*pow(10, esp);
      esp++;
    }
  }

L'ultimo ciclo for può essere sostituito con la funzione atoi(quando ho scritto questo codice non sapevo della sua esistenza).
I problemi che avevi in pratica sono legati al fatto che non pulivi il buffer prima si usarlo e al fatto che non ti affidavi alla velocità della porta per scrivere il buffer.
ciao