pH值这条0到14的酸碱度刻度,广泛应用于游泳池水质管理、农田灌溉、污水处理及环境监测等众多领域:数值越小代表酸性越强,数值越大代表碱性越强,7则为中性的纯水。
本项目将使用Arduino Uno主控板,搭配Gravity模拟pH传感器模块和16×2 LCD显示屏,制作一个能够实时显示溶液酸碱度的小型仪表。教程将完整展示从电极信号采集、模拟量转换、LCD显示到电极校准的全过程。
项目概览:搭建教学级Arduino pH计
- 核心功能
- 使用 Gravity 模拟 pH 传感器 采集溶液pH值对应的模拟电压信号。
- Arduino通过模拟引脚A0读取电压,并通过计算转换为pH值。
- 使用 16×2 LCD显示屏(I2C接口) 实时显示测量读数。
- 支持通过修改代码中的校准参数来修正测量精度,提升准确性。
- 项目规格
- 搭建耗时:约 2–4 小时
- 预估成本:30–50 美元
- 难度等级:初级至中级
- 学习要点:模拟传感器接口、I2C通信驱动LCD、pH传感器校准原理、Arduino编程
- 应用场景:水质监测、水族箱管理、农业灌溉检测、污水处理监控等。
所需硬件清单
- Arduino Uno ×1
- 作为核心控制器,负责读取传感器电压、计算pH值并驱动LCD显示。
- 16×2 字符LCD显示屏 ×1
- LCD I2C适配模块 ×1
- 将标准的16×2 LCD转换为I2C接口,极大简化接线。
- Gravity 模拟pH传感器 ×1(包含探头与信号转换板)
- 面包板 ×1、杜邦线若干

pH传感器原理简述:从玻璃电极到电压信号
在开始动手搭建前,我们先简要了解pH测量的基本原理。
- pH值是氢离子浓度的负对数,用于量化溶液的酸性或碱性程度。
- 常见的pH标度范围为0–14,0为强酸性,14为强碱性,7为中性。

本项目使用的Gravity模拟pH传感器专为测量溶液pH值设计,常见于农业、废水处理、工业及环境监测等领域。其信号转换板的技术特性如下:
- 供电电压:3.3–5.5 V
- 接口:标准BNC探头接口
- 测量精度:±0.1(在25℃时)
- 检测范围:0–14 pH
pH电极探头本身的主要参数包括:
- 工作温度:5–60 ℃
- 零点(中性点):7 ± 0.5 pH
- 内阻:< 250 MΩ
- 支持简易校准


这种pH传感器本质上是一种玻璃电极。其内部的电化学系统由特殊的玻璃膜、已知pH值的内部缓冲溶液、参比电极和测量电极等组成。

当电极浸入待测溶液时,溶液中的氢离子(H⁺)会在玻璃膜两侧产生一个与pH值相关的电位差(电势)。这个关系可以用能斯特方程(Nernst equation)来描述。Gravity模块的信号板已将此微小的电势信号进行放大和滤波,最终输出一个稳定的、Arduino可读取的模拟电压。
硬件连接步骤
1. 连接pH传感器板与Arduino
- Arduino 5V → pH传感器板 V+
- Arduino GND → pH传感器板 G
- Arduino A0 → pH传感器板 Po
至此,模拟电压信号的采集通路建立完成。
2. 连接LCD与Arduino
显示部分采用16×2 LCD搭配I2C模块,通过I2C总线连接到Arduino的专用引脚:
- LCD I2C模块的 SDA → Arduino SDA (A4)
- LCD I2C模块的 SCL → Arduino SCL (A5)
这种连接方式使得Arduino仅用两根线即可控制LCD显示,节省了宝贵的I/O口资源。
代码实现:采样、滤波、计算与显示
1. 引入库与定义全局变量
首先包含必要的I2C和LCD库,并初始化LCD对象。同时,定义一个用于校准的关键参数。
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // 设置LCD I2C地址与尺寸
float calibration_value = 21.34; // 校准参数,需根据实际测量调整
2. setup() 函数:初始化
在setup()函数中,初始化串口通信用于调试,并启动LCD,显示欢迎界面。
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" pH Meter Ready ");
delay(2000);
lcd.clear();
}
3. loop() 函数:核心测量逻辑
主循环中实现了完整的信号处理流程,包含多次采样、中值滤波和pH值计算,其算法能有效平滑模拟输入噪声。
void loop() {
int sensorValue[10];
long avgValue = 0;
// a. 采集10个样本
for(int i=0; i<10; i++) {
sensorValue[i] = analogRead(A0);
delay(30);
}
// b. 对样本进行排序(升序)
for(int i=0; i<9; i++) {
for(int j=i+1; j<10; j++) {
if(sensorValue[i] > sensorValue[j]) {
int temp = sensorValue[i];
sensorValue[i] = sensorValue[j];
sensorValue[j] = temp;
}
}
}
// c. 取中间6个值求平均
for(int i=2; i<8; i++) {
avgValue += sensorValue[i];
}
float avgVoltage = (float)avgValue * 5.0 / 1024 / 6; // 转换为电压值
// d. 计算pH值并显示(线性公式)
float pH_Value = -5.70 * avgVoltage + calibration_value;
lcd.setCursor(0, 0);
lcd.print("pH Value: ");
lcd.setCursor(10, 0);
lcd.print(pH_Value);
delay(1000); // 每秒更新一次
}
代码通过线性公式 pH = -5.70 * 电压 + calibration_value 将电压值转换为pH读数,并每秒在LCD上刷新显示结果。
pH电极校准方法
由于电极个体差异和环境因素,校准是保证测量准确的关键步骤。
- 准备标准液:准备一份pH值已知的标准缓冲溶液(如pH 7.0)。
- 测量与读数:将彻底清洗后的pH电极浸入标准液,等待LCD读数稳定。
- 计算偏差:记录LCD显示值(例如6.8)与标准液真实值(7.0)的差值(+0.2)。
- 调整参数:在代码中,将
calibration_value 加上此差值(从21.34改为21.54)。
- 验证:重新上传程序,再次测量同一标准液,观察显示值是否更接近7.0。可重复此过程直至满意。
通过精细调整calibration_value,可以有效地补偿系统误差。
项目完整开源代码可参考:CircuitDigest GitHub仓库
实测演示:纯水与柠檬水
实测结果表明,该装置能够有效区分中性与酸性溶液,整套硬件与软件系统工作正常。
应用场景总结
这套自制的Arduino pH计适用于多种需要快速、低成本酸碱度检测的场景,例如:
- 家庭水质或泳池水质快速检查。
- 水族箱水质管理。
- 农业灌溉用水或土壤浸出液的酸碱度评估。
- 教育领域的化学或环境科学实验教学。
- 污水处理厂或环保项目的初步水质筛查。
结合直观的LCD显示和灵活的代码校准功能,本项目不仅是学习模拟传感器接口、I2C通信和传感器校准算法的优秀实践案例,也可作为一个实用的基础测量工具。
总结
本项目详细介绍了如何使用Arduino Uno、Gravity模拟pH传感器和I2C LCD显示屏,构建一套完整的pH值测量系统。硬件连接简洁明了,软件层面通过中值滤波和线性转换算法将电极信号稳定地转换为pH读数,并提供了便捷的软件校准方法。该方案能够满足水质监测、水产养殖、农业及环保等多个领域的入门级pH测量需求,同时也为物联网硬件开发与传感器应用提供了扎实的学习范例。