ciao a tutti, ho voluto fare questo sketch perchè spesso
e volentieri non trovo mai le chiavi del portone cosi ho pensato
che potevo farlo aprire dopo 3 volte che schiacciavo il pulsante.
Lo sketch funziona però qualsiasi persona che schiaccia da giù il
pulsante per x tempo si apre da solo, non ho capito il perchè, vi posto
il codice.
Se il pulsante rimane schiacciato x tempo... il loop lo legge schiacciato ogni volta che viene eseguito e quindi conta 1, 2, 3 ed apre.
Dovresti quindi rilevare sia la pressione che il rilascio del pulsante (attenzione all'antirimbalzo) ed incrementare il contatore ogni volta che hai la sequenza pressione + rilascio.
Certo come sicurezza non è che sia il massimo. Non è che si apre quando suona il postino? Ah... vero... suona sempre DUE volte, ecco come mai hai scelto TRE pressioni
ahahah, in effetti non ho pensato che il postino suonasse 2 volte, va be, nel caso suonasse
3 volte si apre da solo e non mi fa scomodare dal pc
comunque come faccio a farli contare ad arduino per quanto tempo è premuto il pulsante?
cioè con millis, ok, ma non so come fare... riesci a darmi una mano?
biohazard91:
comunque come faccio a farli contare ad arduino per quanto tempo è premuto il pulsante?
Usi un'altra variabile in cui memorizzi il tempo a cui hai letto precedentemente il pulsante. Se la differenza fra il valore corrente di millis e questa variabile non è superiore ad un certo valore, ignori la pressione.
nid69ita:
Sbaglio o la tua descrizione non è completa?
Mi sembra, guardando il codice, che apri se premi 3 volte il pulsante entro 7 secondi
Ho capito bene?
quel 7000 che vedi nel codice mi serve per far si che, se uno mi suona semplicemente senza fare i 3 suoni ravvicinati mi aumenta
la variabile count di uno, in questo modo azzero il conteggio della variabile count dopo 7 sec
nid69ita:
Sbaglio o la tua descrizione non è completa?
Mi sembra, guardando il codice, che apri se premi 3 volte il pulsante entro 7 secondi
Ho capito bene?
quel 7000 che vedi nel codice mi serve per far si che, se uno mi suona semplicemente senza fare i 3 suoni ravvicinati mi aumenta
la variabile count di uno, in questo modo azzero il conteggio della variabile count dopo 7 sec
Ovvero devo suonare 3 volte entro i 7 secondi per far aprire il portone
biohazard91:
comunque come faccio a farli contare ad arduino per quanto tempo è premuto il pulsante?
Usi un'altra variabile in cui memorizzi il tempo a cui hai letto precedentemente il pulsante. Se la differenza fra il valore corrente di millis e questa variabile non è superiore ad un certo valore, ignori la pressione.
scusami se ti rispondo con un'altra domanda, sto solo cercando di capire come fare, ho cercato nel forum e
ho trovato un codice ma non so se fa al caso mio, ve lo posto:
ma non funziona(chiaramente non è completo) perchè se a me servirebbe che se cm - timer è minore di x tempo allora mi aumenta la variabile count di uno, il problema sta nel fatto che se qualcuno tiene premuto il pulsante per un tempo >x il loop fa in modo che la variabile count arrivi a 3 in un attimo e mi fa aprire il portone, non so se mi sono spiegato bene
nid69ita:
Sbaglio o la tua descrizione non è completa?
Mi sembra, guardando il codice, che apri se premi 3 volte il pulsante entro 7 secondi
Ho capito bene?
quel 7000 che vedi nel codice mi serve per far si che, se uno mi suona semplicemente senza fare i 3 suoni ravvicinati mi aumenta
la variabile count di uno, in questo modo azzero il conteggio della variabile count dopo 7 sec
Ovvero devo suonare 3 volte entro i 7 secondi per far aprire il portone
mmmm... effettivamente hai ragione, devo modificare quel 7000 con 2000....
grazie mille, non l'avevo notato
Altra domanda, ma quando leggi il pulsante hai messo un ! ovvero not davanti, perchè il pulsante è LOW quando lo premi o perchè vuoi rilevare quando lo sollevi?
Nel tuo codice originale aumenti count sempre se tasto premuto.
Dovresti farlo solo se il tasto da LOW passa a HIGH (quello cha hai fatto tu) ma poi ritorna a LOW.
Devi perciò avere un altra variabile che ricordi lo stato precedente del pulsante.
Poi dopo mi concentrerei sulla tempistica.
non devi usare un timeout di 7 secondi solo se count è almeno a 1 per azzerare tutto, non ne vedo l'utilità né la praticità. Un timeout è un timeout, quando lo passi resetti anche se count è a 0 o 1 o 3.
devi leggere il valore di millis alla pressione del pulsante, e incrementare count solo se la pressione precedente è stata compiuta ben prima di un tempo predefinito. All'avvio, tale tempo sarà preimpostato a millis-intervallo perché altrimenti la prima pressione sarà ignorata.
nid69ita:
Altra domanda, ma quando leggi il pulsante hai messo un ! ovvero not davanti, perchè il pulsante è LOW quando lo premi o perchè vuoi rilevare quando lo sollevi?
byte readInput = ! digitalRead(input);
if(readInput==HIGH){
Nel tuo codice originale aumenti count sempre se tasto premuto.
Dovresti farlo solo se il tasto da LOW passa a HIGH (quello cha hai fatto tu) ma poi ritorna a LOW.
quel ! l'ho messo per passare dalla logica negativa del citofono a quella positiva perchè ho un segnale a livello alto che mi arriva dal citofono se il buzzer non sta suonando, nel caso in cui suona ho un livello basso.
cosi se suono ho high sul piedino visto che lo sto negando
non devi usare un timeout di 7 secondi solo se count è almeno a 1 per azzerare tutto, non ne vedo l'utilità né la praticità. Un timeout è un timeout, quando lo passi resetti anche se count è a 0 o 1 o 3.
sisi, infatti quel pezzo di codice lo azzera a prescindere che sia 1 o 2, nel caso in cui invece io lo premessi 3 volte si azzera automaticamente dopo aver fatto scattare il relè
leo72:
2) devi leggere il valore di millis alla pressione del pulsante, e incrementare count solo se la pressione precedente è stata compiuta ben prima di un tempo predefinito. All'avvio, tale tempo sarà preimpostato a millis-intervallo perché altrimenti la prima pressione sarà ignorata.
scusami ma sto andando un attimo in casino, riusciresti a metterlo giù al volo?
mi sto leggermente perdendo....
nid69ita:
Devi perciò avere un altra variabile che ricordi lo stato precedente del pulsante.
Poi dopo mi concentrerei sulla tempistica.
Io mi quoto.
Perchè non provi prima a concentrarti sul problema principale, ovvero capire quando il pulsante viene rilasciato (solo in questo caso aumenti count) ?
Logicamente ci sarà ancora problema della tempistica, ma sarà più facile aggiungere questo ulteriore controllo se hai risolto il passaggio precedente (con il tuo codice iniziale, lascia stare la modifica che hai fatto dopo).
nid69ita:
Devi perciò avere un altra variabile che ricordi lo stato precedente del pulsante.
Poi dopo mi concentrerei sulla tempistica.
Io mi quoto.
Perchè non provi prima a concentrarti sul problema principale, ovvero capire quando il pulsante viene rilasciato (solo in questo caso aumenti count) ?
Logicamente ci sarà ancora problema della tempistica, ma sarà più facile aggiungere questo ulteriore controllo se hai risolto il passaggio precedente (con il tuo codice iniziale, lascia stare la modifica che hai fatto dopo).
quindi dovrei fare una variabile che conti per quanto tempo è stato premuto il pulsante e se è meno di un valore allora aumento il count, invece se è di più non faccio nulla giusto?
Un'altra variabile per lo stato del pulsante non serve se implementi il meccanismo di ignorare una seconda pressione se questa avviene prima di un certo lasso di tempo (cosa che ti fa anche da debounce).
sono sempre punto e a capo, non riesco a capire come diavolo fare per ignorare se il pulsante è stato premuto
per un tempo maggiore di x e invece incrementare la variabile count se è minore di x.
ho fatto vari tentativi giocando con millis() e non ci riesco proprio, magari mi sfugge qualcosa, anzi, sicuramente è cosi...
sto cercando di mettere in pratica quel che mi è stato detto da voi ma senza alcun risultato,
forse faccio prima inventarmi qualcos'altro...
se avete un mini pezzo di codice che possa illuminarmi postatelo pure, poi vi offrirò una birra più che volentieri XD
Certo che sente i rimbalzi, ma ti restituisce la durata in microsecondi quindi puoi mettere una durata minima al di sotto della quale lo consideri rimbalzo e lo ignori.
Così facendo puoi anche crearti un "codice", puoi farlo aprire con una sequenza squillo breve - squillo lungo - squillo breve.
Se invece vuoi usare millis(), inizia da una cosa semplice: un programma che ti dice per quanti millisecondi hai tenuto premuto il pulsante. Questo riesci a farlo? Poi lo metteremo come funzione...