problemi con la programmazione

buonasera mi chiamo guglielmo conosco poco di elettronica molto di più di informatica.

Avrei un piccolo problema ho intenzione di creare un programma ce mi permette di temporizzare lo spegnimento di un led con un pulsante cioè appena premo il pulsante passa un minuto ed il led si spegne io ho provato a scrivere il codice però non funziona come deve(sul programma ho usato come prova invece di un minuto un secondo)di seguito vi allego il codice.

const int buttonPin = 2;    
const int ledPin =  13;     


int buttonState = 0;         
int ledState = 0;
void setup() {
  
  pinMode(ledPin, OUTPUT);
  
  pinMode(buttonPin, INPUT);
}

void loop() {

  buttonState = digitalRead(buttonPin);


  if (buttonState == HIGH) {

    digitalWrite(ledPin, HIGH);
    delay(100);
  }
  ledState = digitalRead(ledPin);
  if (ledState == HIGH){
    digitalWrite(ledPin, LOW);    
  }
  else {

    digitalWrite(ledPin, LOW);
  }
}

Prima di tutto, nella sezione in lingua Inglese si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione, poi, non avendolo tu ancora fatto, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo (tuo omonimo)

In merito al tuo programma …
… non capisco bene cosa vuoi fare … e perché tu legga il pin dove è connesso il LED che è un pin di OUTPUT e non di INPUT !

Un altra cosa di cui devi tenere conto è che un bottone “ideale” ha un comportamento ON/OFF perfetto, ma nella “realtà” le cose sono ben diverse. :slight_smile:

Quando tu premi un pulsante quello che VERAMENTE accade è, più o meno, questo:

ed è causato dai “rimbalzi” dei contatti del bottone. Come ben capisci, ad Arduino, quel segnale, risulta come una serie di pressioni e rilasci del bottone in una sequenza molto rapida.

Quindi, se vuoi correttamente identificare la pressione e quindi il successivo rilascio di un bottone, devi mettere in piedi un meccanismo del “debouncing” (… cerca con Google “Arduino Debouncing” per avere più informazioni).

Identificata la corretta pressione il resto sarà banalmente accendere il LED, aspettare il tempo che vuoi aspettare e spegnere il LED.

Guglielmo

if (ledState == HIGH){
    digitalWrite(ledPin, LOW);    
  }
  else {

    digitalWrite(ledPin, LOW);
  }

stai dicendo:

se il led è acceso, spegnilo se invece è spento, spegnilo

E' come dire: se la porta è aperta, chiudila; se la porta è chiusa, chiudila.

Tutto quel blocco equivale quindi a "spegni il led".

Hai un po' incasinato il codice mi sa. Prima di tutto effettua il debouncing come ha detto Guglielmo e poi il codice dovrebbe essere tipo

void loop() {
  stato= digitalRead(bottone) ;
 if(stato) {
   digitalWrite(led,  HIGH) ;
   delay(100);
 } 
 digitalWrite(led,  LOW) ;
}

Non puoi fare la read su di un pin settato in output. Inoltre ricorda che col delay arduino si "blocca" per quel tot di tempo, se invece vuoi fargli fare altro mentre aspetti 1 minuto allora utilizza la funzione millis(). Salvatore

salvatore_94: Non puoi fare la read su di un pin settato in output.

Si, lo puoi fare. Eviti di memorizzare lo stato del pin e usi lui stesso. Sempre abbia senso nella logica del programma. http://forum.arduino.cc/index.php?topic=44446.0

nid69ita:
Si, lo puoi fare. Eviti di memorizzare lo stato del pin e usi lui stesso. Sempre abbia senso nella logica del programma.
http://forum.arduino.cc/index.php?topic=44446.0

Ah questa mi è nuova :slight_smile:
Buono a sapersi, grazie