Selettore durata pausa per riduzione consumo

Ciao a tutti, sto costruendo un datalogger, e per ridurre i consumi vorrei mandare in power down la schedina fra un log e il successivo.

Attualmente il datalogger, che si basa su un mini corredato di SD e RTC, funziona, e la pausa la setto con una variabile via software, quindi mi tocca ricompilare tutto ogni volta che voglio cambiarla, l'idea sarebbe di settare la durata di questo intervallo tramite una serie di dip switch che raddoppino la durata della pausa, tipo 1, 2, 4, 8, 16, 32, 64 minuti, ma al momento non ho idea di come implementare questa soluzione.

La prima cosa che mi è venuta in mente sarebbe una serie di resistenze (uno slide non sarebbe preciso) tutte uguali messe in serie dal dip switch, leggo il valore della tensione a valle e calcolo quanti switch sono settati per impostare la pausa, sono molto a digiuno di elettronica, ma penso che una delle porte del mini potrebbe fare questa lettura e fornirmi il dato, giusto?

C'è qualche parola chiave che potrei cercare sul forum per trovare qualcosa di simile già implementato sia per la parte HW che SW?

Vi vengono in mente sistemi più semplici e/o più efficaci?

Esistono integrati/componenti vari che implementano già questa soluzione senza dover fare n mila saldature?

Grazie in anticipo per l'attenzione e per i consigli.

gp

Ciao, effettivamente la soluzione più semplice sarebbe quella di utilizzare un dipswitch ad 8 posizioni e delle resistenze ed in funzione dell'interruttore posto ad ON (basta usare un solo interruttore per volta), tramite la analogRead() di un pin analogico, attribuisci il valore di pausa che desideri. Lo schema potrebbe essere simile a questo che ti ho cercato, vedi "Schema pulsanti per centralina irrigazione" Altro modo che utilizza sempre la analogRead() è l'utilizzo e lettura di un potenziometro o trimmer creando una mappa di valori utilizzando la funzione map() vedi QUI, in questo modo non avresti però un riscontro visivo (nessun interruttore posto ad ON) come nel caso del dipswitch a meno che non implementi il comando di alcuni led che ti segnalano appunto il valore della pausa. Se pensi di utilizzare il potenziometro e di avere la necessità dei led di segnalazione ed hai pochi pin a disposizione puoi utilizzare un port expander ad 8 bit tipo il PCF8574 che viene pilotato in I2C (solo 2 fili SDA ed SCL), QUItrovi il primo esempio che mi è venuto fuori in google. Spero esserti stato utile..... Ciao

Se vuoi risparmiare corrente non ha senso usare un partitore resistivo per immettere un valorre. Consuma troppa corrente.

È meglio usare dei dip-switch e resistenze di 1Mohm come pullup/pulldown.

Ciao Uwe

gporciello:
Attualmente il datalogger, che si basa su un mini corredato di SD e RTC, funziona, e la pausa la setto con una variabile via software, quindi mi tocca ricompilare tutto ogni volta che voglio cambiarla, l’idea sarebbe di settare la durata di questo intervallo tramite una serie di dip switch che raddoppino la durata della pausa, tipo 1, 2, 4, 8, 16, 32, 64 minuti, ma al momento non ho idea di come implementare questa soluzione.

Ricorda che in funzione degli N switch presenti sul dipswitch hai un numero di combinazioni pari a 2N … quindi, se monti un dipswitch a soli 4 switch hai già 16 combinazioni possibili, se ne monti uno a 8 switch addirittura arrivi a 256 combinazioni possibili.

Associando ad ogni combinazione un certo numero di minuti … ecco fatto che semplicemente leggendo 4 o 8 pin cambi il tuo ritardo di 16 o 256 valori.

Come ti dice giustamente Uwe, per limitare i consumi, usi, per ciascuno switch, una resistenza di pull-up da di valore elevato, e fai in modo che quando lo switch è chiuso colleghi il pin a massa. In questo modo, quando leggi i pin, quelli che trovi a LOW sono attivati, quelli che trovi HIGH NON lo sono (… qundi devi lavorare a logica inversa).

Altra soluzione è quella di un potenziometro lineare con gli estermi tra GND e Vcc e il centrale su un pin analogico … leggendo la tesnione sul pin analogico con una analogRead() hai un valore che va da 0 a 1023 che puoi moltiplicare per un fattore a tua scelta per avere i minuti. In questo caso, dovrai fare un po’ di prove e creare una piccola scala graduata attorno al potenziometro per sapere il ritardo che stai impostando :wink:

Guglielmo

Comincio col ringraziarvi tutti per il tempo che mi avete dedicato, ma adesso scattano un po' di domande accessorie... ;-)

@tonid: Ottime segnalazioni, adesso non ho la possibilità di leggere con attenzione, lo farò stasera, ma mi sembra che l'esempio dell'irrigatore possa fare al caso mio. Escluderei l'utilizzo del potenziometro perchè avendo bisogno di relazionare più misure effettuate da diversi datalogger, devo poter settare intervalli relativamente precisi, perchè ho cicli di misura di diversi giorni, e con sfasamenti anche minimi, in breve non avrei più dati allineati.

@uwefed: Scusami, stai sollevando un problema interessante, perchè l'abbattimento dei consumi è un aspetto molto importante per la mia applicazione, ma purtroppo non sono in grado di cogliere le differenze fra i due sistemi di cui parli. Nella mia beata ignoranza, pensavo di poter leggere il valore del partitore resistivo (in realtà io pensavo a una più banale serie di resistenze...) nella sezione setup per impostare la durata del ciclo, per poi in qualche modo chiudere i rubinetti a quella parte di circuito, tanto l'impostazione dell'intervallo è dedicata all'intera sessione di analisi, la necessità di cambiarlo è subordinata a una nuova sessione di analisi che passa per un reset e quindi a una nuova lettura della resistenza, non si può fare? L'alternativa da te suggerita come funzionerebbe?

@gpb01: Il potenziometro non è una soluzione praticabile per le motivazioni già espresse, ma, anche nel tuo caso, purtroppo non sono in grado di cogliere le implicazioni degli altri tuoi suggerimenti. In pratica mi stai suggerendo di implementare un multiplexer? L'idea sarebbe anche interessante, ma lo strumento dovrebbe essere utilizzato da persone che potrebbero avere difficoltà a memorizzare la logica binaria con cui settare gli switch, trovo più immediato il concetto di raddoppio successivo, anche se necessita di più spazio e di più saldature. Per quanto riguarda quello che definisci come "lavorare a logica inversa" fa conto che ho già difficoltà con la logica "normale"... Potresti spiegarmi cosa intendi partendo dallo schema dell'irrigatore che mi ha indicato tonid? Quello ragiona in logica normale o inversa? Mi sembra di capire (scusa se mi esprimo in termini terra terra) che mi suggerisci di collegare ciascun pin in parallelo allo switch che porta a massa e all'alimentazione attraverso una grossa resistenza, giusto? Quindi se lo switch è aperto sul pin leggo la tensione che lascia passare la resistenza, se lo chiudo leggo 0, ho capito bene? e il vantaggio di questa implementazione quale sarebbe? Nella mia idea, usando lo switch per aggiungere resistenze in serie, implementerei la soluzione che tu indichi con il potenziometro, ma avrei scatti "discreti", e quindi con un solo pin leggendo la tensione capisco quanti switch sono on, con la tua modalità ho bisogno di più pin, che non sarebbe un problema insormontabile, soprattutto applicando la logica del multiplexer, ma non capisco cosa ci guadagno sul fronte consumo...

Grazie ancora a tutti.

gp

Ciao, come giustamente ti consigliano uwefed e gpb01 ovvero utilizzare la logica inversa ti consente di risparmiare corrente (consumo) che ovviamente cambierà in funzione degli switch che avrai attivato. Le grandi differenze dallo schema di esempio che ti ho linkato sono: -dallo schema hai un partitore di tensione formato da un numero "n" di resistenze collegate tra Vcc e GND e quindi avrai un consumo fisso con dipswitch tutti in OFF che puoi calcolare con la legge di Ohm I=V/Rtot, ogni volta che andrai ad attivare un dipswitch il consumo aumenterà perchè cortocircuiterà verso massa un numero "n" di resitenze diminuendo il valore totale di resistenza nel ramo (partitore). Il vantaggio è quello di utilizzare solo un pin analogico per la lettura di tutte le pause In questo caso dovrai necessariamente usare tanti dipswitch quante possibili pause ti occorrono. -Nel caso della "logica inversa" il collegamento da fare sarebbe: da Vcc ad una resistenza di alto valore, l'uscita della resistenza va ad un pin arduino e ad un dipswitc, l'uscita del dipswitch va a GND. Con questo collegamento avrai un consumo solo quando il dipswitch è attivo e la lettura del pin corrisponderà allo zero logico. Per implementare questo tipo di configurazione dovrai utilizzare più pin Arduino ma quì entra in gioco la possibilità di risparmiare pin e dipswitch utilizzando il concetto che ti ha esposto gpb01.

Se però hai necessità che l'utente si debba/possa modificare il valore di queste pause in maniera agevole, senza metter mani sulla scheda, potresti pensare ad un commutatore rotativo, ne esistono ad esempio ad 1 via 12 posizioni, fanno uno scatto ad ogni posizione e ci puoi comunque mettere una scala graduata visibile all'utente.....non voglio farti confusione ma darti spunti..... Potresti comunque risparmiare sui consumi calcolandoti bene le resistenze e potresti collegare in questo modo: -ognuna delle uscite la colleghi ad una resistenza verso Vcc, -il comune va ad un pin analogico e ad una resistenza la cui uscita va a GND. Potrai attivare solo un partitore per volta avendo una lettura analogica impostata dalle resistenze ed utilizzi un solo pin. Lato codice puoi fare le letture nel setup come dici, poi a fronte di un reset riaggiornerai automaticamente il valore della pausa Ciao

Ottimo, penso di aver capito.

Mi piace molto la soluzione del commutatore rotativo, da un lato mi occupa solo un pin, dall'altro è semplice da usare per l'utente finale, rimane da capire come dimensionare le resistenze. Il comune del commutatore lo dovrei collegare al pin e al gnd con una resistenza molto alta, diciamo nell'ordine dei Mohm, ma le resistenze delle uscite che vanno a vcc come devono essere, chiaramente scalate, ma alte o basse? tipo 1k, 5k, 10k... andrebbe bene? O sarebbe meglio tenerle basse, diciamo nell'ordine delle centinaia di ohm? Dal punto di vista "eletrico" non ci dovrebberoi essere problemi a valutare le differenze e a calcolare il ritardo corrispondente, ma non capisco ancora bene le conseguenze sul piano del consumo...

gporciello: ... al gnd con una resistenza molto alta, diciamo nell'ordine dei Mohm ...

Attento che i pin analogici, per dare delle letture in tempi accettabili, richiedono che ciò che ci colleghi NON abbia un'impedenza troppo elevata altrimenti il tempo di carica del S/H interno al convertitore ADC diventa eccessivo ...

Guglielmo

ma non capisco ancora bene le conseguenze sul piano del consumo...

Il partitore di tensione è un circuito perennemente alimentato e continuerà a fare consumo (corrente prelevata dalla fonte di alimentazione) anche quando non fai letture via codice...non so se mi sono spiegato. Faccio un esempio estremo, se questo partitore avrà una resistenza totale di 1 ohm ed è alimentato a 5 volt la corrente che consuma (sempre) è di 5 ampere.... Se questo partitore avrà una resistenza totale di 1Mohm ed è alimentato a 5 volt la corrente che consuma (sempre) è di 5 micro ampere.... Di quante pause hai bisogno in tutto? così vediamo di dare dei valori a queste resistenze... Ciao

Mi è venuta un'idea: 'alimentare' il partitore da un pin. In questo modo lo si mette HIGH solo quando si deve fare la misura. L'unica obiezione che mi viene è che la tensione non è garantita, ma si potrebbe ovviare con una seconda lettura analogica direttamente sul pin di output e poi facendo il rapporto tra le due. Che ne pensate? È una baggianata? :-)

Mi è venuta un'idea: 'alimentare' il partitore da un pin. In questo modo lo si mette HIGH solo quando si deve fare la misura. L'unica obiezione che mi viene è che la tensione non è garantita, ma si potrebbe ovviare con una seconda lettura analogica direttamente sul pin di output e poi facendo il rapporto tra le due. Che ne pensate? È una baggianata? :-)

L'idea di alimentare il partitore solo quando serve è buona ma personalmente userei un transistor NPN a valle del commutatore e resistenza pilotandolo da un pin arduino nella fase del setup. Ciao

Faccio il punto della situazione.

la soluzione semplice implicherebbe il selettore con resistenze il più "pesante" possibile compatibilmente con i valori di tensione risultanti che devono essere leggibili dal pin, questo minimizzerebbe l'assorbimento nelle fasi di non lettura, ma la soluzione che taglia la testa al toro sarebbe far alimentare il partitore da un transistor polarizzato da un pin.

Quindi il pin polarizza il transistor nel setup, la rete resistiva viene alimentata e si avvia la fase di lettura delle resistenze, che a questo punto diventano relativamente poco importanti al fine del consumo, e alla fine del setup il pin del transistor viene messo a 0 chiudendo il rubinetto alla rete resistiva come avevo immaginato inizialmente. Direi che è perfetto così.

I valori potrebbero essere 6, tipo 1, 5, 10, 20, 30 e 60 minuti, mi aiutate a scegliere valori di resistenze che mi facciano ottenere delle finestre di tensione ben distinte fra di loro in modo da avere letture non soggette a interpretazioni dubbie?

@guglielmo Mi spiegheresti per favore come valutare questa cosa dell'impedenza? è solo una questione di durata della lettura gestibile magari con un delay più o meno lungo prima della lettura stessao è un problema bloccante?

Grazie a tutti per l'aiuto, siete stati estremamente efficaci.

gp

tonid: L'idea di alimentare il partitore solo quando serve è buona ma personalmente userei un transistor NPN a valle del commutatore e resistenza pilotandolo da un pin arduino nella fase del setup. Ciao

Però il transistor introduce una caduta di tensione che restringe il range di lettura e limita il numero di step possibili. per questo pensavo di usare direttamente il pin. Un mosfet potrebbe ovviare a questo, ma la mia idea era nel mio stile "minimalista" :-)

Grazie comunque per aver apprezzato l'idea!

Un'altra cosa che ho pensato: si potrebbero usare dei contraves.

ciao

Quindi il pin polarizza il transistor nel setup, la rete resistiva viene alimentata e si avvia la fase di lettura delle resistenze, che a questo punto diventano relativamente poco importanti al fine del consumo, e alla fine del setup il pin del transistor viene messo a 0 chiudendo il rubinetto alla rete resistiva come avevo immaginato inizialmente. Direi che è perfetto così.

esatto, sostituirei il transistor con un mosfet (come giustamente dice pippettiello) per evitare la Vce introdotta dal transistor ma il discorso resta valido

I valori potrebbero essere 6, tipo 1, 5, 10, 20, 30 e 60 minuti, mi aiutate a scegliere valori di resistenze che mi facciano ottenere delle finestre di tensione ben distinte fra di loro in modo da avere letture non soggette a interpretazioni dubbie?

Fisserei la resistenza a valle a 10K mentre le altre: -la prima a 1K con una lettura dell'ADC di circa 930 -la seconda a 3,3K con una lettura dell'ADC di circa 769 -la terza a 10K con una lettura dell'ADC di circa 511 -la quarta a 18K con una lettura dell'ADC di circa 365 -la quinta a 47K con una lettura dell'ADC di circa 179 -la sesta a 100K con una lettura dell'ADC di circa 93

Con questi valori puoi tranquillamente farti le letture senza preoccuparti del discorso "impedenza".

Con dei valori di resistenza troppo alti allunghi il tempo necessario alla carica del "condensatore" interno rischiando di superare quello "impostato" per il campionamento ritrovandoti il "condensatore" con una tensione immagazzinata minore a quella alla quale era in realtà sottoposto con l'ovvio risultato di avere delle letture che non corrispondono ai calcoli fatti e non è risolvibile con un delay. Questi dati sono specificati nel datasheet del produttore ma con questi valori non devi preoccuparti di tutto ciò.

ps. i calcoli li ho fatti alla veloce, dovrebbero essere giusti ma fatteli anche tu..

Ciao ciao

Grazie, sto cominciando a preparare la parte HW secondo le vostre specifiche, ma nel frattempo ho grossi problemi SW nel contenere i consumi, aprirò un 3D nella apposita sezione, e per togliermi i dubbi su un mio possibile/probabile errore di valutazione riguardo alla piattaforma scelta, ne aprirò uno anche qui per cercare di capire se posso cambiare qualcosa nelle mie scelte di base.

Per adesso vi ringrazio per l'aiuto, la soluzione che è venuta fuori sarà quella che implementerò, ma devo prima accertarmi di aver scelto i giusti componenti.

A presto e ancora grazie.

gp