Ho acquistato questa scheda del modulo sensore per collegarmi a un Arduino nano: http://www.ebay.com/itm/For-Arduino-Liquid-PH-Value-Detection-detect-Sensor-Module -Monitoring-Controller / 321764233326
Ho pensato che le due viti fossero per la calibrazione (punto basso + pendenza), ma sembra che l'operazione sia diversa e non riesco a capire come. Ho due liquidi di riferimento per pH 4.0 e 7.0. Quando metto la sonda in una delle due, ottengo letture. Girando una delle due viti sembra compensare la lettura, quindi ad esempio ho avuto pH 4 = 900 e pH 7 = 1000 (range 0-1023). Girare una delle due viti abbasserebbe leggermente il valore, ma non scende mai sotto i 500 circa.
Quindi quello che posso fare è misurare due punti (4.0 e 7.0) e i rispettivi valori di misurazione. In questo modo potrei calcolare i punti intermedi, ma per quanto ne so il pH non è una scala lineare, ma logaritmica. Se sbaglio, la lettura potrebbe sembrare corretta ma mostra solo 4.0 e 7.0 corretti e non il resto dei valori (al momento non ho il fluido di riferimento 10.0).
Ora passiamo alla seconda vite, quella all'inizio sembrava non fare nulla. Ma poi ho notato che imposta una sorta di valore di soglia, accendendo e spegnendo un LED sulla scheda. Quel LED sembra essere collegato al valore letto, ma è un ulteriore scopo? Calibrazione? Nessuna idea.
Ok, nel migliore dei casi qualcuno ha un modulo uguale e vuole spiegare in dettaglio come funziona. Altrimenti forse alcuni di voi hanno delle idee brillanti su cosa potrei provare per farlo funzionare come voglio io :)
Aggiornamento 09-11-2015
Ho ricevuto feedback dal venditore. Mi ha inviato il seguente ZIP: http://1drv.ms/1MSk1DX. Contiene alcuni file in cinese, ma uno aveva il codice sorgente. L'ho provato sul mio Arduino ma purtroppo i valori non hanno ancora molto senso. A seconda di come giro la manopola sulla stampa, ottengo valori compresi tra 9 e 17 per un liquido che è nella vita reale 7.0. Non ho provato ma dubito che fare un offset -7 sia sensato.
Il codice in sé è piuttosto semplice, prendendo una media di 6 centri di dieci misure consecutive. Le righe interessanti sono queste:
avgValue = 0; for (int i = 2; i<8; i ++) // prendi il valore medio di 6 center sample avgValue + = buf [i]; float phValue = (float) avgValue * 5.0 / 1024/6; // converte l'analogico in millivolt phValue = 3.5 * phValue + Offset;
Forse qualcuno può dare un senso a questo, perché io no. Non capisco la moltiplicazione 5.0 e 3.5 dopo quella. Da dove vengono questi?
Comunque, quando immergo la sonda nel liquido di stoccaggio, il mio normale misuratore precipita a pH 0,5 mentre il software mi dà 17 (che è un valore superiore a quello che ho ottenuto leggendo il mio liquido 7.0) . Quindi o la mia scheda è rotta o questo codice di esempio è inutile.
A proposito, gli schemi possono essere trovati nel file ZIP.
Aggiornamento 11-11-2015
Ho fatto altri esperimenti. Per prima cosa ho scoperto che le letture del modulo aumentavano per un liquido più acido. Quindi ho invertito il valore utilizzando
buf [i] = 1024 - analogRead (SensorPin);
Ok, ora i valori avevano più senso. Quindi ho regolato il piatto in modo che fosse al centro dell'intervallo disponibile. Ho immerso la sonda nel liquido 7.0, ho letto il valore e ho regolato l'offset. Quindi immerso in 4.0, aggiustato il pot in modo che corrisponda a 4.00, ecco i risultati:
pH 7.0 riferimento --> 6.27set offset a: 0.73pH 4.0 reference --> 5.17adjusted the pot quindi il valore legge 4.0 pH 7.0 riferimento --> 5.86
Quindi, come mi aspettavo, la regolazione del piatto rovina anche la misurazione di riferimento 7.0. Ho quindi pensato che potesse essere a causa della pendenza del piatto (se ce ne sarebbe stato uno), quindi sono andato prima al valore più basso per avere la minima differenza. Anche in questo caso le letture:
pH 7.0 riferimento --> 8.70 set offset a: -1.70pH 4.0 riferimento --> 5.17 ha regolato il pot così il valore letto 4.0
Riferimento pH 7.0 --> 5.70
La cosa interessante qui è che il valore 4.0 legge 5.17 in entrambi i casi, anche se il piatto era in una posizione diversa. Non riesco a spiegare perché però.
Per assicurarmi che la sonda sia a posto, ho ricalibrato il mio normale pHmetro, funziona come al solito. Anche questo ha due pentole, una per la calibrazione 7.0 e una per la pendenza 4.0. La calibrazione viene eseguita impostando 7.0, quindi misurando 4.0 e regolando il potenziometro della pendenza. Misurare di nuovo 7.0, cambiare la pentola 7.0, misurare di nuovo 4.0, ecc. Finché i valori non corrispondono ai loro liquidi. Di solito mi ci vogliono circa 3 - 4 loop per farlo bene.
Un altro aggiornamento
Ha preso i due contenitori di fluidi di riferimento e ha iniziato a mescolare. Questo mi ha dato misurazioni nell'intervallo di pH 4-7,5. Misurato anche il liquido di stoccaggio che ha un pH di 1,00. I risultati sono in un foglio Excel: http://1drv.ms/1lkAO6e. La prossima domanda è come convertirlo in una formula adatta?
Aggiornamento 18-11-2015
Lavorando sulla soluzione di @ slash-dev, ecco cosa ho fatto:
Per prima cosa ho abbassato il piatto fino al valore più basso. Le letture (per pH 7.0) sono le seguenti: low = 540 e high = 1017. Codificare come segue:
int rawValue = analogRead (SensorPin); int buf [10]; // buffer per la lettura analogfor (int i = 0; i<10; i ++) // Ottieni 10 valori di esempio dal sensore per uniformare il valore {buf [i] = rawValue; delay (10);} // ordinamento lasciato fuori per ridurre la lunghezza del campione int avgValue = 0; for (int i = 2; i<8; i ++) // prende il valore medio di 6 campioni centrali avgValue + = (buf [i] - CENTER);
In questa fase ovviamente stampo il valore grezzo.
Il cortocircuito del connettore BNC non capisco esattamente, dovrei cortocircuitare l'interno (dove va il pin) o l'esterno del connettore? E breve al GND? Ho usato invece la soluzione di riferimento.
Ora ho aggiunto la formula per determinare la tensione. Per il valore basso che legge 0,10. Ora metto al centro il valore di 540 che porta la lettura della tensione a 0,0, sembra buono.
Ora per il passaggio 2 ho posizionato la sonda nella soluzione di riferimento 4.0. La tensione ora legge 0.48, valore grezzo 637. Comincio a regolare il potenziometro dove la tensione legge 2.25, ci vuole un po 'di regolazione. Raw ora legge 1000.
Ora arriva la parte che non capisco esattamente. Dici che ora possiamo calcolare il pH / V, ma con quali variabili? Voglio dire, -3 / 2,25 risulterà sempre in -1,33 ma non dovrebbe esserci una variabile qui a seconda di quanto ho effettivamente regolato il piatto?
Quando ora inserisco la formula per calcolare il pH come previsto, si legge 4.0 per la soluzione di riferimento 4.0. Ma ora rovina la soluzione 7.0 mentre abbiamo regolato il piatto ma non lo abbiamo compensato per quanto vedo? Ho anche provato le formule del pH regolato, ma immagino che siano destinate al primo codice che abbiamo avuto e non a questo modificato.
Quindi cosa mi manca tra i passaggi 2 e 3 che rovina le cose qui? Inoltre, dichiari che l'inversione sottraendo da 1024 è corretta, ma quando lo faccio le letture della tensione diventano meno.
Un'altra cosa che mi chiedo; se il vaso deve essere un pendio, non dovrebbe essere diverso da quello accanto (dove uno lineare ha più senso)? Perché non lo è, entrambi leggono "W103 / 143C". Nel frattempo, il venditore ne invia gentilmente uno sostitutivo per assicurarsi che non sia un difetto hardware da qualche parte.
Prossimo aggiornamento: :)
Quindi ora sono tornato al mio codice originale per provare i calcoli del pH regolato. Ho usato la soluzione di riferimento 7.0 per calibrare di nuovo e poi ho misurato la soluzione 4.0. Legge 4.1! Ok, non del tutto azzeccato ma neanche male. È una piccola differenza che potrebbe anche derivare dalla sonda, non la più costosa.
Quindi mi chiedo se dovremmo ancora provare a far funzionare l'altro approccio perché per qualche motivo suona meglio (più scientifico?). Comunque, questo è almeno molto meglio di niente :)
Alimentazione USB vs collegata? Un'altra cosa strana sembra accadere quando scollego il Nano dalla porta USB del mio laptop e alimentarlo invece tramite un lampone. Voglio usare I2C per inviare il valore dal Nano all'RPi. Funziona, ma non appena alimento il nano dall'Rpi (5V collegato a vIn), il valore di pH calcolato scende?