Orto idroponico verticale con Arduino – terza parte

Il progetto dell’Orto idroponico verticale con Arduino prevede anche la misurazione del Ph dell’acqua di irrigazione oltre al valore di EC

PhMeter

Per eseguire la misura del Ph abbiamo deciso di utilizzare un PhMeter distribuito da robotics-3d.com installato nel bidone di irrigazione.

Come si presente il PhMeter

Il PhMeter è un oggetto affascinate composto dalla sonda vera e propria per la misura del Ph:

PhMeter DfRobot

che termina elettricamente con un connettore BNC:

PhMeter BNC connector

con cui va connessa all’interfaccia che si occupa di alimentare la sonda e recuperare, adattandoli agli ingressi arduino, i segnali rilevati:

PhMeter interface

E’ su questo componente che va eseguita la taratura del sensore oltre che nello sketch di test.

Il PhMeter per l’Orto idroponico verticale con Arduino

Come già hai letto per i sensori EC prima di inserire un componente in un progetto complesso come l’Orto idroponico verticale con Arduino è buona norma testare il componente in modo indipendente dal progetto stesso.

Questa regola vale ancora di più se il sensore che stai utilizzando è tipo il PhMeter ossia un sensore che necessita di una taratura prima di essere messo in esercizio.

Al WeMake abbiamo dedicato un pomeriggio alla taratura di questo sensore utilizzando la competenza di Paolo, esperto di chimica e misurazioni di Ph, autore del progetto AcidCarousel presentato all’Arduino Day 2015.

La taratura del PhMeter

La taratura di questo tipo di sensori va eseguita utilizzando sostanze di riferimento, ossia campioni di cui è noto il Ph.

Tali soluzioni non sono comprese con il sensore, devi acquistarle a parte. Non avendo a disposizione tali soluzioni abbiamo approfittato delle conoscenze di Paolo per realizzare delle soluzioni acide e basiche usando i fertilizzanti necessari all’Orto idroponico verticale con Arduino ed un PhMetro semiprofessionale, di quello comunemente utilizzato dai rivenditori di materiale per idroponica, per verificare la correttezza del Ph e tarare la sonda.

La taratura va eseguita sia mediante il trimmer multigiri presente sull’interfaccia:

PhMeter interface

sia mediante correzione del valore di offset presente nello sketch:

/*
 # This sample code is used to test the pH meter V1.0.
 # Editor : YouYou
 # Ver    : 1.0
 # Product: analog pH meter
 # SKU    : SEN0161
*/
#define SensorPin A3 //pH meter Analog output to Arduino Analog Input 0
#define Offset 0.25  //deviation compensate
#define LED 13
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth  40    //times of collection
int pHArray[ArrayLenth];   //Store the average value of the sensor feedback
int pHArrayIndex=0;    
void setup(void)
{
  pinMode(LED,OUTPUT);  
  Serial.begin(9600);  
  Serial.println("pH meter experiment!");    //Test the serial monitor
}
void loop(void)
{
  static unsigned long samplingTime = millis();
  static unsigned long printTime = millis();
  static float pHValue,voltage;
  if(millis()-samplingTime > samplingInterval)
  {
      pHArray[pHArrayIndex++]=analogRead(SensorPin);
      if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
      voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
      pHValue = 3.5*voltage+Offset;
      samplingTime=millis();
  }
  if(millis() - printTime > printInterval)   //Every 800 milliseconds, 
                                             //print a numerical, convert 
                                             //the state of the LED indicator
  {
	Serial.print("Voltage:");
        Serial.print(voltage,2);
        Serial.print("    pH value: ");
	Serial.println(pHValue,2);
        digitalWrite(LED,digitalRead(LED)^1);
        printTime=millis();
  }
}
double avergearray(int* arr, int number){
  int i;
  int max,min;
  double avg;
  long amount=0;
  if(number<=0){
    Serial.println("Error number for the array to avraging!/n");
    return 0;
  }
  if(number<5){   //less than 5, calculated directly statistics
    for(i=0;i<number;i++){
      amount+=arr[i];
    }
    avg = amount/number;
    return avg;
  }else{
    if(arr[0]<arr[1]){
      min = arr[0];max=arr[1];
    }
    else{
      min=arr[1];max=arr[0];
    }
    for(i=2;i<number;i++){
      if(arr[i]<min){
        amount+=min;        //arr<min
        min=arr[i];
      }else {
        if(arr[i]>max){
          amount+=max;    //arr>max
          max=arr[i];
        }else{
          amount+=arr[i]; //min<=arr<=max
        }
      }//if
    }//for
    avg = (double)amount/(number-2);
  }//if
  return avg;
}

alla linea 08: definisci il pin analogico a cui colleghi il PhMeter per il test e taratura;

linea 09: indica il valore di offset che  devi variare per ottenere la taratura ottimale, nel mio esempio il valore 0.25 è stato sufficente;

linea 10: imposta il pin a cui è connesso il led usato per le segnalazioni delle fasi dello sketch;

linea 11: imposta l’intervallo, in millisecondi, tra una campionatura e la successiva;

linea 12: imposta il tempo, in millisecondi, tra il print di un messaggio nel monitor seriale d il successivo;

linea 13: definisci la lunghezza dell’arrayusato per memorizzare i campionamenti del sensore;

linee 14-15: definisci l’array pHArray di lunghezza ArrayLenth definito alla linea 13;

linee 16-21: la funzione setup() inizializza la comunicazione seriale e imposta a OUTPUT il LED connesso al pin definito alla linea 10;

linee 24-25: definisci due variabili di tipo static unsigned long ossia variabili di tipo long senza segno, necessari a memorizzare i valori di tempo trascorsi per la campionatura e la visualizzazione;

linea 26: definisci due variabili static float in cui memorizzare i valori di ph e voltaggio rilevati;

linea 27: se il tempo trascorso dall’ultima rilevazione è maggiore del valore impostato in samplingInterval esegui quanto inserito nell’if;

linea 29: leggi il valore analogico della sonda e memorizzalo nella posizione pHArrayIndex dell’array pHArray;

linea 30: se il valore di pHArrayIndex supera la lunghezza prevista reimposti il valore a 0;

linea 31: calcola il valore del voltaggio partendo dal valore restituito dalla funzione avergearray definita alla linea 47;

linea 32: calcola il valore di Ph con la formula 3.5+voltaggio rilevato + Offset;

linea 33: reimposta il valore di samplingTime in modo che al prossimo loop() il suo valore sia inferiore al valore di samplingInterval ed eviti il campionamento del valore di Ph per l’intervallo definito;

linee 35-46: esegui un controllo simile a quello analizzato per la linea 27 e se il tempo trascorso è inferiore al valore di printInterval vuol dire che devi visualizzare sul monitor seriale i valori letti;

linea 47: definisci la funzione avergearray(int* arr, int number) il cui scopo è accettare in ingresso i valori letti dall’array del Ph e il numero di campionamenti da eseguire e restituire un valore di tipo double;

linee 48-51: definisci alcune variabili necessarie alla funzione per eseguire i calcoli necessari;

linee 52-55: se il numero di campionamenti è inferiore a “0” viene restituito un errore sul monitor seriale e 0 come valore calcolato dalla funzione;

linee 56-62: se il valore di campionamenti è inferiore a 5 calcola direttamente il valore da restituire come media tra i valori letti;

linee 63-68: in funzione del controllo eseguito tra l’indice 0 e l’indice 1 dell’arrai definisci qual’è il valore minimo e quale il massimo tra i due e li riassegni alle variabili: min e max;

linea 69: inizia un ciclo for dall’indice 2 per tutta la lughezza dell’array;

linee 70-73: per ciascun valore rilevato lo sommi all’array su cui esegui la media e definisci nuovamente il valore minimo confrontandolo con il minimo già stabilito;

linee 74-77: se il valore non è inferiore al minimo, linea 70, lo confronti son il valore massimo, linea 74, e se rispetta questa condizione definisci un nuovo valore massimo prima di assegnarlo alla variabile amount su cui eseguirai la media;

linea 78: se il valore che stai valutando non è inferiore al minimo o superiore al massimo lo assegni direttamente alla variabile amount con cui eseguirai la media;

linea 82: esegui il calcolo della media e assegnalo ad avg perché possa essere restituito alla funzione loop();

linea 84: restituisci alla funzione loop(9 il valore calcolato;

Sembra complesso ma in fondo è solo il calcolo della media matematica dei valori campionati.

Buona rilevazione.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/orto-idroponico-verticale-con-arduino-terza-parte.html

22 commenti

Vai al modulo dei commenti

  1. Ciao Mauro, ho acquistato anche io questa sonda per integrarla nel mio acquario; per ora controllo temperatura esterna, interna, controllo luci, ecc e avrei voluto tenere sott’occhio il grado di acidità.
    Per la calibrazione dici che è sufficiente una soluzione a ph neutro? Perchè ho visto che il liquido per le lenti a contatto è a ph 7 e potrei sfruttarlo per calibrare la sonda. Oppure dici che ci vogliono anche altre sostanze per avere una migliore calibrazione? Volevo evitare di fare l’acquisto inutilmente. Non ricordo dove ma mi pare di aver letto che fossero “necessarie” una sostanza a ph 7 e una a 4, non so perchè…

    1. Ciao Simone,
      io ho calibrato con l’aiuto di un chimico ed un fisico che avevano a disposizione soluzioni a Ph differenti.
      In ogni caso io proverei con almeno 2/3 campioni per essere certo del risultato

    • dario il 23 Febbraio 2016 alle 08:31
    • Rispondi

    ciao mauro,vorrei acquistare questo prodotto per utilizzarlo nel mio acquario,vorrei sapere una cosa:la sonda ph si può tenere permanentemente in acqua o serve solo a fare dei test a campione una volta ogni tanto???

    1. Ciao Dario,
      la sonda Ph io l’ho tenuta sempre immersa per un anno circa ma alla fine si è sporcata e poi danneggiata, direi che è meglio non lasciarla sempre immersa.

  2. Ciao Mauro, la parte bianca sulla punta della sonda, è piena di un liquido? Perchè la mia è semi-vuota.. non vorrei che quindi si fosse svuotata per qualche motivo nel trasporto.
    Se non sbaglio dovrebbe usare il liquido interno per misurare il ph di quello esterno. O sbaglio? Perciò se dentro non c’è nulla, non ha una base da cui partire…

    1. Scusa il secondo messaggio. Magari ho capito male e ho fatto una stupidata. Magari la parte bianca è solo un tappo di protezione e va tolto 😛 mi sta venendo il dubbio che quindi il liquido di riferimento sia solo dentro la parte azzurra

  3. Risolto. Scusa il disturbo.
    Era uno sciocchezza e non ci avevo pensato

    1. Bene sono contento che tu abbia risolto !!!

    • carlo il 15 Aprile 2016 alle 15:41
    • Rispondi

    esiste una sonda che si puo perennemente lasciare immersa senza problemi?
    grazie

    1. Ciao Carlo,
      a quale tipo di sonda ti riferisci? Temperatura? Ph? EC?

    • luca il 3 Settembre 2016 alle 13:32
    • Rispondi

    Ciao mauro,volevo sapere se questa sonda è adatta anche per misurare il ph del terreno in un serra?

    1. Ciao Luca,
      non l’ho mai provata nel terreno, penso possa farla, ma ti esorto a chiederlo al produttore che solitamente è molto solerte nelle risposte.

    • Simone il 17 Settembre 2016 alle 09:34
    • Rispondi

    Ciao Mauro,ho montato una sonda come quella che hai montato tu,se la immergo nella soluzione tutto ok,quanto vado a metterla in acqua l ultimo valore di lettura(es 1 di 7,01 ) sfarfalla un po..ê normale?

    1. Ciao Simone,
      se ti riferisci alla sonda per Ph è possibile che avvenga. Controlla bene la sua taratura ed eventualmente esegui una serie di campionature tenendo le più significative.

    • Loris il 14 Dicembre 2016 alle 14:25
    • Rispondi

    Ciao Mauro,
    ho acquistato questo dispositivo, e sto leggendo il valore del pH del mio acquario utilizzando il tuo sketch.
    Ho un problema di stabilità: il valore misurato varia di molto (oscilla da 6.70 a 6.95 circa) e molto rapidamente, e mi viene impossibile applicare la correzione.

    è un problema di taratura?
    di campionatura? (ho fatto varie prove cambiando sia il sampling time, che il numero di campioni, ho provto anche con 4 campioni in modo da fare la media diretta)
    di sonda?

    grazie.

    1. Ciao Loris,
      il Ph è una delle cose molto complesse da tarare, ti consiglio di verificare la taratura con diversi liquidi di riferimento e magari confrontando tutto con un Ph Metro professionali.

    • Giusppe il 16 Marzo 2018 alle 08:33
    • Rispondi

    Salve, vorrei utilizzare questa interfaccia per costruire un PHmetro da usare nel laboratorio di chimica della mia scuola, quindi vorrei sapere come “visualizzare” il PH e se ci vuole un’altra scheda per la temperatura. Scusa ma non sono loto esperto in elettronica digitale

    1. Ciao Giuseppe,
      nell’articolo dovrebbe essere descritto come funziona il phMetro, per la temperatura dovrai aggiungerci una sonda esterna.

    • Salvatore il 17 Ottobre 2018 alle 21:50
    • Rispondi

    Ciao Mauro, ti chiedo una mano per realizzare con arduino un misuratore di ec, ph, temperatura e gestire il controllo dell’acqua in automatico e in più attivare delle pompe per creare un impianto aereoponica. Da premettere che non ho ancora niente e che non ho nozione di come funziona arduino, però potrebbe essere una bella sfida. Ti ringrazio anticipatamente

    1. Ciao Salvatore,
      hai già letto i miei articoli sull’automazione di un orto idroponico, ce ne sono un paio, di cui uno è questo.
      Son un ottimo, a mio avviso, punto di partenza.
      Se sei interssato ad un progetto su commissione puoi seguire le istruzioni presenti nella pagina “sostienimi

    • Francesco il 12 Aprile 2020 alle 11:18
    • Rispondi

    Ciao Mauro complimenti per il progetto ph ho necessita di farlo viionare su un display 20×4 con i2c come posso fare
    grazie

    1. Ciao Francesco,
      puoi aggiungere un display del tipo che desideri, usare la libreria LiquidCrystal_I2C ( mi sembra gestisca display di quelle dimensioni ) e dovrai scrivere delle funzioni di visualizzazione dei dati sul display.
      Trovi molti articoli dedicati ai display I2C ed al loro funzionamento da cui puoi prendere spunto.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.