Salve come faccio a far ripetere una sola volta ad Arduino un'azione.
Ad esempio giro la chiave suona per una volta e lampeggia il led e poi non lo fa piu per il resto dello scketch?
cerca di essere più loquace. non si capisce niente.
e metti lo sketch
Hai 2 strade.
Metti l'azione nel setup(), che è una funzione dello sketch che viene eseguita solo 1 volta, oppure usi una variabile di stato che lasci impostata a 0 o false finché non esegui l'azione. Una volta eseguita l'azione, la imposti a 1 oppure true e così non esegui più la porzione di codice interessata.
leo72:
Hai 2 strade.
Metti l'azione nel setup(), che è una funzione dello sketch che viene eseguita solo 1 volta, oppure usi una variabile di stato che lasci impostata a 0 o false finché non esegui l'azione. Una volta eseguita l'azione, la imposti a 1 oppure true e così non esegui più la porzione di codice interessata.
Se metto l'azione nel setup(),se non giro la chiave non parte tutto il resto?
Questa potrebbe essere una possibile soluzione.
void setup() {
int Stato = 0;
int MemStato = 0;
}
void loop ()
{
Stato = digitalRead(pin); // Legge ingresso
if (Stato) {
if (MemStato == 0) {
MemStato = Stato; // memorizza stato
.... codice per lampeggio led // eseguito solo una volta
}
}
.... successivo codice del loop
}
E' sottointeso che da qualche parte del codice devi prevedere di azzerrare la varibaile MemStato
altrimenti sarai costretto a resettare Arduino.
Spero la cosa ti possa essere utile.
overmike:
Questa potrebbe essere una possibile soluzione.
void setup() {
int Stato = 0;
int MemStato = 0;
}void loop ()
{
Stato = digitalRead(pin); // Legge ingresso
if (Stato) {
if (MemStato == 0) {
MemStato = Stato; // memorizza stato
.... codice per lampeggio led // eseguito solo una volta
}
}
.... successivo codice del loop
}E' sottointeso che da qualche parte del codice devi prevedere di azzerrare la varibaile MemStato
altrimenti sarai costretto a resettare Arduino.
Spero la cosa ti possa essere utile.
Grazie fatto
Il codice che ti ha fatto overmike era la seconda soluzione che ti proponevo.
Se il tuo problema si è già concluso allora non aggiungo altro.
Ma se questo codice devi ripeterlo per altri pin, io uso un altro approccio.
All'inizio del loop associo l'ingresso ad una variabile e poi con poche operazioni logiche XOR & AND
vado ricavarmi altre 2 variabili che rappresentano nell'esempio rispettivamente:
- VarStato = stato attuale del pin (0 / 1)
- VarStatoUp = la variazione del livello del da 0 > 1 (solo per un loop)
- VarStatoDown = la variazione del livello del da 1 > 0 (solo per un loop)
All'inizio la cosa sembra un po macchinosa, ma alla lunga il codice successivo ne guadagna di efficienza
e leggibilità. Un banale esempio:
long = Counter;
void loop() {
.....
If (VarStatoUp) Counter += 1; // Con una semplice riga di codice hai un contaimpulsi
.....
}