Il progetto che sto portando avanti è l'integrazione della scheda Arduino Mega 2560 in una macchina automatizzata che sfrutti tutti i 54 I/O digitali della scheda in modo da sostituire il "classico" PLC.
Dopo aver realizzato una prima versione del software, mi sono anccorao che il processo non era corretto, allora ho comunciato a togliere parti di programma e cavi I/O fino ad ottenere l'anomalia anche con il seguente codice:
Senza collegare alcun cavo, il LED integrato rimane correttamente spento.
Nel momento in cui vado ad inserire un cavo (anche non collegato a niente) nel pin 39, il LED inizia a lampeggiare. Utilizzando il monitor seriale vedo inoltre che viene stampato "Premuto" e "Rilasciato" in maniera casuale.
Pensando fosse un difetto della scheda ho provato a caricare il lo sketch su un'altra scheda uguale ma ho ottenuto lo stesso comportamento, quindi penso sia un problema del codice.
Fare una piccola ricerca qui sul forum si fa fatica ? ? ? Se ne sarà parlato non so quante decine di volte ...
I pin in ingresso del ATmega328P sono ad alta impedenza e quindi NON possono essere lasciati liberi (... pena il captare anche "il batto di ali di una mosca" che passa li vicino), ma va imposta una condizione, o verso massa con una resistenza di pull-down (e quindi il bottone collegato dovrà chiudere verso il Vcc) o verso Vcc con una resistenza di pull-up ( e quindi il bottone collegato dovrà chiudere verso massa).
Per inciso, se usi i bottoni che chiudono verso massa, puoi usare le resistenze di pull-up che già sono all'interno della MCU e che basta attivare da software !
Quando fai la pinMode(), invece di mettere solo INPUT, basta che metti INPUT_PULLUP ed esse vengono automaticamente attivate.
In questo modo il tuo pin sarà sempre HIGH e diventerà LOW quando premi il pulsante verso massa.
Innanzitutto mi scuso se non ho trovato/cercato nel forum ma non sapevo neanche io cosa cercare di preciso...
Ti ringrazio per la chiara risposta data.
Quindi, dove utilizzo bottoni che chiudono verso massa basta dichiarare INPUT_PULLUP nella pinMode() e dovrei risolvere.
Dove ho invece bottoni che chiudono verso il Vcc, da software non posso intervenire? Cosa posso fare nel circuito?
SukkoPera:
Come accennato sopra, metti una resistenza pull-down tra il pin e massa.
Esatto, come detto, se i tuoi bottono sono verso +Vcc, devi mettere quella che si chiama resistenza di pull-down ... ovvero una resistenza, va bene un valore di 4.7 KΩ, tra il pin e la massa. In questo modo il pin sarà normalmente a LOW e, quando il pulsante si chiude, andrà HIGH.
ATTENZIONE ... non trascurare comunque che i pulsanti "reali" (... ovvero NON quelli ideali che uno disegna sulla carta ... ma quelli veri che uno compra) sono soggetti al fenomeno dei "rimbalzi" e quindi introduci nel tuo SW un meccanismo di "debouncing" (cerca su google "Arduino debouncing").