Interferenze sui pin digitali di arduino

Salve a tutti, posseggo un'arduino mega con collegati 16 ulsanti( ogni pulsante ha VCC GND e OUT)
I pulsanti sono montati in uno scaffale metalico, ho collegato ogni pulsante a 16 porte digitali di arduino, il pulsante piu distante e a circa a 4 metri.
Quando i pulsanti vengono accesi inviano dei dati su seriale su un'altra arduino che poi ricevo su un tablet tramite bluetooth.
Il tutto funziona egreggiamente, il problema e che dietro questo scaffale c'è un macchinario industrale per lavaggio con motori e rele, e quando si avvia il macchinario dietro lo scaffale crea qualche forma di eletteomagnetismo ed è come se i pulsanti venissero premuti e quindi ricevo segnali corretti ma non voluti da me.
Ho scollegato dai pulsanti il cavo che manda il srgnale ad arduino è il problema persiste, e come se si creasse tensione nei cavi mandando il segnale ad arduino come se avessi premuto il tasto.

Mi potreste dare qualche consiglio su cosa fare?
Graziee...

Come hai collegato i pulsanti? Hai messo almeno una resistenza di pull-down?

Questo è uno dei motivi per il quale Arduino non è usabile in ambito civile/industriale, ovvero non ha le certificazioni adatte al suo impiego proprio perché non ha (tra le altre cose) ommunità ai disturbi elettromagnetici, ecc.
Escludendo che non sia una violazione del regolamento usare Arduino in questo contesto (ovvero isolato da macchinari ma influenzato da essi) sicuramente puoi penssare innanzitutto di optoisolare gli ingressi di Arduino per proteggerli e allo stesso tempo non usare le resistenza di pullup interne (INPUT_PULLUP o pin setatto come INPUT e poi la digitalWrite a HIGH su di esso) ma di usare resistenze di pullup/down esterne che garantiscono una miglior immunità ai disturbi. Tutto questo detto senza sapere cosa fa il tuo Arduino e neppure se le cose riportare siano sufficienti ad eliminare il problema. In ogni caso ti consiglio di sostituire l'attuale Arduino con la versione commerciale adatta all'uso in ambito civile/industriale dotata delle necessarie certificazioni per tale uso, fermo restando comunque per una garanzia maggiore l'uso degli optoisolatori.

Ho abilitato le resistente Pullup di Arduino .

Allora dovrei provare prima colegando delle resistenze pulldown per vedere se riesco a rimuovere questi interferenze.

Ok, se cerchi sul forum troverai la discussione (non la ricordo a memoria) dove veniva indicato che le resistenze interne alla MCU risentono maggiormente dei disturbi elettromagnetici, come primo passo puoi sistemare 16 resistenze da 10K, ad esempio, di pullup esterne disabilitando quelle interne e già dovresti trovare giovamento, resta però molto importante optoisolare gli ingressi per non veder andare in fumo la MCU in caso di disturbi più marcati

Arduino è poco più di una shield per l'integrato Atmel e dove i fili dei tuoi pulsanti vanno direttamente nel piedino del chip senza protezione alcuna. Ecco perché come minimo devi mettere delle resistenze da 22k oppure da 10k tra il negativo (dipende se le vuoi in pull-up o pull-down) e i vari ingressi per tenerli bassi (o alti). Se poi il problema non cessa del tutto puoi mettere anche un condensatore da 0.1 tra la massa e ogni ingresso. Buona cosa è usare cavettino schermato ma anche solo un citofonico però twisted, cioè "avvitati tra di loro". Vedrai che andrà tutto a posto.

Grazie davvero a tutti per il vostro supporto, siete davvero meravigliosi.
Comunque intanto provero prima col mettere delle resistenze in pulldown, però non riesco a capire come collegare, perchè dovete pensare che io dall'arduino ho fatto partire due fili 5v e gnd, ogni pulsante e collegato a questa linea con delle connessioni a T, mentre per i segnali ho passato dei cavi unici ovviamente che arrivano alle porte digitali di arduino.
Quello che mi chiedo dove collegare le resistenze, dove sono i pulsanti oppure vicino agli ingressi di arduino?

Vicino agli ingressi di Arduino.

Visto che il tuo attuale programma fa uso delle pullup interne perché vuoi mettere le pulldown esterne e modificare tutta la logica del programma? Metti le pullup esterne, il programma resta identico se non per il fatto di cambiare da INPUT_PULLUP a INPUT.

Scusa, come sarebbe che i pulsanti hanno il VCC e il GND ? ... hano per caso dei led all'interno ?

Comunque, consiglierei anche di usare un contenitore schermato per arduino (metallico, collegato a massa), e se ci sono 4 metri fra i pulsanti e la scheda, anche cavetti schermati (calza a massa e centrale al pulsante, se poi serve anche il VCC, si puo portarlo indipendente, ma se possibile usare cavetti doppi, calza a massa, un filo al centrale ed un filo al vcc, sarebbe ancora meglio) ... poi i condensatori da 100n, come detto da steve-cr, oltre a fare da debounce eliminano anche parte dei disturbi ... se proprio non la risolvi neppure cosi, si puo pensare ad optoisolare i pulsanti con una schedina messa vicino ad arduino (per 16 pulsanti bastano 4 PC844 o altri simili opto quadrupli ed una manciata di resistenze, e' una cosa che si puo assemblare anche al volo su una millefori in pochi minuti ... per avere la totale schermatura servira' ovviamente un secondo alimentatore per i pulsanti, perche' sara' necessario che la parte pulsanti sia isolata galvanicamente dalla parte logica, ma e' sufficente uno di quelli universali a spina)

Etemenanki:
Scusa, come sarebbe che i pulsanti hanno il VCC e il GND ? ... hano per caso dei led all'interno ?

Comunque, consiglierei anche di usare un contenitore schermato per arduino (metallico, collegato a massa), e se ci sono 4 metri fra i pulsanti e la scheda, anche cavetti schermati (calza a massa e centrale al pulsante, se poi serve anche il VCC, si puo portarlo indipendente, ma se possibile usare cavetti doppi, calza a massa, un filo al centrale ed un filo al vcc, sarebbe ancora meglio) ... poi i condensatori da 100n, come detto da steve-cr, oltre a fare da debounce eliminano anche parte dei disturbi ... se proprio non la risolvi neppure cosi, si puo pensare ad optoisolare i pulsanti con una schedina messa vicino ad arduino (per 16 pulsanti bastano 4 PC844 o altri simili opto quadrupli ed una manciata di resistenze, e' una cosa che si puo assemblare anche al volo su una millefori in pochi minuti ... per avere la totale schermatura servira' ovviamente un secondo alimentatore per i pulsanti, perche' sara' necessario che la parte pulsanti sia isolata galvanicamente dalla parte logica, ma e' sufficente uno di quelli universali a spina)

Si sono degli interrutori touch che si illuminano quando toccati ed inviano il segnale ad arduino, ti ringrazio dei consigli.
Siccome volevo provare delle resistenze esterne, dovro collegare la resistenza dal cavo dove viene inviato il segnale all input digitale di arduino?

rinaldover87:
Si sono degli interrutori touch che si illuminano quando toccati ed inviano il segnale ad arduino ...

Aspetta, allora non sono interruttori meccanici ... quindi il debounce potrebbe non servire (ma il condensatore comunque male non gli fa, elimina i disturbi) ... Sai che tipo di uscita hanno (open-collector, NPN, PNP, push-pull), oppure hai un link al pulsante ?

Guarda il link è questo
https://m.aliexpress.com/item/32812608034.html?pid=808_0000_0101&spm=a2g0n.search-amp.list.32812608034&aff_trace_key=d92f91ce986e4fc5a8b38bfb66f6c910-1533220823674-04232-JYZbuNJ&aff_short_key=JYZbuNJ&aff_platform=msite

rinaldover87:
Guarda il link è questo

Aaargh, e che aspettavi a dirlo? Possibile che si debbano tirare fuori le cose con le pinze? Quando avete un problema, voete indicare con precisione i componenti che usate, e come sono collegati?

Quelli sono pulsanti non meccanici a sfioramento, ossia capacitivi, e per di più (direi soprattutto questo è il problema) il loro segnale di uscita è a 3.3V!!!

E poi quelle descrizioni del sito, oddio quanto odio aliexpress ("applicazione del cliente esistente caso: -cappa pannello di comando; -tattile -casa palmare rilevatore di aria ambiente")...

docdoc:
E poi quelle descrizioni del sito, oddio quanto odio aliexpress ("applicazione del cliente esistente caso: -cappa pannello di comando; -tattile -casa palmare rilevatore di aria ambiente")...

La "traduzione" automatica di AliExpress è inguardabile ... usate SEMPRE il sito originale in Inglese dove le descrizioni, di solito, sono abbastanza precise.

Guglielmo

Ma penso che il problema non siano i pulsanti, perchè come ho scritto all'inizio posso anche scollegare i cavetti dai pulsanti e il segnale arriva lo stesso come se fosse stato toccato i pulsante.

Il link non funziona, probabilmente l'hai copiato dall'interno del tuo account ... comunque cercando lo stesso "item number" mi esce questo, e' corretto ?

Se si, dovrebbe usare un AT42QT1012 come sensore (datasheet) ... dato che puo dare al massimo 2mA e li ne dichiarano 500, avranno usato un transistor come uscita (quello marcato 2TY corrisponde alla marcatura SMD di un PNP da 40V 500mA, mentre l'altro SOT23, quello marcato 662K dovrebbe essere, secondo i cataloghi, un regolatore di tensione serie XC6206, quello con l'uscita fissa a 3.3V) ... per cui, anche se tiro ad indovinare dato che non posso vedere le piste, dovrebbe essere un'uscita open-collector PNP, che chiude al 3.3, e che se non c'e' una resistenza di pull-down integrata, rimane flottante da spento ...

Se e' cosi, o lo si usa con una MCU alimentata a 3.3V (ed una pull-down per sicurezza), oppure e' possibile che crei problemi con una a 5V, dato che anche con l'uscita alta, al massimo arriva a 3.3V ... in quelle condizioni, e senza dati certi (il datasheet del pulsante dal sito del produttore e' tutto in cinese, ed anche cercando di tradurre le parti di testo con google, non da alcuna informazione precisa in merito alla configurazione di uscita, ne alcuno schema), ti consiglierei di costruirti una piccola scheda con gli opto, pilotando i led degli opto con i pulsanti, in modo da avere sulle uscite livelli di tensione certi per usarli con una MCU a 5V ... oltretutto con gli opto ti libereresti pure dei disturbi ...

Grazie mille secondo voi questi Opto vanno bene?

Opto pc817

Dovrei aggiungere delle resistenze ?

Si, i PC817 vanno bene (la versione a 4 opto per chip si chiama PC847, se vuoi usare quella, altrimenti ti servono 16 di quelli singoli) ... devi aggiungere ovviamente una resistenza in serie al led per ogni opto, ed una resistenza di pull-up o pull-down lato arduino, dipende da come hai impostato la logica e quindi da come li collegherai ai pin ... il circuito e' talmente semplice che lo puoi montare in pochi minuti anche su un pezzo di millefori ...