Pages: 1 [2]   Go Down
Author Topic: Accendere pin dopo tot secondi di un evento  (Read 1088 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 335
Posts: 23123
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Avrei la necessità di fare quanto segue:

leggo lo stato alto su un pin (x) se non ne segue un altro dopo tot secondi, sempre sul pin x, attivare un altro pin (y).

Qualche suggerimento?
Ripartiamo da qui.

In pseudo-codice:

loop
--leggo il pin
--è HIGH?
----sì - chiamo checkPin

checkPin
--prendo il tempo
--inizio un ciclo
----se il pin non è più HIGH, esco
----quanto è passato? 5 secondi?
----no, torno su
----esco
--quanto tempo è passato? 5 secondi?
----sì, allora accendo il pin Y
Logged


Battipaglia (SA)
Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti.

Forse ho inteso male la richiesta ma io ho capito che alla prima pressione di un pulsante comincio a contare un tempo. Se trascorso un certo ritardo non ricevo una seconda pressione, accendo il led. Se invece ricevo una seconda pressione entro il ritardo prefissato, non succede nulla e si riparte da zero.

In generale non condivido dei cicli che bloccano il loop principale. Questo perchè impedirebbero l'esecuzione di altre funzioni in contemporanea. Magari non è questo il caso ma lo dico solo per esprimere un concetto generale.

Io farei così:

Code:
int led = 13;
int button = 12;
unsigned long startTime;
unsigned long delay = 5000;
bool firstClick;

void setup()
{               
firstClick = true;
pinMode(button, INPUT);     
pinMode(led, OUTPUT);     
}

void loop()
{
if (digitalRead(button) == HIGH)
{
if (firstClick) startTime = millis();

firstClick = !firstClick;
}

if (!firstClick)
{
unsigned long elapsedTime =  millis() - startTime
if (elapsedTime > delay)
{
firstClick = true;
digitalWrite(led, HIGH);
}
}

              // qui posso inserire altro codice che viene comunque eseguito ad ogni ciclo
}

All'inizio firstClick vale true e sono in attesa della prima pressione. Se il pin va HIGH e sono in attesa della prima pressione (firstClick=true), faccio partire il tempo impostando startTime al valore attuale di millis(). In ogni caso cambio il valore di firstClick. In questo modo se era true parte il tempo, altrimenti vuol dire che ho ricevuto la seconda pressione e devo ripartire da zero.

Poi controllo se firstClick è false (vuol dire che sono in attesa della seconda pressione). In questo caso vedo quanto tempo è trascorso (millis() - startTime). Se il tempo trascorso è maggiore del ritardo richiesto (delay = 5000, 5 secondi perchè espresso in millisecondi), accendo il led e rimetto firstClick a true per ripartire da capo.

Come dicevo, dove ho inserito il commento è possibile inserire altro codice che viene eseguito ad ogni ciclo dato che il loop principale gira sempre.

A proposito, non ho capito chi spegne il led...

Non ho provato il codice e magari mi è sfuggito qualcosa. Nel caso, parliamone.

Ciao.
Vittorio.
Logged

Roma (RM)
Offline Offline
God Member
*****
Karma: 3
Posts: 634
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per le soluzioni vedrò di implementarle.
Ma il problema è che il primo click come i successivi possono durare indefinitivamente quindi io ho ragionato sul passaggio da alto a basso, cioè sul rilascio del pulsantino.
Se dopo x secondi non arriva un secondo click accendo il led.

Il led si spegne se arriva un altro click dopo x secondi, cioè dopo che si è acceso.
Logged


Pages: 1 [2]   Go Up
Jump to: