registrare umidità del terreno da sensore EC-5 decagon

Salve a tutti!
Vorrei provare a registrare i dati in uscita di un sensore dell'umidità del suolo Decagon EC-5.
Secondo le informazioni del produttore, va alimentato per 10 millisecondi con una tensione compresa tra V2.5 e V3.6 con una corrente di A 0.01. In uscita dovrebbe restituire una tensione tra V0.2 a V2
http://www.decagon.com/assets/Uploads/FrequentlyAskedQuestionsabouttheECH2OSoil2.pdf
http://www.decagon.com/assets/Uploads/EC-5-Manual.pdf

Quello che ho provato non ha superato i V0.45 anche bagnando il terreno fino alla saturazione.
Vorrei farvi un paio di domande.

Posso abbassare la tensione (5-1.7=3.3) di un pin digitale con una resistenza? (V1.7/A0.01=Ohm170)
Come posso amplificare il segnale per farlo avvicinare ai V5 dell'analogread e aumentare la precisione di lettura?

Grazie sin da ora.

A mio parere dovresti provare a lavorare con uno stand-alone alimentato direttamente a 3,3V, in tal modo l'uscita digitale è già a tale tensione; bisogna capire se il tuo sensore assorbe 10mA di suo o se tende ad assorbirne di più e per tale ragione la corrente va comunque limitata.
Invece, lavorando a 5V, nel primo caso (corrente assorbita fissa 10mA) potresti anche provocare la caduta di tensione con una R in serie (5V-3,3V)/0,01=170 ohm ma devi essere sicuro di ciò, altrimenti ciò che fai non è controllabile.
La tensione in uscita è più che sufficiente per l'ADC di Arduino, non hai alcuna esigenza di "amplificarla", semmai puoi agire sull'ARef, fornendogli una tensione fissa che diventa il nuovo fondo scala, ed impostando l'opzione software "external" all'analogReference

Ho letto sommariamente il manuale: molto interessante, non credevo che esistesse un sensore del genere.

Calcolare un partitore di tensione su una uscita digitale a 5V capace di garantire 10 mA a 3.3V, non è difficile.

Tuttavia ritengo sia meglio usare un transistor per fornire i 3.3V di Arduino al sensore e comandare la base con una normale uscita digitale.

Questa soluzione è consigliabile poiché il 3.3V sono più stabili e precisi dei 5V.

Ricordati che devi alimentare la sonda per 10ms e con pause piuttosto lunghe (diciamo 500ms).

Inoltre, se vuoi aumentare la precisione delle letture analogiche da 10 a 12 bit esiste un algoritmo piuttosto semplice per farlo.
Rimane valido il consiglio di Michele relativamente ad usare una Aref di 3.3V, poiché l'uscita ha un valore massimo del 60% di 3.3V

Grazie per le risposte!

Un transistor tipo BC 238 va bene? Si trovano facilmente?

Il produttore del sensore consiglia almeno 12 bit per le letture; come si fa a far leggere ad Arduino con 12 bit?

--> Oversampling: Arduino con ADC a 12 bit - geologia & geofisica software solution

Quindi abbassando il riferimento di lettura a 3.3V insieme all'oversampling dovresti raggiungere una buona risoluzione.

Tutti i valori del manuale, compresi quelli di calibrazione, sono riferiti ad una tensione di eccitazione di 2.5V. Ti converrebbe quindi calcolarti la resistenza per ottenere un abbassamento della tensione in modo da raggiungere i 2.5V partendo o da 5V o meglio dai 3.3V come detto da Cyb. :wink:

Il transistor può essere un NPN qualsiasi: il BC238 può andare bene, oppure un altro con la Vce più bassa possibile.

La tecnica per ottenere 12 bit di precisione consiste nell'effettuare 4 letture consecutive (oversampling), sommare i valori delle letture e dividere per 4 (decimazione).

Ti raccomando però di separare le letture con un ritardo di almeno 120 microsecondi (per consentire al condensatore interno di caricarsi).

Ovviamente, mentre viene eseguita la lettura, il sensore deve essere acceso, ovvero la lettura deve ricadere all'interno dei 10 ms di attivazione (o per lo meno così io interpreto la cosa).

Cyb, sicuro di quello che dici? quella che hai descritto è una tecnica di oversampling ma non sono sicuro che serva ad aumentare la risoluzione, me la ricordavo un poco più complicata la cosa... prova a dare un'occhiata al link di Paolo, io in questo momento non ho tempo.

Ho commesso un errore: i campionamenti devono essere 16 e non 4.

Infatti, per aumentare la risoluzione di N volte è necessario campionare 4^N volte, sommare le letture e dividere il risultato per 2^N.

Perciò, se voglio portare la risoluzione a 12 bit (da 10 originali) N=2, i campionamenti da effettuare sono 16 e il risultato della somma va diviso per 4.

Ovviamente, i 16 campionamenti fanno "perdere tempo" al micro per cui la frequenza massima di campionamento si abbassa di conseguenza.

www.atmel.com/Images/doc8003.pdf

Fate riferimento a questo Application Note --> Application Notes | Microchip Technology

EDIT: Battuto sul tempo. :wink:

cyberhs:
Ho commesso un errore: i campionamenti devono essere 16 e non 4.

Infatti, per aumentare la risoluzione di N volte è necessario campionare 4^N volte, sommare le letture e dividere il risultato per 2^N.

Perciò, se voglio portare la risoluzione a 12 bit (da 10 originali) N=2, i campionamenti da effettuare sono 16 e il risultato della somma va diviso per 4.

Ovviamente, i 16 campionamenti fanno "perdere tempo" al micro per cui la frequenza massima di campionamento si abbassa di conseguenza.

www.atmel.com/Images/doc8003.pdf

questo mi torna molto più familiare... :wink:

Mi sa che in 10ms non gniafà a fare 16 letture. :sweat_smile:

Ma no Paolo...

ogni campionamento ci mette diciamo 150 microsecondi (compreso il ritardo di 120 microsecondi tra le letture), sono 16 quindi un totale di 2.4 ms.

Anche ammesso che sia il doppio, ci stimo ampiamente dentro.

Si scusate, mi sono confuso.
Ho preso il dato finale (2.4ms) e l’ho moltiplicato per 16. :roll_eyes:
Invece in 2.4ms fa già tutti e 16 i campionamenti. :roll_eyes:

Quindi una sorta di codice potrebbe essere

int umidityEC5(byte dgpin, byte anpin)
{
      int h = 0;      
      digitalWrite(dgpin,LOW); // per sicurezza imposto il pin LOW
      digitalWrite(dgpin,HIGH);
      delay(10);
      digitaleWrite(dgpin,LOW);
      for (k=0; k<16; k++)
      {
        t0=micros();
        h += analogRead(anpin);
        while (micros()-t0<=120){} // ritardo per la carica del condensatore dell ADC
      }
      return int(h/pow(2,2)); 
}

La funzione dovrebbe restituire un valore compreso tra 0 e 4096.
Non ho testato il codice e non so se compila. :sweat_smile:

scusate la mia ignoranza "elettronica"....potete farmi uno schema del circuito??
vorrei alimentare la sonda con un digital output ...