Led temporizzato anche con pulsante premuto

Ciao a tutti, ho un problema con uno sketch, dovrei far accendere un led premendo un pulsante per 1 secondo con intensità alta, poi passato il secondo si abbassa l’intensità, il problema è che questo dovrebbe succedere anche se tengo premuto il pulsante ma come vedete nel video non succede, in cosa sbaglio?

#include <SimpleTimer.h>
SimpleTimer timer;

int stato = 0;
void setup() {
  pinMode(7, INPUT_PULLUP);
}

void loop() {
  timer.run();
  if (digitalRead(7) == LOW) {          // controlla che l'input sia HIGH (pulsante premuto)
    stato = 1 - stato;        // e cambia lo stato del led
    if (stato == 1) {
      analogWrite(11, 255);
      timer.setTimeout(1000, seconda);
    }
  }
}

void seconda() {
  analogWrite(11, 10);
}

Per tutto il tempo in cui lo tieni premuto, ad ogni giro del loop il pulsante viene riletto di nuovo ...

Usa una flag (una qualsiasi variabile byte), e la if la condizioni ad entrambe le cose, livello del pin E stato della flag, poi nella if cambi stato alla flag (cosi verra' eseguita solo la prima volta), e con una seconda if ricambi stato alla flag quando il pulsante viene rilasciato (cosi potrai leggerlo di nuovo)

Tipo ...

se pulsante premuto E flag a 0, cambia lo stato E metti la flag a 1 ...
se pulsante rilasciato metti la flag a 0 ...

ho provato però purtroppo dopo aver premuto una volta si blocca come nel video, ecco il codice:

#include <SimpleTimer.h>
SimpleTimer timer;

byte pulsante = 0;

void setup() {
  pinMode(7, INPUT_PULLUP);
}

void loop() {
  timer.run();
  if ((digitalRead(7) == LOW) && (pulsante == 0)) {
    pulsante = 1;
    analogWrite(11, 255);
    timer.setTimeout(1000, seconda);
  }
  if ((digitalRead(7) == HIGH) && (pulsante == 1)) {
    analogWrite(11, 0);
    pulsante == 0;
  }

}


void seconda() {
  analogWrite(11, 10);
}

Solito errore. pulsante == 0; :wink:

solito errore da pivellino :slight_smile: ora va perfettamente

#include <SimpleTimer.h>
SimpleTimer timer;

byte pulsante = 0;

void setup() {
  pinMode(7, INPUT_PULLUP);
}

void loop() {
  timer.run();
  if ((digitalRead(7) == LOW) && (pulsante == 0)) {
    pulsante = 1;
    analogWrite(11, 255);
    timer.setTimeout(1000, seconda);
  }
  if ((digitalRead(7) == HIGH) && (pulsante == 1)) {
    analogWrite(11, 0);
    pulsante = 0;
  }

}


void seconda() {
  analogWrite(11, 10);
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.