基于 ESP32 的嵌入式 pH 检测记录仪系统设计与渔业应用研究
摘要
针对海水经济鱼类保活运输、活鱼暂养、工厂化循环水养殖过程中水体 pH 动态波动直接影响鱼类存活率、应激水平与代谢状态的行业痛点,以及低成本嵌入式 pH 检测设备普遍存在的 ADC 硬件偏移、信号噪声干扰、校准流程鲁棒性不足、电极适配受限、人机交互阻塞等现实问题,本文基于 DFRobot Gravity 专业级 pH 计 V2 探头与 M5Stack Tough/ESP32 控制器,构建面向渔业应用的嵌入式 pH 在线监测系统。系统围绕测量精度、校准可靠性与人机可用性三个维度开展设计。完成硬件搭建、校准流程、使用流程及实验室性能验证,并以海水经济养殖品种卵形鲳鲹为对象开展模拟保活暂养水体实测。结果表明:系统精密度与长时间漂移指标均满足渔业水质检测要求;海水暂养模拟实验中,系统数据离散度优于参比笔式 pH 计,可适用于水产实验室研究、室内暂养、活鱼运输及工厂化养殖单元监测等场景。

1 前言
pH 是表征水溶液理化特性的关键指标,在水质监测、生物培养、理化试验、水产养殖等场景中被频繁检测。pH 电极属于高阻抗电化学传感器,输出信号为毫伏级别,极易受到电磁干扰、电源噪声、温度漂移以及电极老化的影响。电极初次使用前需要活化,长期使用后响应特性会发生衰减,每次测量前需要执行标定;不同老化程度电极的响应斜率存在明显差异,上述特性给嵌入式设备工程化落地带来诸多挑战。
在海水经济鱼类保活运输、活鱼暂养、工厂化循环水养殖过程中,水体 pH 动态波动直接影响鱼类存活、应激水平与代谢状态。传统实验室 pH 计存在操作繁琐、无法连续记录、价格昂贵等问题,而现有低成本自制类 pH 检测方案多聚焦于信号读取与基础两点换算,普遍存在以下不足:直接采用理论系数转换 ADC 原始值,忽略芯片参考电压的个体离散误差;滤波策略多选用算术均值滤波,对脉冲毛刺抑制能力有限;校准模块缺少电极稳态判别与标定质量校验,易将漂移阶段电位、噪声数据作为有效标定点;采用同步阻塞式标定流程,造成界面卡顿;未兼容反相输出信号调理模块;缺少参数保护机制,错误标定参数直接覆盖原有可用配置。
为解决上述问题,本文设计并搭建一套完整的嵌入式 pH 检测记录仪,重点阐述系统在抗干扰采样、高鲁棒性标定、容错人机交互层面的设计思路,并以 DFRobot Gravity 专业级 pH 计 V2 探头为核心开展渔业应用场景的性能验证。
2 研究方案
2.1 系统总体架构
系统由 DFRobot Gravity 专业级 pH 计 V2 探头、pH 信号调理模块、M5Stack Tough 控制器构成。探头与待测溶液接触,输出与 pH 有关的微弱电信号;信号调理模块对高阻抗、低电压的电极信号进行放大和稳定处理;M5Stack Tough 作为主控制单元,负责接收模拟输出信号、执行数据处理算法、驱动屏幕显示、读取 RTC 时间以及控制 SD 卡数据写入。
表 2-1 设备主要硬件组成
| 设备 | 功能 |
|---|---|
| DFRobot Gravity: 专业级 pH 计 V2 探头 | 与待测溶液接触,输出与 pH 有关的微弱电信号 |
| M5Stack Tough | 作为控制器读取模拟信号、计算 pH、显示数据、控制定时记录 |
| pH 信号调理模块 | 对高阻抗、低电压的电极信号进行放大和稳定处理 |
| microSD 卡 | 保存测定日志文件 |
表 2-2 DFRobot Gravity: 专业级 pH 计 V2 探头参数

| 设备参数 | 规格 |
|---|---|
| 电极类型 | 实验室级电极 |
| 检测范围 | 0~14 |
| 温度范围 | 5~60℃ |
| 零点 | 7±0.5 |
| 响应时间 | <2min |
| 内阻 | <250MΩ |

2.2 软件开发环境与依赖组件
系统软件基于 PlatformIO 生态构建,采用 Arduino 框架面向 ESP32 平台开发,目标板配置为 m5stack-core2(M5Stack Tough 与 Core2 共用同一硬件基座,Tough 为其加固工业版本)。软件构建所依赖的编程环境如表 2-4 所示,依赖组件及其提供的能力如表 2-5 所示。
表 2-4 软件构建环境
| 项目 | 配置 / 版本 | 说明 |
|---|---|---|
| 构建系统 | PlatformIO Core 6.x | 跨平台嵌入式构建、依赖管理与烧录工具链 |
| 运行环境 | Python 3.9 及以上 | PlatformIO 运行依赖 |
| 平台包 | espressif32@7.0.1 | ESP32 系列开发平台,含编译工具链与 SDK |
| 目标板定义 | m5stack-core2 | M5Stack Tough/Core2 板级配置(MCU、Flash、分区) |
| 开发框架 | Arduino(Arduino-ESP32) | 应用层编程框架,提供基础 API |
表 2-5 软件依赖组件及其提供能力
| 组件 | 版本 | 提供能力 |
|---|---|---|
| M5Unified | 0.2.19(本地库) | M5Stack 全系列统一硬件抽象:板级初始化(M5.begin)、触摸与按键状态更新(M5.update)、板载 RTC(BM8563)读写、电源管理、扬声器输出、I2C 总线管理 |
| M5GFX | 0.2.26(本地库) | 显示与图形驱动:屏幕初始化、绘图原语、Sprite 局部刷新(主屏 4 区域与校准页分区绘制);为 M5Unified 的依赖项 |
| Arduino-ESP32 核心 | 随框架提供 | analogReadMilliVolts ()(eFuse 校准电压读取)、串口通信、GPIO、millis ()/delay 等基础 API |
https://gitee.com/genvex/esp-ph-loger
其中,M5Unified 与 M5GFX 以本地副本形式存放于项目 lib/ 目录,由 PlatformIO 自动识别并编译,不依赖平台在线拉取;M5Unified 以 M5GFX 为依赖,二者协同提供显示与触摸能力。上述组件与系统功能模块的对应关系为:FreeRTOS 双核调度支撑采样任务与主业务循环的并行架构(2.3 节);Preferences 支撑校准参数持久化与电压域版本校验(3.2.4 节);SD/SPI 支撑 CSV 数据记录(3.4 节);WiFi 与 esp_sntp 支撑网络校时及离线降级(3.4 节);M5Unified/M5GFX 支撑人机交互界面与局部刷新显示(sprite函数),屏幕更新无闪烁,无卡度,显示效果精良。
2.3 双核并行任务架构
ESP32 为双核处理器,系统采用双核任务隔离架构:采样任务通过xTaskCreatePinnedToCore固定运行在 Core0,与显示刷新、SD 写入等偶发长任务隔离;主线程 loop 运行在 Core1,负责界面、触摸、串口与记录。二者通过一把互斥锁交换数据,锁保护的临界区仅为一次数组写入与一次指针移动(微秒级),因此采样周期不会被消费端阻塞。
采样任务(Core0):周期 50ms,每个周期连续读取 5 次 ADC 电压并取中值,作为 1 个代表值覆盖写入环形数据池的最旧槽位。
主业务循环(Core1):周期 1s,负责触摸检测、UI 刷新、指令解析、SD 卡日志存储(每 30min 写入 1 次)。
2.4 pH 测量原理与温度补偿
pH 玻璃电极浸入溶液后,电极玻璃膜两侧的氢离子活度不同,形成电位差。在理想条件下,当温度为 25℃时,pH 值每变化 1 个单位,电极电位大约变化 59.16mV。系统依据能斯特响应关系进行 pH 换算:

3 系统设计:测量精度与校准可靠性的双轨实现
pH 计本质上可视为一个电化学电压源:玻璃电极对待测溶液产生随 pH 线性变化的电位,服从能斯特方程E = E° - S·pH,25℃下理论斜率S ≈ 59.16 mV/pH。这意味着每 1 个 pH 单位仅对应约 59mV 的电位变化,属于极易被噪声淹没的微弱信号。
由此衍生两个根本性设计难题:
一是测量精度难以保障 —— 若要分辨 0.01pH,需分辨约 0.59mV 的电压,而 ESP32 ADC 自身的噪声与基准电压偏差均远超该量级;
二是校准可靠性难以保障 ——pH 电极存在老化、漂移与温度敏感特性,须在现场定期校准。
主要解决如何“测得准” ,“检得稳” 两个核心问题。
3.1 测量精度保障:五级防护架构
测量精度的保障并非依赖某一环节的单独处理,而是信号自电极至屏幕全链路中各环节协同将误差控制在可接受范围内。
为此,本系统构建五级防护架构,并辅以两项架构级保证。
3.1.1 第一级防护:基于 eFuse 出厂校准的 ADC 电压换算
问题分析:ESP32 ADC 的常见换算方式为voltage = analogRead(pin) * 3300 / 4095。该式隐含三项假设:基准电压恰为 3.3V、ADC 输出与电压严格线性、衰减档增益与标称值一致。然而,上述假设在真实 ESP32 芯片上均不能严格成立 —— 出厂基准电压实际分布于 1.0V~1.2V 之间,11dB 衰减档的增益曲线在高电压端存在明显非线性,不同芯片之间的差异可达数个百分点。对于 59mV/pH 的信号,百分之几的电压误差即相当于零点几个 pH 的测量误差。
解决措施:系统直接调用analogReadMilliVolts()函数。该函数内部读取芯片出厂烧写于 eFuse 的校准数据,对基准电压偏差与衰减曲线非线性进行逐点修正,返回经校准的毫伏值,将硬件系统误差抑制至 ±10mV 以内。
int32_t PhSensor::adcReadMedianMv(int pin) {
// analogReadMilliVolts: 经ESP32 eFuse出厂校准换算
// 修正Vref偏差与衰减曲线非线性, 比raw×3300/4095更接近真实电压
int32_t samples[PH_ADC_READ_PER_SAMPLE];
for (int i = 0; i < PH_ADC_READ_PER_SAMPLE; i++) {
samples[i] = static_cast<int32_t>(analogReadMilliVolts(pin));
delayMicroseconds(PH_ADC_READ_DELAY_US);
}
std::sort(samples, samples + PH_ADC_READ_PER_SAMPLE);
return samples[PH_ADC_READ_PER_SAMPLE / 2];
}设计要点:该措施从软件层面消除了 "芯片个体差异" 这一最大系统误差源 —— 校准数据来源于 Espressif 出厂测试数据,其精度高于任何用户态校准方案。
3.1.2 第二级防护:中值滤波抑制偶发毛刺
问题分析:即便经过 eFuse 校准,单次 ADC 读数仍可能出现偶发毛刺 —— 电源纹波、数字信号耦合、Wi-Fi 发射时的瞬态干扰,均可能使某次读数偏离真实值数十乃至上百毫伏。
解决措施:每次采集连续读取 5 次 ADC 值,排序后取中值。中值滤波对离群点(毛刺)具有天然鲁棒性:5 个采样值中即使存在 1~2 个毛刺,中值仍落在正常值区间内。
int32_t PhSensor::adcReadMedian(int pin) {
int32_t samples[PH_ADC_READ_PER_SAMPLE]; // = 5
for (int i = 0; i < PH_ADC_READ_PER_SAMPLE; i++) {
samples[i] = analogRead(pin);
delayMicroseconds(PH_ADC_READ_DELAY_US); // 给ADC电容放电时间
}
std::sort(samples, samples + PH_ADC_READ_PER_SAMPLE);
return samples[PH_ADC_READ_PER_SAMPLE / 2]; // 取中值
}设计要点:均值滤波会使毛刺直接拉偏结果 ——5 个采样值中若存在 1 个 + 30mV 毛刺,均值将偏移 + 6mV,相当于 0.1pH 的误差;而中值滤波最多可容忍 2 个毛刺,是工程上代价最小、收益最高的抗毛刺方案。
3.1.3 第三级防护:环形数据池实现生产 / 消费解耦
问题分析:采样过程与数据消费方(显示刷新、校准、日志存储)的时序要求差异显著 —— 采样须快速且稳定,以 50ms 周期连续执行而不被打断;显示每 1s 刷新一次,校准由用户按键触发,日志每 30min 写入一条。若消费方直接读取 "当前 ADC 值",将面临读取瞬态值、加锁阻塞采样等问题。
解决措施:维护 10 槽环形数据池(DATA_POOL_SIZE = 10),采样任务每个周期仅执行一项操作:将当前周期的中值代表值覆盖写入最旧槽位。临界区极短,仅包含一次数组写入与一次指针移动。
// src/ph_sensor.cpp:86-90
if (sampleMutex_ && xSemaphoreTake(sampleMutex_, portMAX_DELAY) == pdTRUE) {
pool_[poolHead_] = mv;
poolHead_ = (poolHead_ + 1) % POOL_SIZE;
if (poolCount_ < POOL_SIZE) poolCount_++;
hasNewSample_ = true;
xSemaphoreGive(sampleMutex_);
} 3.1.4 第四级防护:滑动均值抑制随机噪声与显示抖动
问题分析:中值滤波可去除毛刺,但无法抑制均匀分布的随机噪声 ——ADC 量化噪声、电源低频纹波可使相邻两次读数相差数毫伏,造成屏幕数值持续跳变。
解决措施:消费方自数据池取最近 8 槽求均值(PH_ADC_WINDOW_SIZE = 8),即对最近 400ms 的数据执行滑动平均。
// src/ph_sensor.cpp:127-137
float PhSensor::meanOfLastUnlocked(int n) const {
if (poolCount_ == 0) return NAN;
int take = (n < poolCount_) ? n : poolCount_;
float sum = 0;
int idx = (poolHead_ - 1 + POOL_SIZE) % POOL_SIZE;
for (int i = 0; i < take; i++) {
sum += static_cast<float>(pool_[idx]);
idx = (idx - 1 + POOL_SIZE) % POOL_SIZE;
}
return sum / take;
}窗口选择依据:8 槽 ×50ms=400ms 响应时间足以跟踪电极秒级响应;窗口过大会使屏幕对真实 pH 变化反应迟滞,过小则噪声抑制不足。经实测,8 槽为平滑度与响应速度之间的最优折中。
3.1.5 第五级防护:温度补偿修正能斯特斜率
问题分析:能斯特方程斜率与绝对温度成正比。25℃时 S≈59.16mV/pH,0℃时 S≈54.20mV/pH(相对偏差−8.4%),50℃时 S≈64.12mV/pH(相对偏差 + 8.4%)。若校准时温度为 25℃、测量时降至 15℃而不进行温度补偿,仅斜率漂移即可引入约 3% 的 pH 误差。
解决措施:两点校准反解实测斜率后,依据当前温度相对 25℃进行修正:
// src/ph_sensor.cpp:246-248
float measuredSlope = (voltageAtPh9_ - voltageAtPh7_) / (PH_BUFFER_9 - PH_BUFFER_7);
float slope = measuredSlope * (temperatureC + 273.15f) / 298.15f;
return PH_BUFFER_7 + (voltageMv - voltageAtPh7_) / slope;
3.1.6 架构保证一:双核并行保障采样时序稳定
ESP32 为双核处理器。采样任务固定运行于 Core0(与 WiFi/BT 协议栈所在核隔离),主线程 loop 运行于 Core1,负责显示、触摸、SD 卡与串口。二者通过互斥锁交换数据,锁仅保护数据池读写,持有时间极短。
精度保障机理:若采样任务与显示刷新、SD 写卡同核运行,将被偶发的大延迟任务打断,导致采样周期抖动 ——50ms 周期实际可能变为 50/60/48/70ms。周期抖动将使滑动均值的 "8 槽" 覆盖时间不一致,等效于引入非平稳采样误差。双核固定分配结合短临界区设计,可将采样周期抖动降至最低。
3.1.7 架构保证二:全链路同源确保数据可追溯
问题分析:项目早期阶段,数据池存储 raw ADC 值,而显示环节另行调用analogReadMilliVolts()换算为 mV。两次 ADC 读取时刻不同、数值不同,导致日志记录与屏幕显示的 mV 值不一致。
解决措施:数据池仅存储 eFuse 校准后的 mV 值,自数据池至显示、校准、日志的完整链路不再出现任何 raw 值。日志adc_mv字段直接来源于数据池聚合结果,与voltage_mV为同一数值,二者始终可互相推导。
3.2 校准可靠性保障:高鲁棒性校准子系统
校准的可靠性并非通过简单增设校准按钮即可实现,而须系统解决一系列现实问题:操作者误触、电极模块反相接法、校准过程中的 UI 阻塞,以及固件升级后旧校准参数的兼容性等。
3.2.1 两点校准与带符号斜率极性自适应
数学模型:系统采用 pH7.00 与 pH9.18 两点校准。选择 pH9.18 而非常见的 pH4.00,系因目标应用场景为养殖池 / 鱼塘等偏碱性水体,校准点应覆盖待测区间。两点校准可同时反解零点(E₀)与斜率(S),自动吸收电极老化、模拟前端增益与校准时温度的综合影响。
设计要点:带符号斜率消除方向强校验限制。早期版本曾采用 "斜率方向强校验",要求 V9>V7。但标准电极在能斯特方程下满足 V9<V7,而经反相放大模块处理的电极满足 V9>V7,两种接法均属合法配置,强校验将误判其中一半电极。
float diff = voltageAtPh9_ - voltageAtPh7_;
float slope = diff / (PH_BUFFER_9 - PH_BUFFER_7);
snprintf(r.message, sizeof(r.message), "pH7 OK, slope %.1f mV/pH", fabs(slope));该校验仅要求两点电压差足够大(|V9−V7|≥10mV),以防止两点重合导致斜率发散与除零,而不限制电压差方向。标准电极反解斜率约为−59,反相模块约为 + 59,换算时带符号参与计算,二者均可获得正确 pH 值。用户无需辨识电极模块的同相或反相接法。
3.2.2 异步校准架构避免 UI 阻塞
问题分析:校准须在采样任务的锁内执行,而校准由用户按键触发。若主线程直接调用校准函数,将导致死锁或 UI 卡死。
解决措施:
采用三段式异步架构。
第一段:主线程登记请求(按键后立即返回,UI 不阻塞):
// src/main.cpp:188-198
static void requestCaptureCurrentPoint() {
if (calPointIsPh7 ? phSensor.requestCalibrationPh7()
: phSensor.requestCalibrationPh9()) {
calRequestTime = millis();
display.showCalibrationStatus("Capturing pH 7.00...", TFT_YELLOW);
}
}第二段:采样任务下一周期在锁内执行(数据已就绪):
CalibrationPoint p = pendingCalPoint_;
if (p != CalibrationPoint::NONE) {
pendingCalPoint_ = CalibrationPoint::NONE;
CalibResult r = (p == CalibrationPoint::PH7)
? applyCalibrationPh7(meanOfLastUnlocked(PH_ADC_WINDOW_SIZE))
: applyCalibrationPh9(meanOfLastUnlocked(PH_ADC_WINDOW_SIZE));
calResult_ = r;
calResultReady_ = true;
}第三段:主线程轮询回收结果(以 1s 节奏检查):
// src/main.cpp:424-434
if (phSensor.calibrationResultAvailable()) {
CalibResult r = phSensor.consumeCalibrationResult();
display.showCalibrationStatus(r.message, r.ok ? TFT_GREEN : TFT_RED);
}超时兜底机制:若校准请求在 "2× 采样周期 + 稳定等待 + 200ms" 内未获得结果,主线程自动取消请求,避免 UI 长时间停留在 "Capturing..." 状态。
用户体验:用户按键后屏幕立即反馈(黄色 "Capturing..."),数十毫秒后以绿 / 红显示结果,全程无卡顿。校准采用数据池当前聚合值(最近 8 槽均值)而非按键瞬间的单次读数 —— 即使操作过程中电极发生轻微扰动,只要 400ms 内恢复稳定,校准所取即为稳态值。
3.2.3 标定质量自检与参数保护
线性参数计算完成后,系统执行多维度质量校验,拒绝不合格的校准参数:
校验一:两点压差校验。两点电压差小于 10mV 时,判定为缓冲液误用或电极冲洗不充分,终止本次标定。
校验二:电极效率校验。将实测斜率与理论值 59.16mV/pH 对比,效率处于 85%~105% 区间判定合格;效率低于 85% 时弹窗告警,拒绝覆盖旧参数并保留上一组可用标定配置。
校验三:零点偏移校验。V₇须处于合理电压区间,偏移超限时提示电极污染或缓冲液失效。
CalibResult PhSensor::applyCalibrationPh7(float mv) {
CalibResult r;
// 校验1: 两点压差≥10mV
if (!isnan(voltageAtPh9_) && fabs(voltageAtPh9_ - mv) < MIN_CALIBRATION_DIFF_MV) {
r.ok = false;
snprintf(r.message, sizeof(r.message), "pH7: diff too small");
return r;
}
voltageAtPh7_ = mv;
if (!isnan(voltageAtPh9_)) {
float diff = voltageAtPh9_ - voltageAtPh7_;
float slope = diff / (PH_BUFFER_9 - PH_BUFFER_7);
// 校验2: 电极效率85%-105%
float efficiency = (slope / PH_SLOPE_25C) * 100.0f;
if (efficiency < 85.0f || efficiency > 105.0f) {
r.ok = false;
snprintf(r.message, sizeof(r.message), "pH7: efficiency %.1f%%", efficiency);
return r;
}
r.ok = true;
r.needsSave = true;
snprintf(r.message, sizeof(r.message), "pH7 OK, slope %.1f mV/pH", slope);
}
return r;
}
3.2.4 参数持久化与电压域版本号
持久化机制:校准值通过 ESP32 Preferences 库(底层 NVS Flash)持久化,Flash 写入置于锁外执行,避免 NVS 写入数十毫秒的耗时阻塞采样任务。
// src/ph_sensor.cpp:384-392
void PhSensor::saveCalibration() {
Preferences local;
local.begin(PREF_NAMESPACE, false);
local.putFloat(PREF_KEY_CAL_PH7, voltageAtPh7_);
local.putFloat(PREF_KEY_CAL_PH9, voltageAtPh9_);
local.putInt(PREF_KEY_CAL_VER, CALIBRATION_DOMAIN_VERSION);
local.end();
} 电压域版本号机制:项目早期 ADC 换算曾采用两种口径:v1 为raw×3300/4095线性换算,v2 为analogReadMilliVolts()的 eFuse 校准。两种口径下同一电极读出的 mV 值存在显著差异。若固件由 v1 升级至 v2,而 NVS 仍保存 v1 时代的校准值,加载后将出现校准值与当前采样口径不匹配的问题。
// v1 = raw×3300/4095线性换算; v2 = analogReadMilliVolts(eFuse校准mV)
const int CALIBRATION_DOMAIN_VERSION = 2;// src/ph_sensor.cpp:394-423
int ver = local.getInt(PREF_KEY_CAL_VER, 0);
voltageAtPh7_ = local.getFloat(PREF_KEY_CAL_PH7, NAN);
voltageAtPh9_ = local.getFloat(PREF_KEY_CAL_PH9, NAN);
if (ver != CALIBRATION_DOMAIN_VERSION) { // 跨域残留值作废
voltageAtPh7_ = NAN;
voltageAtPh9_ = NAN;
} 3.2.5 防误触按键布局设计
pH 计现场操作环境较为恶劣:手部潮湿、佩戴手套、屏幕反光等。若确认弹窗按钮布局不当,用户连击两次恰好触发确认操作,将比无确认框更具风险。
const int CONFIRM_YES_BTN_X = 112; // 居中: 不与START/CAL肌肉记忆位重叠
const int CONFIRM_CANCEL_BTN_X = 216; // 原CAL位: 第二下误触恰好落在取消上确认键居中(X=112),远离主屏 START(X=8)与 CAL(X=216)的操作惯性位置
取消键占据原 CAL 位置(X=216)—— 用户触发 CAL 弹出确认框后,若再次按压同一位置,恰好落在取消键上
配合 8s 超时机制,即使无人操作亦不会长时间停留于校准状态
3.2.6 双通道校准:触摸屏与串口
触摸屏通道(现场操作):主屏按 CAL 键→进入校准页→CAL 采点→SWITCH 切换 pH7↔pH9→BACK 返回。采点前弹出防误触确认框,8s 超时自动取消。
串口通道(开发 / 调试):通过stab → cal7 → cal9 → read → show指令序列,无需触摸屏即可完成全流程校准。
设计价值:同一套校准逻辑服务于两类用户 —— 现场用户使用触摸屏,开发者使用串口。串口通道还可在电极故障时实现远程排查,无需人员到场操作屏幕。
3.2.7 斜率实时显示与电极健康监测
pH 电极属于消耗品,斜率即为其健康度指标:新电极 | slope|≈59mV/pH,老化电极 | slope | 明显减小,失效电极 | slope|<50 或两点电压差 < 10mV 导致校验失败。
两点校准完成时,斜率作为结果的一部分直接显示于屏幕:
// src/ph_sensor.cpp:316-317
snprintf(r.message, sizeof(r.message), "pH7 OK, slope %.1f mV/pH", fabs(slope));
// src/display_manager.cpp:374-381
if (calibrated) {
float slope = (v9 - v7) / (PH_BUFFER_9 - PH_BUFFER_7);
snprintf(buf, sizeof(buf), "Slope: %.1f mV/pH", slope);
}
3.3 测量精度与校准可靠性的共同基础:数据池与互斥锁
测量精度保障与校准可靠性保障共享同一套架构基础设施:
┌─────────────────────────────────┐
│ 环形数据池 (10槽 × 50ms) │
│ 只存eFuse校准后的mV │
└────────────┬────────────────────┘
│ 互斥锁(极短临界区)
┌──────────────────────┼──────────────────────┐
▼ ▼ ▼
采样task(Core0) 显示/校准请求 校准评估(锁内)
生产:中值→覆盖最旧槽 消费:取最近8槽均值 消费:取最近8槽均值
对测量精度保障:数据池是五级防护中 "环形池 + 滑动均值" 两级的载体,生产 / 消费解耦保证采样时序不被干扰,全链路同源保证数据可溯源。
对校准可靠性保障:数据池使校准可基于 "最近 400ms 的稳定均值" 而非 "按键瞬间的单次读数",互斥锁使校准可在采样任务锁内安全执行而不阻塞 UI。
3.4 数据存储与网络降级机制
测量数据以标准 CSV 格式保存至 SD 卡,字段包括时间、pH、温度、电极电压与 ADC 原始读数。设置 30min 写入间隔,在保证趋势记录能力的同时,降低频繁 SD 写入对系统实时性的影响。
Wi-Fi 正常连接时通过 NTP 获取标准时间戳;网络不可用时,设备不中断测量功能,改用系统运行时间 uptime 作为时间戳,实现离线工况可用性,适配野外无网络原位监测场景。
3.5 设计总结
本节对测量精度与校准可靠性两大核心命题的回应,并非简单叠加均值滤波、NVS 存储等处理手段,而是构建了自 ADC 读数至 UI 交互的完整工程链路。每一项设计决策均对应真实存在、实际遇到或可预见的问题:
| 维度 | 简单化处理方式 | 本文采用方式 |
|---|---|---|
| ADC 换算 | analogRead() * 3300 / 4095 | analogReadMilliVolts(),基于 eFuse 出厂校准 |
| 滤波 | analogRead() 单次采样 | 中值滤波 (5 次) → 环形数据池 (10 槽) → 滑动均值 (8 槽) |
| 温度 | 忽略 | 能斯特斜率按 (T+273.15)/298.15 修正 |
| 校准数学 | 一点校准,假设斜率 59.16 | 两点校准反解斜率,带符号自适应极性 |
| 校准 UI | 直接按键采点 | 异步架构 + 防误触弹窗 + 按键布局防连击 + 8s 超时 |
| 持久化 | 仅存变量 | NVS Flash + 电压域版本号跨升级防污染 |
| 健康度 | 无 | 斜率实时显示,电极老化可量化判断 |
| 架构 | 单线程串行 | 双核固定分配 + 互斥锁 + 生产消费解耦 |
4 系统操作与测试结果
4.1 两点校准使用流程
1、程序烧录完成后,Tough 屏幕直接显示 Voltage、RAW 和 pH
2、 未完成校准前,屏幕显示 NOT CALIBRATED 与 --.--
3、通过串口监视器完成校准:电极放入 pH7.00,稳定后输入cal7;冲洗电极,放入 pH9.18,稳定后输入cal9
4、校准成功后,pH 数值实时显示于屏幕中央;校准数据保存至 Flash,断电后不丢失



4.2 精密度测试
测定实验室常见试剂(蒸馏水、pH4.0标准液、pH7.0标准液、pH9.18标准液)相关pH数据,且与实验室其他型号pH计测定的数据进行对比,以分析DFRobot 专业级pH计V2与Tough控制器结合测定pH数值是否足够精密。采用pH=7.00(25 ℃)的标准溶液,检测模块采用连续测定模式,0.5h记录一个测量值,连续记录n(n≥7)个测量值 xi,参照公式(1)计算标准偏差S。该标准偏差S为精密度的判定值。

表 4-2 精密度测试结果(n=8)
| 时间(h) | DFRobot 专业级 pH 计 V2 | 希玛 828 笔式 pH 计 | 希玛 848 笔式 pH 计 |
|---|---|---|---|
| 0.5 | 6.96 | 6.88 | 6.8 |
| 1.0 | 6.94 | 6.93 | 6.8 |
| 1.5 | 6.99 | 6.92 | 6.9 |
| 2.0 | 6.94 | 6.86 | 6.8 |
| 2.5 | 6.93 | 6.90 | 6.8 |
| 3.0 | 6.97 | 6.90 | 6.9 |
| 3.5 | 7.02 | 6.94 | 6.9 |
| 4.0 | 6.97 | 6.92 | 6.8 |

结果:DFRobot 专业级 pH 计 V2 标准差为 0.028,希玛 828 为 0.025,希玛 848 为 0.048,三者均小于 0.1 的精密度判定阈值,本设备精密度测试符合标准。
4.3 漂移度测试
漂移度测试采用连续测定模式,每0.5 h记录一个测量值,连续记录16 个测定值xi, 以前三次测定值的平均值为基准x0,根据公式(2)分别计算后续13次测定值xi和x0的变化幅度D,取绝对值较大者为漂移度,本测试使用pH=4.00(25 ℃)和pH=9.18(25 ℃)两种溶液进行测试。

表 4-3 漂移度测试结果(n=16)
时间(h) | DFRobot 专业级pH计V2(pH=4.00/pH=9.18) | 希玛848笔式pH计(pH=9.18) | |
0.5 | 4.13 | 9.15 | 9.2 |
1.0 | 4.08 | 9.20 | 9.2 |
1.5 | 4.09 | 9.21 | 9.1 |
2.0 | 4.10 | 9.17 | 9.1 |
2.5 | 4.07 | 9.19 | 9.2 |
3.0 | 4.09 | 9.15 | 9.2 |
3.5 | 4.07 | 9.16 | 9.2 |
4.0 | 4.11 | 9.18 | 9.2 |
4.5 | 4.08 | 9.16 | 9.1 |
5.0 | 4.09 | 9.15 | 9.1 |
5.5 | 4.11 | 9.13 | 9.0 |
6.0 | 4.08 | 9.17 | 9.1 |
6.5 | 4.08 | 9.15 | 9.1 |
7.0 | 4.07 | 9.14 | 9.2 |
7.5 | 4.09 | 9.17 | 9.1 |
8.0 | 4.10 | 9.16 | 9.2 |
结果:本测试采用8小时连续测定,pH计性能指标中漂移度判定值应≤0.1,结果显示,DFRobot 专业级pH计V2与Tough控制器结合测定pH,在pH=4.00(25 ℃)条件下,漂移度为0.03,远低于0.1,在pH=9.18(25 ℃)条件下,漂移度为0.057,低于0.1;希玛848笔式pH计测定pH,在pH=9.18(25 ℃)条件下,漂移度为0.17,可能受示数有效数字影响。综上所述,本设备漂移度测试符合标准。
4.4 全量程横向对比测试
通过将DFRobot 专业级pH计V2与实验室普通pH计在pH 2.0~14.0全量程范围内进行系统对比,评估新型pH计在准确度、精密度、响应速度、稳定性等方面的性能表现,判断其是否可替代或优于传统实验室pH计。
本测试溶液均为实验室配制缓冲体系,实验材料如表4-4所示。
表4-4 实验主要试剂以及缓冲体系
目标pH(25℃) | 缓冲体系或实验试剂 |
2.0 | 氯化钾-盐酸缓冲液 |
4.0 | 0.05 mol/L 邻苯二甲酸氢钾(NIST基准缓冲液) |
6.0 | 混合磷酸盐 |
8.0 | 混合磷酸盐 |
10.0 | 0.01 mol/L 四硼酸钠(NIST基准缓冲液) |
12.0 | 硼砂-氢氧化钠缓冲液 |
14.0 | 0.1 mol/L 氢氧化钠溶液 |
按pH从低到高(2.0→4.0→6.0→8.0→10.0→12.0→14.0)的顺序进行测定,避免强酸强碱交叉污染。用去离子水彻底冲洗电极,用滤纸轻轻吸干,将电极浸入待测缓冲液中,探头缓慢浸入避免气泡产生,待读数稳定后,记录pH值,每个pH点平行测定3次取平均值。
表 4-4 准确度横向对比结果(n=7)
| pH(25℃) | DFRobot 偏差 | 希玛 848 偏差 |
|---|---|---|
| 2.0 | -0.06 | -0.07 |
| 4.0 | 0.02 | -0.03 |
| 6.0 | 0.05 | -0.07 |
| 8.0 | 0.06 | -0.03 |
| 10.0 | -0.03 | -0.07 |
| 12.0 | -0.10 | -0.07 |
| 14.0 | -0.13 | -0.13 |
DFRobot 专业级 pH 计 V2 平均绝对偏差为 0.064<0.1,希玛 848 为 0.067<0.1,DFRobot 设备准确度略优。
表4-5 DFRobot 专业级pH计V2与实验室常用pH横向对比准确度测定结果(n=7)
pH(25℃) | DFRobot 专业级pH计V2 | 希玛848笔式pH计 | ||
平均值 | 偏差 | 平均值 | 偏差 | |
2.0 | 1.94 | -0.06 | 1.93 | -0.07 |
4.0 | 4.02 | 0.02 | 3.97 | -0.03 |
6.0 | 6.05 | 0.05 | 5.93 | -0.07 |
8.0 | 8.06 | 0.06 | 7.97 | -0.03 |
10.0 | 9.97 | -0.03 | 9.93 | -0.07 |
12.0 | 11.90 | -0.10 | 11.93 | -0.07 |
14.0 | 13.87 | -0.13 | 13.87 | -0.13 |
pH计不同pH测定的平均绝对偏差应≤0.1,结果显示DFRobot 专业级pH计V2测定结果平均绝对偏差为0.064<0.1,希玛848笔式pH计测定结果平均绝对偏差为0.067<0.1,且大于DFRobot 专业级pH计V2测定数据平均绝对偏差,DFRobot 专业级pH计V2梯度pH测定中准确度高于实验室用pH计。
表4-6 DFRobot 专业级pH计V2与实验室常用pH横向对比精密度测定结果(n=7)
pH(25℃) | 相对标准偏差(%) | |
DFRobot 专业级pH计V2 | 希玛848笔式pH计 | |
2.0 | 1.35 | 2.44 |
4.0 | 0.62 | 2.38 |
6.0 | 0.40 | 0.79 |
8.0 | 0.10 | 0.59 |
10.0 | 0.43 | 0.47 |
12.0 | 0.26 | 0.40 |
14.0 | 0.19 | 0.34 |
pH计不同pH测定的平均RSD应≤0.5%,结果显示DFRobot 专业级pH计V2测定结果平均RSD为0.48%<0.5%,希玛848笔式pH计测定结果平均RSD为1.06%>0.5%,结果证明,DFRobot 专业级pH计V2梯度pH测定中精密度高于实验室用pH计,且符合标准。
4.5 卵形鲳鲹暂养实测
4.5.1 实验材料
卵形鲳鲹(Trachinotus ovatus),平均体质量(450±50)g,鲜活健康且无明显外伤,购于广州市海珠区当地生鲜市场。实验用水为由海水晶配制的海水,盐度 24.0‰,温度(25.0±0.2)℃。

4.5.2 实验方法
在暂养桶中使用恒温 25℃、盐度 24.0‰的调配海水对卵形鲳鲹开展模拟保活实验,鱼水质量比为 1:30,24h 持续曝气增氧,维持水体溶氧量于 5~8mg/L 区间。以实验室用 pH 计(希玛 848 笔式 pH 计)为对照,每 30min 记录一次暂养桶中水体 pH 值,采用 6h 连续测定法,分析暂养卵形鲳鲹水体 pH 随时间的变化趋势,并评估 DFRobot 专业级 pH 计 V2 在该实验场景中的适用性。
每组实验平行测定 3 次并取平均值,依据所得数据计算标准差,使用数据分析软件(IBM SPSS Statistics 27.0.1 64 位)处理实验数据,结果以平均值 ±SD 表示,其中 SD 为标准差。

4.5.3 实验结果
表 4-6 暂养卵形鲳鲹 pH 测定结果(n=13)
| 时间(h) | DFRobot 专业级 pH 计 V2 | 希玛 848 笔式 pH 计 |
|---|---|---|
| 0 | 7.59±0.01 | 7.37±0.05 |
| 0.5 | 7.42±0.02 | 7.33±0.05 |
| 1.0 | 7.46±0.02 | 7.33±0.05 |
| 1.5 | 7.37±0.02 | 7.43±0.05 |
| 2.0 | 7.35±0.01 | 7.40 |
| 2.5 | 7.45±0.02 | 7.37±0.05 |
| 3.0 | 7.55±0.02 | 7.37±0.05 |
| 3.5 | 7.50±0.01 | 7.40 |
| 4.0 | 7.54±0.01 | 7.43±0.05 |
| 4.5 | 7.45±0.04 | 7.37±0.05 |
| 5.0 | 7.48±0.03 | 7.50 |
| 5.5 | 7.47±0.01 | 7.43±0.05 |
| 6.0 | 7.51±0.02 | 7.47±0.05 |
实验结果分析:暂养卵形鲳鲹 0~6h 期间,DFRobot 专业级 pH 计 V2 每 30min 测定结果的标准差均不超过 0.05,数据离散程度优于实验室用希玛 848 笔式 pH 计,表明该系统对鱼类保活实验中的 pH 监测具备良好适用性。
图 4-1 暂养卵形鲳鲹水体 pH 随时间变化趋势图

图 4-2 仪器差值随时间变化图

图 4-3 Bland-Altman 一致性分析

图 4-4 单个时间点内重复性

5 结论
本套面向渔业的 pH 监测系统由 pH 探头、pH 信号调理模块、M5Stack Tough 控制器构成,实现 pH 采集、LCD 可视化、RTC 时间同步、SD 卡 CSV 日志存储。重构渔业适配多状态记录框架,包含待机、手动单次取样、自定义定时时序记录、pH 阈值事件触发四种工作状态,可以分别适配养殖巡检、暂养时序监测、pH 异常预警等不同渔业需求;采用 pH 7.00、pH 9.18 两点校准,适配海水中性‑弱碱性水环境。
使用过程中,测量精度主要取决于以下因素:
①pH 探头是否保持湿润和清洁;
②是否使用有效标准缓冲液完成校准;
③探头是否充分浸入且读数稳定后再记录;
④信号模块与 ADC 接线是否正确、供电是否稳定;
⑤RTC 时间和 SD 卡是否正常工作。在每次正式测量前进行校准,并定期导出 SD 卡数据进行趋势分析,以提高pH监测的可靠性和可追溯性。
实验室性能测试表明,设备精密度、漂移度均达到渔业水质监测技术指标;卵形鲳鲹海水模拟暂养实测,系统数据稳定性优于对照笔式 pH 设备。该设备既可以用于水产实验室养殖生理实验,也可应用于工厂化暂养池、活鱼密闭运输箱体的现场在线监测,为海水经济鱼类保活运输工艺优化提供一种监测手段。
项目 代码:https://gitee.com/genvex/esp-ph-loger



