Mi sono finalmente deciso a continuare il progetto della mia serra domestica per orchidee.
Avrei due domande molto diverse tra loro.
La prima vorrei creare una keypad con le frecce, il tasto ok e il tasto esc per navigare nei menu.
Pensavo di fare una cosa del genere:
è ancora una cosa molto fantasiosa, non ho idea delle dimensioni delle resistenze e devo ancora provarne la fattibilità...
Posso creare un interrupt quando viene premuto un tasto?
La seconda domanda non centra molto con Arduino.
Ho trovato un alimentatore da 12V 5A switching made in China. Ho provato a regolarlo ed è trimmellabile fino oltre 14.5V e volevo sfruttarlo per il progetto.
Ho già usato un L7805 (con il suo circuito di condensatori e diodo) collegato a questo power supply per alimentare una parte di circuito da massimo 200mA.
Volevo alimentare anche Arduino ma preferirei stabilizzare l'alimentatore (è una cavolata?) e utilizzare un solo L7812 non è sufficiente visto che lavora al massimo a 1A però sotto dissipazione. Volevo evitare dissipatori ed avere un margine di tolleranza e quindi volevo utilizzare due L7812 in parallelo ma ho trovato solo questa soluzione. Come potete vedere nello schema 2 usa tre condensatori enormi che costano almeno 3 euro l'uno e con 12€ mi compro un alimentatore stabilizzato a 1A. Il secondo schema non mi convince molto.
Cosa mi consigliate? Posso mettere dei condensatori un po' più piccolini? Altri circuiti migliori?
Tra l'altro vorrei riutilizzare anche altri due L7812 in parallelo per alimentare un'altra parte di circuito con uno shit register e un UL2003A al quale collegherò 4-5 relè che però non dovrebbero assorbire molto (100mA) se sono stato in grado di leggere il datasheet.
Ciao Uwe. Mi avevi aiutato tantissimo anche l'altra volta Grazie
Quindi dici che non c'è bisogno di mettere un 7812 per stabilizzare perchè l'alimentatore è già stabilizzato?
Per gestire il "keypad" devo per forza andare in polling? Non si può attivare un interrupt se un ingresso analogico scende al di sotto di una soglia?
Puoi usare un interrupt agganciato ad un timer che legge ogni tot il valore del pin analogico e modifica una variabile globale che conterrà un valore corrispondente al tasto premuto. Il tuo sketch non dovrà far altro che leggere quella variabile per sapere quale pulsante è stato premuto.
@Asd0r
Con un operazionale settato come comparatore puoi vedere che la tensione del partitore schedna sotto una certa tensione e azionare un interrupt.
Puoi usare un I2C expander tipo il PCF8574 che ha un uscita interrupt. Lo programmi come entrate, metti i 5 tasti con resistenze pullup o pulldown. Ti servono 2 Pin, A4 e A5 per I2c e un entrata interrupt (pin 2 o pin 3)
Ciao Uwe
non usi frequenti chiamate alla stessa routine di lettura del pin
non blocchi il codice in attesa di avere una lettura dal pin
La variabile è sempre aggiornata in maniera trasparente. Addirittura può anche essere creato un piccolo buffer per memorizzare pressioni dei tasti in sequenza, così da non perdere nessun comando dell'utente.
ma a che ti serve un interrupt?
cerca la libreria analogbutton, mi ricordo che serviva a gestire keypad su un pin analogico.
per i valori delle resistenze :
@leo72: non ho mai gestito i timer in Arduino, ma quello che ho usato io il timer finito di contare chiama un "interrupt del timer" che esegue una subroutine che andrà a verificare l'ingresso per scrivere su una variabile se ho premuto o no il tasto. Quindi interrompo il programma per andare a vedere se c'è stata un pressione di un tasto (che potrebbe non essere stato premuto). Inoltre se il timer dura molto nel frattempo potrei aver inviato più segnali dal keypad e di conseguenza non averli memorizzati. Spero di essermi spiegato.
@BrainBooster: con un interrupt non devo continuamente verificare l'ingresso dei tasti (polling) ogni tot tempo, perchè sono sicuro che quando viene premuto un tasto verrò avvisato dal sistema. Inoltre sono sicuro di non perdere dei tasti che sono stati premuti.
Sono nuovo di Arduino, ma ho programmato qualcosina con un mirco di TI e magari sono completamente diversi.
Mi scusa se ho detto delle cose inesatte =(
Asd0r: @leo72: non ho mai gestito i timer in Arduino, ma quello che ho usato io il timer finito di contare chiama un "interrupt del timer" che esegue una subroutine che andrà a verificare l'ingresso per scrivere su una variabile se ho premuto o no il tasto. Quindi interrompo il programma per andare a vedere se c'è stata un pressione di un tasto (che potrebbe non essere stato premuto). Inoltre se il timer dura molto nel frattempo potrei aver inviato più segnali dal keypad e di conseguenza non averli memorizzati. Spero di essermi spiegato.
No, è una cosa ad un livello inferiore, nel senso che un interrupt è del tutto trasparente al codice dell'utente. Tu non ti accorgi della cosa (ovviamente a meno che nell'interrupt non decida di calcolare le effemeridi dei pianeti per i prossimi 10 anni) ma la CPU esegue un po' del tuo codice, poi si ferma per eseguire l'interrupt, poi continua il tuo sketch. Insomma, il tuo sketch non sa di essersi fermato ma si trova l'operato dell'interrupt come se fosse arrivato dall'esterno.
Pensa che normalmente il micro fa centinaia di cose mentre esegue il tuo sketch, cose che servono per "mandare avanti la baracca". E tu non lo sai.
in parole semplici, immagina questo scenario:
tù devi ricevee una comunicazione a casa e sei li che mentre aspetti leggi un libro.
con il metodo del Polling
dovresti alzarti dalla poltrona ed andare di tanto in tanto a guardare nella cassetta della posta e vedre se c'è qualcosa per tè se c'è la leggi altrimenti ritorni in poltona e riprendi la lettura.
con il metodo dell'Interrupt
ti squilla il telefono, fai un'orecchio al libro ricevi la telefonata e elle fine della comunicazione togli l'orecchio e riprendi la lettura del tuo libro da dove eri arrivato prima che squillasse il telefono.
il secondo è più rapido/semplice no?
purtroppo non si possono usare tutti quei tasti, a causa delle tolleranze delle resistenze e dei limiti di corrente. (sopratutto poi se vuoi prevedere anche le combinazioni di tasti)
si, switch smplifica tutte quelle operazioni di scelta dove ci sono dei casi previsti, credo che sia documentato sul playground.
BrainBooster:
in parole semplici, immagina questo scenario:
tù devi ricevee una comunicazione a casa e sei li che mentre aspetti leggi un libro.
con il metodo del Polling
dovresti alzarti dalla poltrona ed andare di tanto in tanto a guardare nella cassetta della posta e vedre se c'è qualcosa per tè se c'è la leggi altrimenti ritorni in poltona e riprendi la lettura.
con il metodo dell'Interrupt
ti squilla il telefono, fai un'orecchio al libro ricevi la telefonata e elle fine della comunicazione togli l'orecchio e riprendi la lettura del tuo libro da dove eri arrivato prima che squillasse il telefono.
il secondo è più rapido/semplice no?
Infatti mi sembra molto meglio l'utilizzo di un interrupt perchè utilizzare il timer vuol dire fare un polling ogni volta che il timer finisce di contare e la durata del timer è una variabile critica.
L'idea di uwe mi sembra ottima, devo solo capire come utilizzare il PCF8574.
Grazie a tutti.
Edit: tra l'altro ho usato un PCF8574 (per lcd i2c)e quindi potrei collegarli agli stessi ingressi analogici e impostare un indirizzo diverso.
BrainBooster:
anche un timer può scatenare autonomamente un interrupt se configurato per farlo
Il timer scatena un interrupt che va a fare un polling sull'ingresso. Quindi perchè non usare direttamente un interrupt sull'ingresso?
Di per sè funzionerebbe così, rifacendomi al tu esempio: sono seduto in potrona e imposto una sveglia che ogni tot tempo mi ricordi di alzarmi e andare a vedere se è arrivata la posta
Come al solito state rendendo complicata una cosa semplice
Basta inserire all'interno della loop una lettura del ADC, se il valore corrispondo a quello di un tasto si esegue la relativa operazione altrimenti si va avanti con il ciclo, non serve fare altro e tanto meno scomodare gli interrupt.