2016年7月27日 星期三

[Arduino] PH meter


前言


最近在學習養海水魚,所以動了敗PH計的需求,在Y拍與沒有屋頂看了幾天後,

想說我沒有在淘寶過東西,上去一看,奶奶個熊,一樣的東西怎麼差了五百塊,

好吧,在大陸買一次看看,最後算一算,含運+跨國手續費,1K有找。


























我買的這款是沒有溫度補償的,建議如果要更加精準的,可以考慮買有溫度補償的,

它會多一支防水溫度計,連接在主板上面,有興趣知道溫度對PH值影響的,可以

GOOGLE一下。



開箱


主板-用來連接PH探頭的BNC接頭,以及增益電路,並與Arduino連接的功用。

























PH電極探頭(不可填充式,消耗品無誤),最左邊那個其實是保養液瓶,可以取下來






























拿掉保養液瓶的樣子,如果長時間不用,要把頭沖乾淨後,放回保養液中。
























主板與Arduino連接的線,紅: VCC ,黑:GND ,黃:Data (類比)

























校正

探頭不能直接使用,必須經過至少2階段校正。


把探頭接上主板


主板與Arduino連接後,會出現藍燈











































拿出另外買的PH 7.0校正液(再強調一次PH與溫度有相關性,本篇暫時忽略,另篇說明)
























校正液口太小,找另一個乾淨容器來裝
























執行程式,記得把黃色線接在A2

/*
 # This sample code is used to test the pH meter V1.1.
 # Editor : YouYou
 # Date   : 2014.06.23
 # Ver    : 1.1
 # Product: analog pH meter
 # SKU    : SEN0161
*/
#define SensorPin A2            //pH meter Analog output to Arduino Analog Input 0
#define Offset 0.00            //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;
}


插入PH7.0校正液







































等待數值穩定,約需要30~60秒








穩定後,將目前的PH與與7相減,以本例來說是7.04-7.00=0.04

將0.04填入Offset ,再次將程式上傳到Arduino。



接下來拿出另一瓶PH4.0 校正液。


因為電路有增益的問題,所以需要做2點校正,我沒有買到PH10校正液,

所以只能做2個點的校正,沒辦法校正大於PH7 那邊的,但理論上結果不會有太大誤差,

我們假設電路輸出是線性的,接下來我們把探頭清洗一下,再插入PH4.01這瓶。




看一下目前的數值,差蠻多的,必須要調整一下增益。


























用一個可以轉到旋鈕的東西,例如尺,來轉到它一下,

它的變化很細微,所以可能要轉不少圈。
























數據開始下降



































快接近了,減慢旋鈕調整速度


再往下調一點























到達指定PH值,等候一下,確認有穩定下來,此時PH探頭拿去清洗一下後,

就可以開始用了,但記得凡事PH探頭要拿來量不同液體時,一定要先清洗,不要

汙染了校正液以及保養液。每個月建議重新校正一次PH探頭。


實際運作畫面




5 則留言:

  1. 如果我PH4、7、10校正液都有買了,做完了PH7和4後,PH10要怎麼做?
    假設放入PH10校正液中,出現9.07,那是不是調螺絲,那這樣的話,PH4還會準嗎?

    回覆刪除
  2. 一般來說,有分為單點校正和二點校正,單點校正是指只校正 PH 7 跟PH 4 or PH 10 ,也就是只選擇酸的那一邊校正 ,或是鹼的那一邊校正。 如果要做二點校正,就會建議在程式中用公式去計算了,而不是單純只調螺絲。

    回覆刪除
  3. 更正一下,是二點校正 ph7 + ph4 or ph10 ,三點校正則是ph 7 + ph 4 + ph 10 ,單點校正則是只校正ph 7

    回覆刪除