溶解氧传感器

简介

这是一款arduino兼容的溶解氧传感器,用于测量水中的溶解氧含量,反应水质状况。可应用于水产养殖、环境检测、自然科学等领域的水质检测。 俗话说,“养鱼先养水,好水养好鱼。”良好的水质,对水生物非常重要。溶解氧 (Dissolved Oxygen) 就是反应水质好坏的重要参数之一。水中的溶解氧值一旦过低,会造成水生物呼吸困难,对其生存造成威胁。 我们推出了一款arduino兼容的溶解氧传感器,用于测量水中的溶解氧含量,反应水质状况,可应用于水产养殖、环境检测、自然科学等领域的水质检测。本产品简单易用,因此DIY一套溶解氧检测仪不再是有难度的门槛。 本产品的溶解氧电极为原电池型电极,无需极化时间,随用随测。填充液与感应膜可更换,维护成本低;信号转接板具有工作电压宽、连线方便、即插即用等特点,可方便的接入到现成的控制系统中使用。 该产品简单易用、兼容性强、代码开源、配套资料详细,可快速应用到所需场景中,为你的水生物守住“生命之源”!

技术规格

溶解氧电极

信号转接板

引脚说明

溶解氧传感器信号转接板管脚定义

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

使用教程

本教程将演示如何使用这款溶解氧传感器。配套的电极处于精密电化学传感器,请仔细阅读本教程,注意步骤与细节。

⚠警告

准备材料

准备电极

使用全新的溶解氧电极之前,需要在膜帽(位于电极头部)中加入0.5mol/L氢氧化钠溶液,作为电极的填充液。如果电极使用有一段时间后,误差明显增大时,需要更换填充液。下面将详细说明如何给溶解氧电极添加填充液。

拧开电极的膜帽盖,倒入0.5mol/L氢氧化钠溶液到膜帽盖中,倒入量大概为膜帽内部容积的三分之二,然后使电极方向与水平面方向垂直,把膜帽套到电极上再拧紧,以溢出一点氢氧化钠溶液为佳。



接线图

电极的填充液加入完毕后,需要进行一次校准。在校准前,请按照下图所示的接线图连接:电极接到信号转接板的BNC接口上,信号转接板接到arduino主控板的模拟口上。

校准电极

为保证精度,初次使用的电极,或者使用了一段时间的电极,需要进行校准。

校准程序

将示例程序复制到Arduino IDE中,选择对应的开发板和端口上传
上传成功后打开串口监视器,设置波特率为115200,进行后续校准步骤

#include <Arduino.h>

#define VREF    5000//若ADC参考电压不为5V,请根据实际情况修改VREF
#define ADC_RES 1024//若ADC分辨率不为1024,请根据实际情况修改ADC_RES

uint32_t raw;

void setup()
{
    Serial.begin(115200);
}

void loop()
{
    raw=analogRead(A1);
    Serial.println("raw:\t"+String(raw)+"\tVoltage(mv)"+String(raw*VREF/ADC_RES));
    delay(1000);
}

单点校准

只校准单一温度下饱和溶解氧对应电压,适用于温度变化不大的测量。

获得饱和溶解氧电压有两种方法,将润湿的探头暴露在空气中,操作方便,精度较低;或将探头浸入饱和氧水中,操作复杂,精度较高。

暴露空气法
  1. 按步骤准备好电极
  2. 将探头在纯净水中润湿,并抖落多余的水珠
  3. 把探头暴露在空气中,保持适当空气流动(不要使用电风扇吹)
  4. 待输出电压稳定后,记录电压,即为当前温度下的饱和电压
饱和氧水法
  1. 按步骤准备电极
  2. 准备一杯纯净水,使用下列其中一种方法制作饱和氧水。
    • 方法A:使用搅拌器、打蛋器,连续高速搅拌10分钟,使溶解氧达到饱和
    • 方法B:使用气泵向水中连续充气十分钟,使溶解氧达到饱和
  3. 停止搅拌或充气,待气泡散尽后将溶解氧探头放入
  4. 放入探头后,保持均匀慢速搅拌,避免产生任何气泡。
  5. 待输出电压稳定后,记录温度和电压

两点校准

  1. 准备两杯纯净水,一杯放入冰箱中冷藏,一杯加热至稍温热,温度应控制在0-40℃之间,否则可能损坏探头。
  2. 取其中一杯,使用下列其中一种方法制作饱和氧水
    • 方法A:使用搅拌器、打蛋器,连续高速搅拌10分钟,使溶解氧达到饱和
    • 方法B:使用气泵向水中连续充气十分钟,使溶解氧达到饱和
  3. 停止搅拌或充气,待气泡散尽后将溶解氧探头放入
  4. 放入探头后,保持均匀慢速搅拌,避免产生任何气泡。
  5. 待输出电压稳定后,记录温度和电压
  6. 对另一杯水进行同样的测量,记录温度和电压

示例程序

请先进行校准,根据校准结果修改程序再上传

#include <Arduino.h>

#define DO_PIN A1

#define VREF 5000    //若ADC参考电压不为5V,请根据实际情况修改VREF
#define ADC_RES 1024 //若ADC分辨率不为1024,请根据实际情况修改ADC_RES

#define TWO_POINT_CALIBRATION 0 //单点校准设置为0,两点校准设置为1

#define READ_TEMP (25) //填写当前水温℃,如果有温度传感器可以填相应获取温度的函数

//单点校准只需要填写CAL1_V和CAL1_T
#define CAL1_V (1600) //单位为mv
#define CAL1_T (25)   //单位℃
//两点校准需要填写CAL2_V与CAL2_T,CAL1是高温校准点,CAL2是低温校准点
#define CAL2_V (1300) //单位为mv
#define CAL2_T (15)   //单位℃

const uint16_t DO_Table[41] = {
  14460, 14220, 13820, 13440, 13090, 12740, 12420, 12110, 11810, 11530,
  11260, 11010, 10770, 10530, 10300, 10080, 9860, 9660, 9460, 9270,
  9080, 8900, 8730, 8570, 8410, 8250, 8110, 7960, 7820, 7690,
  7560, 7430, 7300, 7180, 7070, 6950, 6840, 6730, 6630, 6530, 6410
};

uint8_t Temperaturet;
uint16_t ADC_Raw;
uint16_t ADC_Voltage;
uint16_t DO;

int16_t readDO(uint32_t voltage_mv, uint8_t temperature_c)
{
#if TWO_POINT_CALIBRATION == 0
  uint16_t V_saturation = (uint32_t)CAL1_V + (uint32_t)35 * temperature_c - (uint32_t)CAL1_T * 35;
  return (voltage_mv * DO_Table[temperature_c] / V_saturation);
#else
  uint16_t V_saturation = (int16_t)((int8_t)temperature_c - CAL2_T) * ((uint16_t)CAL1_V - CAL2_V) / ((uint8_t)CAL1_T - CAL2_T) + CAL2_V;
  return (voltage_mv * DO_Table[temperature_c] / V_saturation);
#endif
}

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  Temperaturet = (uint8_t)READ_TEMP;
  ADC_Raw = analogRead(DO_PIN);
  ADC_Voltage = uint32_t(VREF) * ADC_Raw / ADC_RES;

  Serial.print("Temperaturet:\t" + String(Temperaturet) + "\t");
  Serial.print("ADC RAW:\t" + String(ADC_Raw) + "\t");
  Serial.print("ADC Voltage:\t" + String(ADC_Voltage) + "\t");
  Serial.println("DO:\t" + String(readDO(ADC_Voltage, Temperaturet)) + "\t");

  delay(1000);
}

上传完成后,打开串口监视器,设置波特率为115200,可以看到如下输出结果

Temperaturet:    25    ADC RAW:    215    ADC Voltage:    1049    DO:    5413    
Temperaturet:    25    ADC RAW:    214    ADC Voltage:    1044    DO:    5387    
Temperaturet:    25    ADC RAW:    214    ADC Voltage:    1044    DO:    5387    
Temperaturet:    25    ADC RAW:    213    ADC Voltage:    1040    DO:    5362    
Temperaturet:    25    ADC RAW:    213    ADC Voltage:    1040    DO:    5362    

校准原理

当温度固定时,电压与溶解氧浓度成线性关系。由于电极生产时的细微差异,需要先校准饱和溶解氧对应的电压,即可获得准确的数据。

但是饱和溶解氧受温度变化影响大,实际测量中也不可能长时间保持温度不变,因此需要考虑温度变化导致的溶解氧和饱和电压变化,并进行相应计算,提高精度。

饱和电压与温度大致关系如下图所示,需要测量两个不同温度下的饱和溶解氧电压,得到温度补偿曲线。
标准大气压下温度与饱和溶解氧对应关系已知,即可通过测量温度确定当前温度饱和溶解氧浓度和对应电压,进而计算溶解氧。

Mind+(基于Scratch3.0)图形化编程

  1. 下载及安装软件。下载地址:https://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装
  2. 切换到“上传模式”。 详细教程:Mind+基础wiki教程-上传模式编程流程
  3. “扩展”中选择“主控板”中的“Arduino Uno”。 "扩展"“传感器”中搜索选择“模拟DO计”。详细教程:Mind+基础wiki教程-加载扩展库流程
  4. 进行编程,程序如下图:
  5. 菜单“连接设备”,“上传到设备”
  6. 程序上传完毕后,打开串口即可看到数据输出。详细教程:Mind+基础wiki教程-串口打印

常见问题

Q1. 如何配制饱和氧水?

Q2. 如何配置无氧水?

Q3. 电极不使用了,如何保存?

Q4. 如何配制电极填充液(氢氧化钠溶液(NaOH),浓度为0.5mol/L)?

Q5. 常见的故障有哪些?怎么处理? |

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

温度 饱和溶解氧 对照表

更多资料