Led e pulsante

Con lo sketch "Esempi - Digital - Button" alla pressione del pulsante si accende il led e al rilascio si spegne, in che modo si potrebbe modificare per far si che anche se ho sempre il pulsante premuto il led si spegne dopo un tempo impostato nel delay?

Forse questa potrebbe essere una soluzione "grezza", nel primo delay imposto il tempo che resta acceso il led, e nel secondo delay il tempo che passa finchè il led non si accende ancora...

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
    delay(100);

    digitalWrite(ledPin, LOW);
    delay(1000);
  }
  
}

usa millis() vedi http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Spegni il LED dopo x millisecondi. Ciao Uwe

ho modificato in questa maniera, ma se ho il pulsante premuto lampeggia ogni secondo, invece mi serve che come premo il pulsante il led si accende per un secondo e poi si spegne anche se continuo a tenere premuto il pulsante, mentre se premo e lascio il pulsante, il led resta acceso

  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
 unsigned long currentMillis = millis();

  if (buttonState == HIGH) {

 if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis; 



     // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  


  }
  
}

}

Dammi lo sketch intero.

Usa una variabile di stato che segnala che il ciclo LED é terminato. La metti a zero quando il pulsante é lasciato. Accendi il LED solo se il pulsante é premuto e la variabile di stato é zero.

Ciao Uwe

Lo sketch vero e proprio non c’è lo… perché ho usato i due esempi dell’IDE
uno per il pulsante e l’altro come suggerito da te quello con la funzione millis.
Poi prendendo spunto da vari esempi ho utilizzato una variabile per lo stato del led
però succedeva che se premevo il pulsante il led non si accendeva, solo quando
rilasciavo il pulsante si accendeva…

Io vorrei che funzionasse così: (perché ho intenzione di fare un cut off per il cambio del kart
di mio figlio).

Al posto del pulsante vorrei usare una cella di carico per sentire quando inizia la cambiata
(mi serve solo in salita) credo che se ora faccio delle prove con il pulsante sia la stessa cosa.
Quindi se ho deciso che il tempo di cut off è di 5 centesimi di secondi vorrei che se premo il
pulsante e rilascio in modo velocissimo, oppure premo il pulsante e lascio premuto non so
anche per circa un secondo, il led comunque deve rimanere acceso per solo 5 centesimi di secondo,
tutto questo perché in realtà la cambiata a livello meccanico è più lunga di 5 centesimi di secondo

Allora ho riscritto tutto il codice da capo inserendo una fotocellula che intercetta il movimento della leva del cambio... con il pulsante imposto il tempo di cut off ed effettivamente il led resta acceso solo per il tempo impostato nella funzione case, ma solo alla pressione del pulsante, si può fare che con il pulsante imposto i tempi di cut off, e solo quando il sensore viene intercettato richiamo la funzione case in modo che il led resta acceso per il tempo impostato anche se il sensore resta intercettato per un tempo maggiore?

int BUTTON = 4;
int led = 3;


int ContatorePulsantePremuto = 0;                   // Conta il numero di volte che il pulsante è premuto
int StatoPulsante = 0;                              // Stato corrente del pulsante
int StatoPulsantePrecedente = 0;                    // Stato precedente del pulsante

void setup() {
  pinMode(BUTTON, INPUT);                           // Pulsante che imposta il delay del cut off in base alle pressioni
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int sensorValue = digitalRead(2);                 // Dichiaro la variabile della fotocellula collegata al pin 2


  StatoPulsante = digitalRead(BUTTON);              // Legge il valore dell'input e lo conserva

  if (StatoPulsante != StatoPulsantePrecedente) {   // compara lo stato del pulsante attuale con il precedente
    if (StatoPulsante == HIGH) {                    // se lo stato corrente è alto, il pulsante è passato da off a on
      ContatorePulsantePremuto++;                       // se lo stato è cambiato incrementa il contatore



      //      if (sensorValue == 0) {

      switch (ContatorePulsantePremuto) {


        case 1:                                       // controlla se il pulsante è stato premuto una volta
          Serial.println(ContatorePulsantePremuto, DEC);       // stampa il numero di volte che il pulsante è stato premuto
          Serial.println("Tempo di Cut Off 300 millisecondi"); // stampa sulla console il tempo di Cut Off impostato
          digitalWrite(led, HIGH);
          delay(300);
          digitalWrite(led, LOW);
          break;

        case 2:  // controlla se il pulsante è stato premuto due volte
          Serial.println(ContatorePulsantePremuto, DEC);       // stampa il numero di volte che il pulsante è stato premuto
          Serial.println("Tempo di Cut Off 600 millisecondi"); // stampa sulla console il tempo di Cut Off impostato
          digitalWrite(led, HIGH);
          delay(600);
          digitalWrite(led, LOW);
          break;

        case 3:  // controlla se il pulsante è stato premuto due volte
          Serial.println(ContatorePulsantePremuto, DEC);       // stampa il numero di volte che il pulsante è stato premuto
          Serial.println("Tempo di Cut Off 1000 millisecondi"); // stampa sulla console il tempo di Cut Off impostato
          digitalWrite(led, HIGH);
          delay(1000);
          digitalWrite(led, LOW);
          break;

      }
      //     }
    }

  }

  StatoPulsantePrecedente = StatoPulsante;             // Salva lo stato corrente nella variabile che indica lo stato precedente per il loop successivo

  if (ContatorePulsantePremuto > 3) {
    ContatorePulsantePremuto = 0;
    StatoPulsante = 0;
    StatoPulsantePrecedente = 0;

  }
}

Nessuno mi può dare una mano per questo sketch?

void loop()
{
    if (digitalRead(pulsante))
    {
        delay(150);
        if (! digitalRead(pulsante)) return;
        digitalWrite(led,1);
        delay(1000);
        digitalWrite(led,0);
        while (digitalRead(pulsante));
    }
}

cosi accendi il led per un secondo e aspetti che venga lasciato il pulsante, questo è molto semplice, ora il tuo caso reale non sono riuscito ad analizzarlo perché dal phone faccio fatica, fammi sapere.