Usare un interruttore al posto di un pulsante

Buongiorno a tutti ,
il mio problema è il seguente:
vorrei far lampeggiare un led una sola volta per 1000ms usando al posto del classico pulsante un'interruttore,quindi avrà una posizione permanente in open e una permanente in close.
Ho provato a scrivere un programma , il problema è che il led continua a lampeggiare all'infinito perchè vede l'interruttore sempre chiuso e non so come farlo lampeggiare solo una volta.
Chiedo il vostro aiuto
Grazie

Se ho capito bene quello che vuole fare é una cosa tipo:
Interruttore spento
Accende
Il led fa 1 lampeggio di 1 secondo
L'interruttore resta on e il led resta spento
Spegne l'interruttore

Se così fosse basterebbe ricordarsi lo stato precedente del l'interruttore con una variabile. Si confronta essa con lo stato attuale. Se sono diversi e attualmente l'interruttore risulta on viene fatto accendere il led, aspettato 1 secondo (si può usare delay() se il programma é solo questo, in alternativa un timer millis()). Si spegne il led, e si aggiorna lo stato precedente del l'interruttore.
Indovinato?
Se volesse un aiuto migliore potrebbe postare lo scratch che ha scritto, per favore

Si ha capito bene,io sono arrivato solo a questo e mi sono bloccato,qual'è la variabile per ricordare?

int ledPin = 8;
int interruttorePin = 9;


void setup() {
 pinMode(ledPin,OUTPUT);
 pinMode(interruttorePin,INPUT);

}

void loop() {
 int statoInterruttore = digitalRead(interruttorePin);
 if(statoInterruttore==HIGH){
     digitalWrite(ledPin, HIGH);
     delay(1000);
     digitalWrite(ledPin, LOW);
 }
 else{digitalWrite,LOW;
 }
}

Basta attendere la riapertura dell'interruttore:

#define in 2
#define LED 13

void setup()
{
pinMode(in, INPUT_PULLUP);
pinMode(LED, OUTPUT);
}

void loop()
{
while(digitalRead(in)); // Attende che venga chiuso a massa, come dire: while(digitalRead(in)==HIGH)
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
while(!digitalRead(in)); // Attende che venga riaperto, come dire: while(digitalRead(in)==LOW)
}

Naturalmente è opportuno mettere un condensatore anti rimbalzi tra l'ingresso e massa (100nF...1uF); non avendone uno a disposizione, si potrebbe modificare il programma alla fine:

while(!digitalRead(in)){delay(200);}

Ti ringrazio Datman ,ho provato il tuo codice e non da segni di vita....come fa a leggere il pulsante se è premuto o meno senza una lettura sul pin in?
Grazie

Devi ovviamente mettere a quel posto dei while(in) --> while( digitalRead(in) ) ...

Guglielmo

Grazie Guglielmo ma non funziona ancora,sicuramente sarà colpa mia ,ho anche provato a scriverlo così :

#define in 2
#define LED 13
int lettura=0;
void setup()
{
pinMode(in, INPUT);
pinMode(LED, OUTPUT);

}

void loop()
{
lettura=digitalRead(in);
while(lettura==HIGH){
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
}
while(lettura==LOW);

}

NO, così NON può funzionare ... la lettura del pulsante va fatta nel while() come ti avevo indicato.

Inoltre, devi anche aggiungere quel delay() che ti ha indicato Datman per fare una specie di "debouncing"!

Guglielmo

Ho corretto. Perdonatemi :slight_smile:
Non ho potuto farlo prima perché, come ho già segnalato, dal telefonino da qualche tempo mi è impossibile fare il login.

Grazie mille, finalmente funziona !

:slight_smile:

un dubbio come mai il while non ha le parentesi graffe per le istruzioni?

Sintassi
while(condizione) {
corpo di istruzioni;
}

Normalmente si mette qualcosa da fare tra le parentesi graffe; io, però, lo uso molto spesso per fare dei punti di attesa: deve solo fermarsi lì, quindi non aggiungo nulla e chiudo con punto e virgola (che, altrimenti, non ci va, salvo tra le istruzioni all'interno delle parentesi).

Questo codice é bloccante. Significa che non puó fare nient altro.

se usi una variabile che dice che il lampeggio é avventuto puoi farlo senza che il sketch si blocca.

int stato lampeggio = 0;

loop()
  {
  lettura=digitalRead(in);
  if ( lettura == 1 and lampeggio == 0)  // interuttore chuso e non ancora lapeggiato
    {
    digitalWrite(LED, HIGH);
    delay(1000);
    digitalWrite(LED, LOW);
    lampeggio = 1;
    }

  if ( lettura == 0 )  // interuttore non azionato
    {
     lampeggio = 0;
    }
  }

Questo codice blocca l' esecuzione per 1 secondo durante il tempo che il LED é acceso. Il resto del Tempo é possibile far controllare qualcos'altro a Arduino.

Se anche durante il lampeggio deve essere fatto qualcosa allora si deve usare millis() per determinare il tempo del lampeggio. L'uso di millis() non vorrei spiegare in questa occasione.
Ciao Uwe

Provo anchio a dire la mia tanto per non farti perdere la fiducia in questo gioco ....ed in più mi alleno a leggere.
questo è quello che hai scritto tu

#define in 2
#define LED 13
int lettura=0;
void setup()
{
pinMode(in, INPUT);
pinMode(LED, OUTPUT);

}

void loop()
{
lettura=digitalRead(in);
while(lettura==HIGH){
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
}
while(lettura==LOW);

}

provo a rifarlo poi sta in te trovare le differenze

#define INTERRUTTORE 2//definisce INTERRUTTORE al pin2 di Arduino
#define LED 13//definisce LED al pin 13 di Arduino

int lettura=0;//variabile per uno scopo(per questo era meglio un byte od ancora meglio un booloean)

void setup()
{
pinMode(INTERRUTTORE, INPUT);//mette il pin2 definito INTERRUTTORE in modalità Entrata
pinMode(LED, OUTPUT);//mette il pin13 definito LED in modalità Uscita

}

void loop()
while(digitalRead(INTERRUTTORE))//FINCHE'leggi interuttore(quindi un valore Alto)
       {
        if(lettura==1)//SE la variabile la leggi 1
          {
            digitalWrite(LED, HIGH);//scrivi sul pin del LED un valore ALTO
          }
        if(lettura==0)//SE la variabile la leggi 0
          {
           digitalWrite(LED, LOW);//scrivi sul pin del LED un valore BASSO
          }
        lettura=1;//alla variabile ASSEGNA un valore ALTO
        delay(1000);//ASPETTA(dormi) 1secondo
        lettura=0;//alla variabile ASSEGNA un valore BASSO
        delay(1000);//ASPETTA(dormi) 1secondo
       }
 else//ALTRIMENTI(se non leggi l'interruttore)
      {
        digitalWrite(LED, LOW);//scrivi sul pin del LED un valore BASSO
       }

Scritto come lo avrei scritto appena comprato Arduino,senza un minimo di basi,così dovrebbe funzionare,ma può fare molto di più.

In definitiva col pulsante ti bastava leggere il tuo dito ed assegnare a LETTURA quello che leggevi
col l'interruttore devi dare tu il valore a LETTURA.

Probabilmente per tutto questo sarò bannato a vita...

Se così ADDIO.

PS

magari per le prime volte ti troverai a fare facili copia incolla ed a vedere il tuo progetto funzionante......ma se ti piace il gioco e vuoi andare avanti, dovrai metterci del tuo.

Ciao

Si hai ragione,il problema è che ci sono molti modi per scrivere un programma che mi fuma il cervello...
Soprattutto guardando i tutorial su youtube a volte non capisco e mi incavolo come una bestia....

Mi sono interessato a questo gioco ad agosto e prima a parte qualche infarinatura sul BASIC imparato col commodore 16 più di 35 anni fà, non sapevo neppure cosa significava il LOOP.

Capisco cosa intendi quando vedi milioni di tutorial su youtube e ti incavoli e ti fuma il cervello,succede anche a me,praticamente tutte le volte che tento di fare un passo in avanti.

Prendi quello che ti dico solo come un supporto morale anchio sono alle prime armi.

In pochi mesi ho imparato tanto e tutto grazie a questi ragazzi che scrivono cose incomprensibili.

Se ti applichi e non molli il colpo vedrai che imparerai anche tu.

Ciao ed in bocca al lupo