模拟锥形pH计

简介

土壤的pH值是一个重要的参数,影响着植物的生长。不同的植物,适宜生长的土壤pH值是不一样的。不同的食物,如水果、肉类等,它们的pH值也是不同的。食物的pH值也是一个重要的参数,如通过对肉类pH值的检测,来判断肉类的质量。 对于土壤、食物这类半固体物质,普通pH电极不可直接测量,不然容易导致电极异常甚至损坏。为此,我们推出了这款锥形pH计。该产品的pH电极带有不锈钢针刺护套,可直接刺入半固体物质,因此可方便的测量湿润土壤、食物(如肉类、水果)等物质的pH值,这是普通pH电极不能达到的。 本产品兼容Arduino,即插即用,简单方便,可快速DIY一个pH检测仪,直接测量土壤或食物的pH值。

技术规格

锥形pH电极

信号转接板

引脚说明



锥型pH计信号转接板管脚定义

标号 名称 功能描述
1 A 模拟信号输出端(0~4.0V)
2 + 电源输入正极 (5.0V)
3 - 电源输入负极
4 BNC pH电极连线接口

pH电极特性

pH电极的输出信号为毫伏级的电压,与pH值有着对应关系。25℃时,理想输出电压与pH值的关系如下:

电位差计 (mV) 标称pH 电位差计 (mV) 标称pH
414.12 0.00 59.16 6.00
354.96 1.00 0.00 7.00
295.80 2.00 -59.16 8.00
236.64 3.00 -118.32 9.00
177.48 4.00 -117.48 10.00
118.32 5.00

使用教程

本教程将演示如何使用这款锥形pH计来测量半固体物质(如湿润土壤、食物)的pH值。

准备

组装锥形pH电极

在测量半固体物质前,pH电极必须安装好不锈钢针刺护套。如果是放在标准缓冲液中进行校准,则不锈钢针刺护套可先不安装。待校准完毕以后,再安装。 首先将pH电极的保护液瓶及瓶盖取下,然后拧开并取下固定环。接着小心翼翼的将不锈钢针刺护套装到电极头部,再装上并拧紧固定环。具体的安装操作,请参考下图。



接线图

锥形pH电极组装完毕以后,将电极接到信号转接板上。信号转接板接到Arduino主控器上。接着就可上传样例代码至Arduino主控器。连线请参考下图:



校准

如是第一次使用本产品,或者使用了一段时间,则需要进行校准,减小误差。校准时,如发现电极头部的玻璃球内有气泡,可将电极轻甩几次,使得气泡消失。

  1. 将pH电极插入到pH值为7.00的标准溶液中,等待一分钟后,打开Arduino IDE的串口监视器,可以看到当前打印出的pH值,误差不会超过0.3。记录下此时打印的值,然后与7.00相比,把差值修改到程序中的OFFSET处(差值 = 标准值(7.0) - 打印值)。比如,打印出的pH值为6.88,则差值为0.12,则在样例程序中把#define OFFSET 0.00改成#define OFFSET 0.12。
  2. 清洗pH电极,然后用滤纸吸干残留水迹。将pH电极插入pH值为4.00的校准液中,等待一分钟后,打开Arduino IDE的串口监视器,调整增益电位器,使打印出的pH值尽量稳定在4.00左右。
  3. 清洗pH电极,然后用滤纸吸干残留水迹。这些步骤完成后,校准就完成了,之后pH电极就可用于实际的测量了。

测量半固体物质的pH值

电极校准完毕以后,就可测量食物、湿润土壤等半固体物质的pH值了。 测量时,如发现电极头部的玻璃球内有气泡,可将电极轻甩几次,使得气泡消失。将电极插入被测物后,推荐等待5分钟后读数。 测量半固体物质pH值的方法如下:

样例代码

下载样例代码后,打开Arduino IDE的串口监视器,即可看到结果。

/***************************************************
 DFRobot Gravity: Analog Spear Tip pH Sensor / Meter Kit (For Soil And Food Applications)
 <https://www.dfrobot.com/wiki/index.php/Gravity:_Analog_Spear_Tip_pH_Sensor_/_Meter_Kit_(For_Soil_And_Food_Applications)_SKU:_SEN0249>

 ***************************************************
 This product is used to measure the pH value of the semisolid,such as meat,fruit,moist soil and so on.
 This sample code reads the pH value.

 Created 2017-9-10
 By Jason <jason.ling@dfrobot.com@dfrobot.com>

 GNU Lesser General Public License.
 See <https://www.gnu.org/licenses/> for details.
 All above must be included in any redistribution
 ****************************************************/

 /***********Notice and Trouble shooting***************
 1. This code is tested on Arduino Uno and Leonardo with Arduino IDE 1.0.5 r2 and 1.8.2.
 2. More details, please click this link: <https://www.dfrobot.com/wiki/index.php/Gravity:_Analog_Spear_Tip_pH_Sensor_/_Meter_Kit_(For_Soil_And_Food_Applications)_SKU:_SEN0249>
 ****************************************************/

#define PHSensorPin  A2    //dissolved oxygen sensor analog output pin to arduino mainboard
#define VREF 5.0    //for arduino uno, the ADC reference is the AVCC, that is 5.0V(TYP)
#define OFFSET 0.00  //zero drift compensation

#define SCOUNT  30           // sum of sample point
int analogBuffer[SCOUNT];    //store the analog value in the array, readed from ADC
int analogBufferTemp[SCOUNT];
int analogBufferIndex = 0,copyIndex = 0;

float averageVoltage,phValue;

void setup()
{
    Serial.begin(115200);
    pinMode(PHSensorPin,INPUT);
}

void loop()
{
   static unsigned long analogSampleTimepoint = millis();
   if(millis()-analogSampleTimepoint > 30U)     //every 30 milliseconds,read the analog value from the ADC
   {
     analogSampleTimepoint = millis();
     analogBuffer[analogBufferIndex] = analogRead(PHSensorPin);    //read the analog value and store into the buffer
     analogBufferIndex++;
     if(analogBufferIndex == SCOUNT)
         analogBufferIndex = 0;
   }
   static unsigned long printTimepoint = millis();
   if(millis()-printTimepoint > 1000U)
   {
      printTimepoint = millis();
      for(copyIndex=0;copyIndex<SCOUNT;copyIndex++)
      {
        analogBufferTemp[copyIndex]= analogBuffer[copyIndex];
      }
      averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0; // read the value more stable by the median filtering algorithm
      phValue = 3.5 * averageVoltage + OFFSET;
      Serial.print("Voltage:");
      Serial.print(averageVoltage,2);
      Serial.print("   pH value:");
      Serial.println(phValue,2);
   }
}

int getMedianNum(int bArray[], int iFilterLen)
{
      int bTab[iFilterLen];
      for (byte i = 0; i<iFilterLen; i++)
      {
      bTab[i] = bArray[i];
      }
      int i, j, bTemp;
      for (j = 0; j < iFilterLen - 1; j++)
      {
      for (i = 0; i < iFilterLen - j - 1; i++)
          {
        if (bTab[i] > bTab[i + 1])
            {
        bTemp = bTab[i];
            bTab[i] = bTab[i + 1];
        bTab[i + 1] = bTemp;
         }
      }
      }
      if ((iFilterLen & 1) > 0)
    bTemp = bTab[(iFilterLen - 1) / 2];
      else
    bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
      return bTemp;
}

常见问题

Q1. 如何正确保存pH电极?

Q2. 电极多久需要进行校准?

更多

DFshopping_car1.png DFRobot商城购买链接