Maledetto pullup!

Ciao a tutti, ho un impiantino di domotica da un mio amico che presenta dei problemi..
gli si accendono le luci da sole..
C'è un cavo che va ad ogni deviatore collegato ad un pin analogico (con la pullup interna attivata) che viene mandato a massa quando il deviatore è attivato.
Avevo già visto che entrava un po' di rumore e avevo messo un controllo sulle letture, cioè che se non si manteneva stabile per almeno 200ms veniva scartata...
Ma lui mi dice di avere ancora problemi...
Devo smettere di usare il pullup dell'arduino e provare con qualcosa tipo 1k?

1k mi pare davvero poco; la pull-up interna di Arduino va da 20K a 50K, esterna la puoi mettere di 10K, al limite implementa la libreria bounce.

Aspetta, ma il pin analogico lo stai usando per una lettura digitale? Non ho capito bene.

Sì.. uso l'analogico per comodità perchè sono "staccati" dal cioppo... Provo a dare un occhio alla lib. bounce... può aiutare anche della ferrite?

I deviatori che usi sono vecchi?
potrebbero non fare bene contatto e percui dare letture instabili.
Controlla la tensione sul entrata con un multimetro.
Ciao Uwe

Domani vado a controllare, ma lo escludo perchè ha funzionato tutto bene per un paio di settimane e poi sono iniziati questi problemi... Punto tutto su un pull-up più basso.. provo con i 10k

Guglio:
Domani vado a controllare, ma lo escludo perchè ha funzionato tutto bene per un paio di settimane e poi sono iniziati questi problemi... Punto tutto su un pull-up più basso.. provo con i 10k

Metti anche un condensatore da 1 uf in parallelo al pin d'ingresso, così tagli via moltissimo rumore.

Per curiosità, se usi un pin analogico come digitale, avrai comunque previsto un po' di codice, visto che analogRead ti restituisce una gamma di valori tra 0 e 1023.

menniti:
Per curiosità, se usi un pin analogico come digitale, avrai comunque previsto un po' di codice, visto che analogRead ti restituisce una gamma di valori tra 0 e 1023.

voglio sperare che lo usa come pin digitale e non leggendolo come analogico, altrimenti si complica la vita inutilmente.

Ma i pin analogici A0-A5 possono essere usati come digitali in uscita non in entrata che io sappia; infatti tempo fa consigliai a qualcuno che aveva questa necessità, e che mi disse proprio che non funzionava direttamente, di implementare qualche riga di codice in modo da fare una conversione AD, in pratica bastava considerare i valori da 0 a 200 circa come 0 logico, e da 500 a 1023 come 1 logico, mentre i valori intermedi sarebbero stati non definiti, ricreando così i valori LOW: <=0,9V e HIGH: >=2,5V

Se un pin analogico lo usi come digitale, basta fare digitalRead(A0) oppure (14) e leggi dal pin A0.

The analog input pins can be used as digital pins, referred to as A0, A1, etc.

leo72:
Se un pin analogico lo usi come digitale, basta fare digitalRead(A0) oppure (14) e leggi dal pin A0.

The analog input pins can be used as digital pins, referred to as A0, A1, etc.

Ah, bene, allora ho fatto male a fidarmi, non avendo mai usato questi pin come ingressi digitali, di chi mi diceva che la lettura 0 e 1 non funzionava, ecco perché mi sono preso la briga di studiarmi un accrocchio software per "superare" il problema :zipper_mouth_face:

Gli ingressi analogici sono seconda funzione di PORTC, ecco quello che dice il datasheet in merito a questa porta:

Port C is a 7-bit bi-directional I/O port with internal pull-up resistors (selected for each bit). The
PC5..0 output buffers have symmetrical drive characteristics with both high sink and source
capability. As inputs, Port C pins that are externally pulled low will source current if the pull-up
resistors are activated. The Port C pins are tri-stated when a reset condition becomes active,
even if the clock is not running

Ovvero PORTC è composta da pin digitali con capacità di I/O piena che come seconda funzione diventano ingressi analogici e come terza funzione SDA e SCL (solo PC4 e PC5) per la TWI (I2C).

OK, prometto che mi trovo una insegnante di inglese di lingua madre (ma qualsiasi lingua va bene all'uopo :sweat_smile:) e torno a scuola, non ne posso più di questi cazziatoni che mi fate citando pezzi di datasheet, anche se ormai lo sapete e mi usate il garbo (apprezzatissimo) di scrivere sotto la traduzione in forma non umiliante XD

menniti:
OK, prometto che mi trovo una insegnante di inglese di lingua madre (ma qualsiasi lingua va bene all'uopo :sweat_smile:)

Ti consiglio la supplente ipercurvilinea di Bonolis :grin:

astrobeed:

menniti:
OK, prometto che mi trovo una insegnante di inglese di lingua madre (ma qualsiasi lingua va bene all'uopo :sweat_smile:)

Ti consiglio la supplente ipercurvilinea di Bonolis :grin:

:astonished: :astonished: :astonished: mi autoipnotizzerei, altro che inglese, e chi mi sveglia più :~?

menniti! sempre a tirarmi in mezzo! :slight_smile: ero io che non avevo capito se potevo usare un pin analogico come ingresso digitale, a me non ha funzionato per un incasinamento hw/sf/codice...

alla fine sai come ho risolto? mi servano 2 finecorsa per dirmi quando un motoriduttore arrivava in posizione, tolti i finecorsa, messo un potenziometro e leggo la posizione, risparmiato 1 pin e lettura precisissima col potenziometro

Come detto dagli altri, uso i pin analogici come digitali con digitalRead(A0) ecc
Ho provato a mettere un anello di ferrite sui pin in ingresso sull'arduino, vi saprò dire!!