4、传感器校准:pH传感器两点校准法、TDS传感器校准、温度补偿原理

传感器这东西,出厂时是个「毛坯房」。你直接拿它测数据,误差能让你怀疑人生。我刚开始做水质监测那会儿,就吃过这个亏——pH值测出来漂了0.5,结果整个数据都废了。

所以,校准是必须的。说白了,就是给传感器一个「参考系」,让它知道0和1到底对应什么。

4.1 pH传感器两点校准法

pH传感器本质上是个电压输出器件。它测的是玻璃电极和参比电极之间的电位差。但这个电位差和pH值的关系,不是绝对的——它会随着电极老化、温度变化而漂移。

两点校准法,就是拿两个已知pH值的标准液,把传感器的输出「拉」到正确的位置上。

核心思路:用两个点确定一条直线。pH传感器的输出是线性的,所以两个点就够了。

校准步骤

  1. 准备标准液:通常用pH 4.00和pH 6.86(或pH 7.00)。我个人习惯用pH 4.00和pH 6.86,因为这两个点覆盖了大多数淡水水质的范围。
  2. 第一步:把传感器放入pH 6.86的标准液中,等待读数稳定。然后告诉系统:「当前值是6.86」。这叫「零点校准」。
  3. 第二步:用去离子水冲洗传感器,擦干。然后放入pH 4.00的标准液中,等待稳定。告诉系统:「当前值是4.00」。这叫「斜率校准」。
  4. 计算:系统会记录两个点的电压值,然后算出斜率和截距。以后测未知液体时,就用这个公式反推pH值。

小技巧:校准前,先把传感器在标准液里泡个1-2分钟。让电极充分湿润,读数会更稳。我见过有人直接丢进去就读,结果校准完还是偏的。

代码示例:pH校准数据存储

// 伪代码,实际项目中用
struct pHCalibration {
    float voltage_at_pH4;
    float voltage_at_pH7;
    float slope;   // 斜率
    float offset;  // 截距
};

void calibrate_pH(float known_pH, float measured_voltage) {
    // 存储校准点
    if (known_pH == 7.0) {
        voltage_at_pH7 = measured_voltage;
    } else if (known_pH == 4.0) {
        voltage_at_pH4 = measured_voltage;
    }
    // 计算斜率和截距
    slope = (voltage_at_pH4 - voltage_at_pH7) / (4.0 - 7.0);
    offset = voltage_at_pH7 - slope * 7.0;
}

注意:校准液不要重复使用。倒出来用一次就倒掉,别省这点钱。我曾经为了省几块钱,用同一瓶校准液反复校准,结果数据越来越偏,查了半天才发现是校准液被污染了。

4.2 TDS传感器校准

TDS传感器,说白了就是测水的导电性。水里离子越多,导电性越强,TDS值就越高。但这里有个坑——不同离子的导电能力不一样。同样是100ppm,氯化钠和氯化钙的导电率差很多。

所以,TDS传感器通常用氯化钾(KCl)标准液来校准。因为KCl的导电性和TDS值有很好的线性关系。

校准步骤

  1. 准备标准液:通常用1413 µS/cm的电导率标准液(对应约700ppm TDS)。
  2. 浸泡:把传感器放入标准液中,等待读数稳定。
  3. 调整:读取当前电导率值,然后调整增益系数,使显示值等于标准液的值。
  4. 验证:用另一个浓度的标准液(比如84 µS/cm)验证一下。如果偏差在5%以内,就算合格。

关键点:TDS校准其实是校准电导率。TDS值 = 电导率 × 转换系数。这个系数通常取0.5-0.7,取决于水质类型。

代码示例:TDS校准参数

// TDS校准结构体
struct TDSCalibration {
    float conductivity;   // 当前电导率,单位µS/cm
    float gain;           // 增益系数
    float tds_factor;     // TDS转换系数,默认0.5
};

void calibrate_TDS(float standard_conductivity) {
    // 读取当前传感器原始值
    float raw_value = read_sensor_raw();
    // 计算增益
    gain = standard_conductivity / raw_value;
    // 保存到EEPROM
    save_to_eeprom(gain);
}

避坑指南:我曾经用自来水做TDS校准,结果发现数据忽高忽低。后来才意识到,自来水本身就不稳定——不同时间、不同温度,TDS值都在变。所以,一定要用标准液,别偷懒。

4.3 温度补偿原理

温度对传感器的影响,比你想象的大得多。pH传感器的输出会随温度变化,TDS传感器的电导率更是对温度极其敏感。你想想看,同样是25℃和15℃的水,同一个传感器的读数能差10%以上。

所以,温度补偿不是「锦上添花」,而是「雪中送炭」。没有温度补偿的数据,基本没法用。

温度补偿的原理

说白了,就是用一个公式把不同温度下的读数「折算」到同一个参考温度下。通常参考温度是25℃。

  • pH温度补偿:pH传感器的能斯特方程里有一个温度项。温度每变化1℃,pH值大约变化0.003。所以,补偿公式是:pH_corrected = pH_measured + 0.003 × (T - 25)。当然,不同电极的系数略有差异。
  • TDS温度补偿:电导率的温度系数大约是2%/℃。也就是说,温度每升高1℃,电导率增加2%。补偿公式是:conductivity_25 = conductivity_T / (1 + 0.02 × (T - 25))

重要:温度补偿不是万能的。它只能修正线性部分,对于非线性误差,还是得靠硬件和算法一起处理。

代码示例:温度补偿函数

// pH温度补偿
float compensate_pH(float pH_measured, float temperature) {
    float temp_coefficient = 0.003;  // 典型值
    return pH_measured + temp_coefficient * (temperature - 25.0);
}

// TDS温度补偿
float compensate_TDS(float conductivity, float temperature) {
    float temp_coefficient = 0.02;   // 2%/℃
    return conductivity / (1.0 + temp_coefficient * (temperature - 25.0));
}

注意:温度传感器本身也要校准。如果温度测不准,温度补偿就是「错上加错」。我建议用DS18B20这类数字温度传感器,精度高,而且不需要额外校准。

4.4 校准数据的保存与恢复

校准数据不能每次断电就丢了。你想想看,每次开机都重新校准,那得多麻烦?所以,校准参数要保存到非易失性存储器里,比如EEPROM或Flash。

保存策略

  • 保存时机:校准完成后立即保存。别等到下次开机再想起来。
  • 校验机制:保存时加一个校验和(Checksum),读取时先校验。如果校验失败,说明数据损坏,需要重新校准。
  • 备份:保存两份数据,一份主数据,一份备份。如果主数据损坏,自动用备份恢复。

代码示例:EEPROM保存校准数据

#include <EEPROM.h>

struct CalibrationData {
    float pH_slope;
    float pH_offset;
    float TDS_gain;
    float temp_offset;
    uint8_t checksum;
};

void save_calibration(CalibrationData &data) {
    // 计算校验和
    data.checksum = calculate_checksum((uint8_t*)&data, sizeof(data) - 1);
    // 写入EEPROM
    EEPROM.put(0, data);
}

bool load_calibration(CalibrationData &data) {
    EEPROM.get(0, data);
    uint8_t calc_checksum = calculate_checksum((uint8_t*)&data, sizeof(data) - 1);
    return (calc_checksum == data.checksum);
}

个人经验:我习惯在EEPROM里留一个「版本号」字段。这样以后升级校准算法时,可以判断旧数据是否需要重新校准。嗯,这个细节救过我一次——有一次改了温度补偿系数,旧数据直接废了,但版本号帮我自动触发了重新校准。

4.5 实战中的坑与对策

说了这么多理论,来点实际的。我在项目里踩过的坑,你最好别踩。

表现 对策
校准液过期 校准后数据仍然偏大或偏小 每次校准前检查校准液的生产日期,开封后一个月内用完
电极污染 响应变慢,读数漂移 定期用专用清洗液清洗电极,不要用手触摸玻璃泡
温度传感器未校准 温度补偿后数据反而更差 用精密温度计对比,修正温度偏移量
校准顺序错误 斜率校准失败 先做零点校准(pH 7),再做斜率校准(pH 4)

最后提醒:校准不是一劳永逸的。pH电极会老化,TDS电极会结垢。我建议每个月至少校准一次。如果数据波动大,就增加校准频率。别等到数据出问题了才想起来——那时候已经晚了。

好了,传感器校准这块就讲到这里。下一章我们聊聊数据上传的协议选择——MQTT还是HTTP?到时候见。