Ora vorrei collegare i due pulsanti di apertura e chiusura direttamente al micro, tanto ho la manovella di soccorso se dovesse guastarsi la centralina, secondo voi se faccio un antirimbalzo con resistenza e
Antirimbalzo hardware per pulsanti.
Tranquillamente si', ma forse non hai neanche bisogno di un antirimbalzo, a meno che non usi lo stesso bottone per alzare e abbassare o altre funzioni diverse, al massimo confermi lo stesso comando.
Io ho preferito mantenere i pulsanti collegati al motore della tenda, per disinserirli temporaneamente con dei rele' all'intervento dell'automatismo (non so se hai poi visto il mio progetto, avevo postato il link sul primo thread). Io non ho un backup manuale... Il disinserimento lo faccio per evitare comandi opposti accidentali (es. automatismo che alza e io che premo il pulsante per abbassare).
Ciao,
Il 03/09/2019 23:04, RoV ha scritto:
Ciao, si, ho guardato il tuo progetto ma purtroppo sono moooolto
scrivo e, nonostante sia semplice, ho avuto bisogno di diversi aiuti. Anche io all'inizio volevo lasciare i pulsanti collegati al motore e
quindi in ogni caso riesco a manovrarla, come ho fatto fino all'anno scorso che non avevo il motore :-)
Il 04/09/2019 08:19, LAB ha scritto:
ahh, ok, giusto, non ci avevo pensato.
si tiene premuto, potrei anche fare come quelli degli alza vetri
Il 04/09/2019 09:30, Drizzt do'Urden ha scritto:
Il piu' delle volte dopo l'acquisizione del fronte d'onda del pulsante metto un "delay(30). Se non poui permetterti di fermare per 30 ms il soft. puoi usare il "millis()" con qualche riga in piu'.
G.
Il 04/09/2019 11:55, Giorgio ha scritto:
per ora sto cercando di capire come inserire i pulsanti nel programma senza incasinare tutto e non ci sto riuscendo, sono avvilito.
Il 04/09/2019 18:45, Drizzt do'Urden ha scritto:
Brevemente e in maniera semplice: il tasto lo colleghi tra un pin e massa per cui quando lo premi va' basso. il pin 3 che sara' digitale lo definisci:
pinMode(3, INPUT_PULLUP); nel setup()
ad ogni tasto associ 2 variabili bool: boolean tasto_1=true, tasto_1_old=true; nelle varibili globali
Nel loop(): tasto_1=digitalRead(3); if (!tasto_1 && tasto_1_old) // pressione del tasto /* tasto premuto metti il codice */
tasto_1_old=tasto_1; g.
Il 04/09/2019 11:55, Giorgio ha scritto:
Se ci metti un delay() rischi di beccare anche disturbi, come due spike a distanza 30 mS uno dall'altro Un antirimbalzo, che faccia il suo lavoro, dovrebbe verificare che per ALMENO 20-30mS il pulsante sia premuto Solo allora puoi considerare 'premuto' il pulsante Viceversa, sono solo disturbi o false pressioni
Il 04/09/2019 19:15, Giorgio ha scritto:
Dimenticavo all'interno di /*tasto premuto*/ mettici il ritardo
delay(30);
Il 04/09/2019 18:45, Drizzt do'Urden ha scritto:
Fatti un favore Usa gli interrupt legati allo stato del pin Eviti di pollare tutto il giorno inutilmente Se non sai come fare, meglio, cosi' te li studi da zero Sembrano complicati, ma ni ne' vero
Sul fronte salita/discesa del pin entri nella routine interrupt Dentro, puoi pollare per 20mS verificando tasto premuto
Meglio ancora se lanci un timer a distanza di 100 uSec (ad esempio) e verifichi che il tasto sia premuto, se 20 volte la verifica e' positiva allora 'tasto premuto', giusto per evitare il ciclo di verifica che ti bloccherebbe il flusso del programma
Certo che sti arduini sono una bella schifezza a livello debug Si riesce a far niente Ti consiglio di prendere una qualche scheda che abbia il connettorino jtag, e con un debugger da 50-100 euri cambi decisamente marcia, dal campo 'sconosciuto' entri nel campo del 'tutto visibile'
In tanti anni non e' mai successo. I rimbalzi sono molto ravvicinati e basterebbero anche 20ms... G
Il 04/09/19 19:45, Giorgio ha scritto:
Si, ma un singolo disturbo impulsivo potrebbe comunque essere interpretato come comando se non si verifica la stabilita` per almeno qualche dieci ms.
Il 04/09/2019 19:28, RobertoA ha scritto:
ehhh, facile dirlo quando le cose si sanno :-)
usato per il sensore del vento.
credimi, non hai idea di quanto sia "sconosciuto" per me :-P
Comunque ora mi sto ingarbugliando nel gestire i pulsanti senza incasinare tutto, non riesco a studiare una logica, nel senso che se premo un pulsante, la tenda deve fare quello che voglio io oppure deve farlo solo se non ci sono le condizioni di chiusura? E come inserire il tutto nel programma senza incasinare?
difficile capirle, specialmente con i vari libri che ci sono in giro,
Il 04/09/19 21:29, Drizzt do'Urden ha scritto:
Queste sono specifiche e priorita` che decidi tu, e in base ad esse si disegna la logica.
Il modo piu` semplice e` elencare bene tutte le situazioni (*) in cui ti puoi trovare, gli eventi a cui ti interessa rispondere in ciascuna di esse, e le azioni da compiere in risposta agli eventi.
(*) Per situazione si intende uno stato in cui si puo` permanere per un certo tempo o anche indefinitamente, ad esempio la situazione 'chiusa' puo` durare per sempre, la situazione 'in chiusura' dura finche` non avviene l'evento 'raggiunto finecorsa'
Ora: le pressioni dei pulsanti (eventi pressione) in quali situazioni dovrebbero essere gestite e quali azioni si dovrebbero compiere in risposta ad esse? (nota che un'azione possibile e' anche cambiare la situazione corrente)
Il 04/09/2019 21:39, Claudio_F ha scritto:
Io pensavo di usare i pulsanti senza che nulla interferisse, quindi se
blocchi mi richiudano la tenda, oppure, altra idea, posso usarli solo se non ci sono le condizioni di blocco ma allora devo mettere un interruttore che mi passi il sistema in manuale escludendo tutti i blocchi.
quando servono e che non interferiscano fra loro, cosa che non so ancora fare :-)
Il 04/09/19 21:54, Drizzt do'Urden ha scritto:
Ah, ok, e` simile ad una luce di emergenza a cui sto pensando, che si deve comandare anche con un pulsante indipendentemente dalla presenza o meno della rete.
Ovvio che in qualche modo deve essere distinto il comportamento automatico da quello manuale.
Ma come e quando si passa dall'uno all'altro?
In altre parole, si puo` anche dire al programma che premendo i pulsanti automaticamente ci si mette in modo manuale, ma poi come si esce? Con un timeout? Con un altro pulsante?
E se si usa un apposito pulsante per il cambio modalita`, come si fa a non dimenticarlo in modo manuale?
E' il meno, si scrive un if con due o piu` possibilita` di comportamento, e si usa una variabile per scegliere quale parte eseguire tra le diverse.
if (fase == 0) { fai cose } else if (fase == 1) { fai altre cose } else if (fase == 2) { fai altre cose ancora }
Il 04/09/2019 19:45, Giorgio ha scritto:
Forse in "tanti anni non te ne sei mai accorto" Che non sia mai successo, non e' possibile Qualsiasi tastiera a membrana avrebbe dato problemi Per la semplice legge di Murfi, "quando qualcosa puo' andare storto, stai sicuro che ci andera' nel momento peggiore possibile" Si, 20 mS e' il classico antirimbalzo Ma per un micro, 20 mS sono un bel periodo lunghetto ehhh Pensa ai Teensy 4.0 che sono a 600 MHz, credo faccia un'istruzione ogni
4 colpi di clock, quindi viaggia a 150 Mega-istrussioni/sec, in 20Ms dovresti testare per '3 millioni' di volte il pulsante, diconsi 3 millioni Col metodo barbaro Col metodo intelligente, basta testare il pulsante ogni 100 uS e sei in una 'botte de fero' e la cpu e' libera di fare altroIl 04/09/2019 19:28, RobertoA ha scritto:
chiesto come fa il debug ma quando sono andato da lui per
piace per niente...
Il 04/09/2019 19:28, RobertoA ha scritto:
una cosa del genere si fa col delay?
Il 05/09/2019 10:13, Drizzt do'Urden ha scritto:
E' per testare tante volte il pulsante, senza fermarti per 20mS Supponi di poter attivare un interrupt alla pressione di un tasto Dal momento della prima lettura, devi poi leggere ripetutamente il tasto per almeno 20mS per considerare 'premuto' el botton Le possibilita' sono due o interroghi ripetutamente il pin, ma cosi' facendo ti blocchi li dentro per almeno 20 mS, il che e' male Oppure alla prima pressione tasto, intercettata dalla routine dell'interrupt, resetti una variabile tasto_premuto, fai partire un timer da 100 uS (o 10uS o 200uS insomma fai un po' tu), ed esci subito dalla routine interrupt Ad ogni arrivo del timer (che sara' intercettato da un secondo interrupt) vai a controllare el botton, se ancora premuto, aumenti la variabile di 1, e se sei arrivato a 20, consideri 'premuto' el pulsante E' piu' lungo da spiegare che da fare Il sugo del tutto e' che il codice eseguito all'arrivo dell'interrupt deve essere il piu' breve possibile ed uscire subito Sia quello della routine su pressione tasto, sia quello della routine arrivo timer Usare il delay ti fa fermare il flusso del programma ad attendere la fine del periodo impostato E' come quando vai in salumeria e prendi il biglietto per gli affettati, invece di attendere il tuo turno in fila sprecando il tuo tempo prezioso puoi fare altre cose prendere il tonno i biscotti e via, poi quando 'scatta' il tuo numeretto (interrupt) fai un balzo e torni al bancone salami urlando "toccaaa a meeee...."
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required