Ciao ragazzi ho problemi con un Arduino 2009 praticamente nuovo (usato una decina di volte al max): sebbene tutti i pin digitali funzionino bene in uscita, non rilevano nulla in entrata (ad esempio la pressione di un pulsante). Però, se avvicino la mano all'arduino (senza toccarlo) si comporta come se tutti i pulsanti fossero stati premuti a caso. E' una cosa che si può risolvere? Devo consegnare un progetto all'università tra pochi giorni e questo coso che fa le bizze proprio non ci voleva...
Magari è in problema dei pin floating o di debounce, dacci più info ![]()
Beh una funzione di debounce ce l'ho messa:
boolean SwitchClosed(byte Switch){ //Funzione di controllo della PRESSIONE DEI PULSANTI
boolean risposta=false;
if (digitalRead(Switch)==LOW) {risposta=true;};
delay(4); //debounce (si attende che la situazione si stabilizzi)
while (risposta && (digitalRead(Switch)==LOW)) {;}; //Ciclo vuoto, aspettiamo che si riapra il contatto
delay(4); //debounce
while (risposta && (digitalRead(Switch)==LOW)) {;}; //Come sopra
return risposta;
}
Ma non credo sia li il problema... il problema è che se non premo nulla ma avvicino la mano fa tutto quello che gli pare, mentre se premo il pulsante se ne sbatte altamente... penserei a qualche tipo di interferenza, ma sono in un seminterrato in cui non prendono nemmeno i cellulari! Ci sto uscendo matto... =(
Tra l'altro se lo alimento a batteria i pulsanti non funzionano lo stesso, ma è meno sensibile all'avvicinamento della mano. Purtroppo, però, senza la USB attaccata non posso leggere il serial monitor che uso per i messaggi di debug... ![]()
penguin86:
Tra l'altro se lo alimento a batteria i pulsanti non funzionano lo stesso, ma è meno sensibile all'avvicinamento della mano. Purtroppo, però, senza la USB attaccata non posso leggere il serial monitor che uso per i messaggi di debug...
Non hai messo le resistenze di pull up sugli ingressi, se li lasci flottanti non solo non rilevano lo stato logico 0 ma captano tutti i vari disturbi emi, p.e. il 50 Hz di rete, creando falsi azionamenti.
L'ATmega ha delle up interne attivabili a comando, basta che sugli input, tutti quelli che utilizzi, fai un digitalWrite(numero_pin, HIGH) e risolvi il problema.
Grazieeeee! XD
Sarà l'età, mi sto rincoglionendo...
A suo tempo usavo delle resistenze da 1kohm come pull-down sulla breadboard, ma dopo un anno che non uso l'arduino mi sono dimenticato tutto ![]()
Comunque questa delle resistenze interne all'atmega è una bellissima scoperta, mi risparmierà un po' di fatica e di complessità sul circuito finale.
Ora funziona tutto, grazie mille!!
Ciao, veramente Astrobeed ha parlato di pull-up, se ti servono pull-down penso che devi metterle esterne.
menniti:
Ciao, veramente Astrobeed ha parlato di pull-up, se ti servono pull-down penso che devi metterle esterne.
A lui servono delle pull up, infatti il programma assume come tasto premuto lo stato LOW, cioè pulsante/contatto che chiude a GND.
Se è indispensabile controllare lo stato HIGH come chiusura pulsante/contatto allora servono le pull down e in questo caso tocca metterle esterne.
Inutile dire che salvo particolari requisiti di progetto, p.e. interfacciamento con hardware fatto da altri e non modificabile, è sempre meglio usare lo stato LOW come chiusura di un contatto in modo da potersi avvalere delle pull up interne.
Ah, non ho letto lo sketch, ma solo il suo intervento nel quale si riferiva alle p-d dello scorso anno, ecco perché ho precisato.