PWM 0, ma luce rimane leggermente accesa.

Salve a tutti. Ho cercato per due settimane una discussione specifica come quella che sto scrivendo io, ma senza risultati, mi scuso per un eventuale ripetizione. ::slight_smile:
Come primo progetto ho cercato di creare un pulsante, che ad ogni pressione accende o spegne un led, che poi verrà sostituito da un transistor per pilotare un carico maggiore.
Quello che succede è strano, perchè il progetto funziona, se non fosse che quando si sta spegnendo il led, alla fine vedo che rimane la luminosità molto fioca, nonostante il monitor seriale scriva anche esso 0. Anche resettando la scheda il led è inizialmente completamente spento, quindi ho escluso la possibilità di qualche errore di collegamento o scelta dei componenti.
Un’ altra prova che ho fatto è stata scrivere “-1” invece che “0”, e lo spegnimento avviene, ma in accensione noto uno sbalzo in accensione.
Se qualcuno avesse qualche consiglio da darmi… :slight_smile:

sketch_apr07c.ino (889 Bytes)

Il problema mi pare nel -- postfisso

if ((buttonState == 0) && (luminosita > 0)) {
    analogWrite(ledPin, luminosita -- );
    delay(5);
  }

Entri quando luminosita è 1, quindi fai analogWrite(ledPin,1) e DOPO luminosita diventa 0
Al prossimo ciclo ormai luminosita è 0 e dentro li non entri più.

Intanto grazie, nel frattempo mi sono scervellato per modificare il progetto...ma non cambia il risultato. Quindi il valore "--" è da sostituire o il progetto va modificato con altre variabili?

Fai una semplice prova ... così ti convinci che la analogWrite() funziona come si deve ...
... metti in esecuzione un semplicissimo programma :

#define ledpin 11

void setup() {
}

void loop() {
 analogWrite(ledpin, 0);
 delay(1500);
 analogWrite(ledpin, 64);
 delay(1500);
 analogWrite(ledpin, 128);
 delay(1500);
 analogWrite(ledpin, 192);
 delay(1500);
 analogWrite(ledpin, 255);
 delay(1500);
}

... avrai un ciclo che gira tra spento, 3 livelli di luminosità e acceso ... così puoi verificare il comportamento del LED :wink:

Guglielmo

Grazie gpb01! in questo modo sto vedendo che effettivamente quando il pwm è 0, la luce è completamente spenta, perciò teoricamente la scheda è sana.
Sono ancora bloccato, cercando ancora una soluzione ad uno dei progetti più semplici del mondo... :slightly_frowning_face:

Ho risolto finalmente!!!
Ho scoperto l’ incremento “+=” e “-=”, associati al nuovo int “fadeValue”.

const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  11;      // the number of the LED pin

int val = 0; //val will be used to store state of pin

int old_val = 0;

int buttonState = 0;
int luminosita = 0;
int fadeValue = 1;
void setup() {
 Serial.begin(9600);
 // initialize the LED pin as an output:
 pinMode(ledPin, OUTPUT);
 // initialize the pushbutton pin as an input:
 pinMode(buttonPin, INPUT);
}
void loop() {
 Serial.println(luminosita);
 val = digitalRead(buttonPin);
 //check if input is HIGH

 if ((val == HIGH) && (old_val == LOW)) {
   buttonState = 1 - buttonState;
   delay(10);
 }

 old_val = val;


 if ((buttonState == 1 ) && (luminosita < 254))
 { analogWrite ( ledPin, luminosita += fadeValue );
   delay(5);

 }

 if ((buttonState == 0) && (luminosita > 0)) {
   // turn LED on:
   analogWrite(ledPin, luminosita -= fadeValue);
   delay(5);
 }
}

@Frassica: ti ricordo che in conformità al regolamento, punto 7, devi editare (in basso a destra del post, bottone More → Modify) il tuo post e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

Chiedo scusa, ora è corretto. :slight_smile: