做 STM32 水质监测、净水设备状态显示或环境数据采集时,我们经常想知道“水中溶解的物质大概有多少”。本资料中的模块将电极驱动、信号采样、TDS 换算和温度处理放在板上,单片机发送一条串口检测命令,就能读取一组 TDS 和水温数据。

图 1  探头、数字模块、单片机与应用之间的工作链路

一、先认识 TDS、探头和模块

手册中的正式名称为“单路数字 TDS 传感器模块”。TDS 是 Total Dissolved Solids,中文为总溶解性固体。本文以单路模块为主,双路资料用于说明版本区别,不把两种协议混写。

1. 探头不是整块传感器系统

浸入水中的 BA01 探头包含导电测量电极和温度敏感元件;干燥位置的模块板负责激励、采样与计算。

2. ppm 是什么?为什么常看到 mg/L?

ppm 表示百万分之一的比例。对于密度接近 1 kg/L 的稀水溶液,质量浓度的数值常近似用 1 ppm ≈ 1 mg/L 理解。这个近似有条件,不能把它套用于所有液体和高浓度溶液。模块利用导电特性估算 TDS,并没有把水蒸干后称量残留物。

读数反映的是一个总量相关指标。它不能告诉你是哪种离子、有没有细菌或某种重金属,也不能单凭一个 TDS 数值判断水是否可以饮用。

二、新手最应该记住的模块参数

以下数值来自单路模块用户手册与尺寸图。

表 1  单路数字 TDS 模块关键参数及含义

项目

资料参数

怎么理解

TDS 测量范围

0~3000 ppm

用于该量程内水样,不适合直接测海水。

TDS 测量误差

< 2% F.S.

按满量程理解:3000 × 2% = 60 ppm。

TDS 协议数值步长

1 ppm

结果按整数传输,不等于准确到 1 ppm。

温度测量范围

0~100 ℃

模块测量范围,不代表配套探头可耐 100 ℃。

温度测量误差

±0.5 ℃

附件未给详细测试条件,按手册标称引用。

温度协议数值步长

0.01 ℃

两字节整数除以 100;小数位不等于精度。

供电电压

3.3 V

未给 5 V 兼容依据,按 3.3 V 接入。

电源纹波要求

< 20 mV

需要干净电源;普通万用表难以检查纹波。

工作电流

< 3 mA

是模块指标,不是探针允许激励电流。

模块环境温度

−10~75 ℃

指板子使用环境,与水温测量范围分开。

测量通道

1 路 TDS + 对应温度

两只 2 针接口不代表两个 TDS 通道。

通信接口

UART,9600 bps

TTL 逻辑串口,不是 I2C、RS-232 或 RS-485。

串口格式

8N1,无硬件流控

8 数据位、无奇偶校验、1 停止位。

指令长度

6 字节

1 字节命令 + 4 字节参数 + 1 字节校验。

单路测量返回

6 字节 AA 帧

同时包含 TDS 和温度,不是双路的 12 字节。

电极驱动

双极性驱动

交替极性以减轻极化,不能保证永不污染。

默认 NTC 参数

R25 = 10 kΩ;B = 3435 K

匹配热敏电阻,换探头时应重新核对。

NTC 上拉电阻

10 kΩ

原理图 R2,参与温度电阻分压采样。

模块板尺寸

约 21.0 × 15.8 mm

来自单路尺寸图;不是探头外形尺寸。

测量响应时间

手册未明确规定

例程中的 100 ms 或 1 s 不能当保证值。

F.S. 是 Full Scale(满量程)。例如显示 100 ppm 时,不能把“<2% F.S.”理解为误差仅 2 ppm;它与“读数的 2%”不同。资料也没有说明低量程、温度变化与不同离子组成下的完整误差曲线。

三、两根金属电极怎样“测出水质”?

原理的起点是电导,不是“电极识别出了水里所有物质”。水中的可移动离子参与导电;离子种类、浓度和温度改变时,电导响应也会变化。对于合适的水样,这种响应可用来估算 TDS,但估算结果依赖模型和标定条件。

图 2  水中离子导电与双极性激励的概念示意

专用芯片内集成振荡电路、模数转换电路(ADC)和浮点运算单元。可以按功能理解为:建立检测激励,把模拟响应转成数字,再结合温度进行运算,最后通过 UART 输出结果。

1. 从电流、电压到电导率

对电极施加受控激励,并测量响应,可以得到与导电能力有关的量。理想化理解中,电导 G = I / V;电导率 EC 还需要考虑探头的几何因素,即电极面积、间距等形成的电极常数。因此不能只更换一副形状不同的金属针,却期望原有标定始终有效。

2. 为什么换算成 TDS 后仍是“估算”?

常见入门关系写作 TDS ≈ k × EC,其中 EC 常以 μS/cm 表示,k 为换算系数。这个式子用来帮助理解,不能据此断言本模块内部固定使用某个系数。不同水样的离子组成不同,同样电导率未必对应完全相同的 TDS。

3. 为什么不用长期直流一直加在电极上?

持续单向激励可能使电极界面发生极化,改变测量响应,并增加电化学效应。模块采用双极性驱动来减轻这类影响。它不是让用户给两根探针直接接电源:探针应接入模块的专用 TDS 接口,由模块控制驱动与采样。电极结垢、附着污染和气泡仍会影响读数。

这块模块给主机的检测协议是 TDS + 温度,附件未给出直接读取 EC 的独立命令。探头名称带“EC”,不代表 UART 默认会输出电导率数据。

四、为什么 TDS 模块还需要一根温度探头?

同一杯水即使没有加入新的盐,温度变化也会改变离子的迁移能力和导电响应。模块利用 NTC 测水温,并据此校正 TDS,从而减少“把水温变化误认为浓度变化”的问题。NTC 是负温度系数热敏电阻,温度升高时阻值通常下降。

图 3  NTC 分压测温与 TDS 温度校正的作用关系

1. 板上的 10 kΩ 电阻做什么?

原理图中 R2 从 3.3 V 接到温度采样节点,NTC 的另一端接地,C3 = 100 nF 从采样节点接地用于滤波。忽略输入负载时,节点电压可近似为 3.3 × RNTC / (10 kΩ + RNTC)。在 25 ℃且 NTC 约 10 kΩ 时,节点约为 1.65 V;温度升高、阻值下降,节点电压也随之下降。

2. R25 和 B 值分别告诉模块什么?

R25 是 25 ℃时的标称电阻,B 值描述阻值随温度变化的特性。模块默认 R25 = 10 kΩ、B = 3435 K;BA01 规格书也给出 R25 = 10 kΩ ±1%、B25/85 = 3435 K ±1%。如果接了 100 kΩ 或不同 B 值的探头却保持默认参数,温度就可能算错,并进一步影响 TDS 校正。

3. 不接 NTC 能不能用?

单路手册说明:没有温度检测 NTC 时,芯片仍可工作,但 TDS 不具备温度校正效果。此时不能把温度字段当成可靠水温。软件应记录探头配置状态;如果本来应该有 NTC,却发生断线,也不能当成正常无温度模式继续使用。

常见温度校正模型会把某温度下的 EC 折算到参考温度;但附件没有公开模块所用系数、参考温度和完整算法。已经由模块完成校正的 TDS 不宜在 STM32 中再随意套一次补偿公式,否则可能重复补偿。

五、单路数字 TDS 模块由哪些部分组成?

这次附件提供了板级原理图,因此可以把实际器件的作用说清楚。U1 标注 BA111;CN1 接 NTC,CN2 接 TDS 电极;H1 提供供电与串口连接。原理图的接口编号与手册图示视角不同,实际接线始终按信号名称确认。[2]

图 4  根据单路原理图整理的核心芯片、接口与外围器件

表 2  原理图中各器件的作用

器件 / 接口

资料标注

新手怎么理解

U1

BA111,8 引脚

负责电极激励、采样处理和 UART 通信;独立芯片规格未附。

C1 / C2

10 μF / 100 nF

并联在电源与地之间,帮助稳住供电、抑制不同频段干扰。

R1

1 kΩ

位于 TDS 驱动支路;不能随意改变阻值来“提高精度”。

R2

10 kΩ

NTC 分压上拉,改变它会影响温度换算关系。

C3

100 nF

温度采样节点滤波,减少该节点的快速噪声。

CN1 / CN2

XH2.54-2

分别接温度线与 TDS 电极线,功能不能互换。

H1

GND / TX / RX / 3V3

对应原理图脚号 1 / 2 / 3 / 4;按信号接线。

为什么不把单路板写成“带指示灯、带稳压”?

单路原理图没有给出稳压器或 LED;双路原理图则有 D1 红色指示灯。把双路板的 LED 或其他产品的稳压芯片写进单路组成,会误导新手判断供电与硬件故障。本板按 3.3 V 电源直接接入理解,不能因为接口叫 VCC 就接 5 V。

六、BA01 探头与单路、双路版本有什么区别?

图 5  BA01 电极线、温度线与模块接口的对应关系

表 3  BA01 探头参数与整套使用边界

探头项目

附件信息

怎么理解

探针 / 主体材料

钛合金 / ABS

与模块板材、芯片封装是不同层级的参数。

线缆长度

规格书 500 ±20 mm

宣传图为 50 ±1 cm,公差口径不同;实物版本需确认。

温度元件

10 kΩ NTC,B25/85 = 3435 K

与模块默认参数相匹配,仍需核对实际订货探头。

组件温度限制

BA01 选型表 0~70 ℃

保护罩规格也为 0~70 ℃,不按模块 100 ℃上限使用。

探针电压 / 电流

≤5 V / ≤10 mA

探针端的规格限制,不是模块供电范围,也不是建议直接加电。

防水范围

探头头部与导线可浸水

连接器和信号板不防水;没有给出整套 IP 等级。

1. 为什么有两个插口,却仍叫“单路”?

一个插口接导电电极,另一个接温度元件,两者服务同一份水样。双路板是两套 TDS + NTC,可分别观察进出水。双路手册要求两只 TDS 探头同型号;若都放入同一水体,应保持适当距离以减小干扰,但附件没有给具体距离数值。

2. 软件上的区别,比“多接一只探头”更重要

单路 AA 帧的第 3、4 参数字节是温度;双路 AA 帧的后两个参数字节却是第二通道 TDS,温度另由 AB 帧返回。不能拿双路程序的“等待 12 字节”直接套在单路上。后文先讲清单路格式,再给出双路对照。

七、串口怎样传送 TDS 和温度?

本模块不是 DHT11 的单线协议,也不是 I2C。它使用异步串口:TX 用来发送,RX 用来接收,没有单独的时钟线;收发双方预先约定 9600 bps、8N1。电气接口是逻辑电平串口,接电脑时需要合适的 USB 转 TTL 转换器。

图 6  UART 的起始位、8 个数据位与停止位

1. 发送十六进制字节,不是发送字符串

检测命令为 A0 00 00 00 00 A0,共 6 个字节。串口助手要选 HEX 发送,不要自动追加回车换行。文本模式输入“A0”,会发送字符 A 和字符 0,即 0x41、0x30;模块需要的却是一个 0xA0。两者完全不同。

2. 一条检测命令怎样得到结果?

主机先把 6 字节命令发给模块,模块处理后返回测量结果或异常状态。单路成功测量结果以 AA 开头,整帧 6 字节。UART 是字节流,一次串口中断只收到一个字节是正常现象;一次电脑读取也可能收到半帧或多帧,不能把软件“收到一批数据”等同于“收到一整帧”。

3. 字节传输时间,不是测量完成时间

9600 8N1 下,6 字节在线路上传输约需要 6.25 ms。但模块内部的测量、温度处理和响应等待还需要时间。附件没有给出严格的最大响应时间,因此不能据此规定“6.25 ms 后一定有结果”。初测可采用较慢查询周期并记录真实响应时间,再设置合理超时。

UART 的“无奇偶校验”只是 8N1 的字节层设置,不表示应用数据帧可以不检查校验和。电气格式、帧格式和数据含义要分开理解。

八、6 个字节具体装了什么?

单路正常测量结果按 AA、TDS 高字节、TDS 低字节、温度高字节、温度低字节、校验字节排列。手册的“2 个通道 TDS 值”字样与单路格式不符;STM32 与 Arduino 例程均将后两个参数字节解析为温度,因此本文按此解释。

图 7  TDS 与温度的拆字节、拼接和单位换算

1. 高低字节怎样合成一个数?

TDS = 高字节 × 256 + 低字节;温度 =(温度高字节 × 256 + 温度低字节)/ 100。示例中 0x0064 = 100,TDS 为 100 ppm;0x0A96 = 2710,水温为 27.10 ℃。温度字段的两位小数只是传输步长,模块温度标称误差仍为 ±0.5 ℃。

2. 为什么图里特地给 AE 加了星号?

手册原例为 AA 00 64 0A 96 40。依据检测命令、A3、A5 和双路帧示例一致的“前 5 字节累加取低 8 位”规则,前五字节之和为 0x1AE,应得到 AE,而不是 40。附件未明确写出校验算法公式,且例程没有验证接收校验,因此 AE 是有依据的推算,不是已验证的硬件回包。首次联调应抓取真实帧,与厂家确认该版本规则;不要把印刷疑点写死成正常协议。

表 4  单路与双路正常检测回包的字段区别

版本 / 帧类型

前两个参数字节

后两个参数字节

单路 AA,一帧 6 字节

TDS

温度 ×100

双路 AA,第一帧 6 字节

通道 1 TDS

通道 2 TDS

双路 AB,第二帧 6 字节

通道 1 温度 ×100

通道 2 温度 ×100

双路同样不能简单假定一次读取必得 12 字节,应按两个 6 字节帧分别组帧、检查类型和有效性。异常返回 AC 需要单独处理,不能当成测量帧。

九、接 STM32 或电脑,最简单的连法是什么?

这里沿用附件 STM32 测试工程的 USART3:PB10 发送、PB11 接收。模块串口为 9600 bps。工程里 USART1 初始化为 115200,但它不是这里连接 TDS 模块的串口;USART2 用于向外打印解析后的文字结果。[3]

图 8  STM32F103 的 USART3 与单路模块的交叉收发连接

表 5  最小接线关系

主机侧

模块侧

作用

3.3 V 电源

3V3

稳定供电,核对纹波和供电能力。

PB10 / TX

RX

STM32 发送检测命令给模块。

PB11 / RX

TX

STM32 接收模块的二进制返回帧。

GND

GND

共地,建立逻辑电平参考。

BA01 红 / 黑线

TDS 接口

连接两根测量电极线。

BA01 黄 / 白线

NTC 接口

连接温度元件,不接到 UART。

先用电脑跑通,再移植到单片机

用 3.3 V 逻辑的 USB 转 TTL 模块,TX 接传感器 RX、RX 接传感器 TX,连接共地并正确供电。打开对应串口,设 9600、8 数据位、无校验、1 停止位,HEX 发送 A0 00 00 00 00 A0,并使用 HEX 接收观察完整字节。

不要把 USB 转串口板上“3.3 V 电源输出”误认为其 TX 一定是 3.3 V 逻辑,应核对转换器设计。不要直接接 RS-232 或 RS-485 端子。模块已有独立供电时,应先理清电源关系,避免两个电源输出直接并联。

十、STM32 软件应该如何可靠地读取?

新手先建立一条清晰链路:发命令、收完整帧、判断状态、解析数值、更新显示。不能仅看到第一个字节是 AA,就把后面的缓冲区内容全部当成新数据。

图 9  带有超时、状态判定和数据有效性的读取流程

1. 定时查询与字节接收分工

可先每约 1 s 发起一次查询,并记录响应耗时;这属于起步策略,不是厂家规定的最小采样周期。中断或 DMA 负责接收字节,主循环在完整帧准备好后处理。正在等待响应时不要无限追加新查询;忙碌或超时应有有限重试与退出条件。

十一、基线校准、NTC 配置与异常返回

普通读取只需要检测命令。基线校准和 NTC 设置会改变测量依据,应在明确目的、记录原设置后进行;不要为了“让显示更好看”反复校准,也不要每次开机自动覆盖参数。

图 10  校准前确认条件、校准后验证结果的基本顺序

表 6  手册命令示例与需要注意的含义

功能

手册给出的 6 字节示例

怎么理解

读取测量

A0 00 00 00 00 A0

正常单路返回 AA 测量帧。

基线校准

A6 00 00 00 00 A6

手册要求探头处于 25 ±5 ℃纯净水中。

设 NTC 常温阻值

A3 00 01 86 A0 CA

参数为 100000 Ω = 100 kΩ,不是默认 10 kΩ。

设 NTC B 值

A5 0F 0A 00 00 BE

0x0F0A = 3850 K,不是默认 3435 K。

设置成功返回

AC 00 00 00 00 AC

需检查状态,不把任何 AC 都视为成功。

1. 默认 BA01 配套不应照抄“设置示例”

BA01 规格对应 10 kΩ、3435 K,手册的 A3 / A5 示例只是展示编码方式。按同一参数布局与累加规则推算,10 kΩ 对应 A3 00 00 27 10 DA;3435 K 对应 A5 0D 6B 00 00 1D。这些是推算帧,未做硬件验证;已有匹配默认值时无需重发设置,修改前应确认具体版本。

2. AC 后面的状态码不能忽略

手册异常码为 01:命令帧异常;02:忙碌中;03:校正失败;04:检测温度超出范围。错误模板写成 AC XX 00 00 00 AE,但按累加规则,AE 只与 XX = 02 相符,其他错误码的校验也应变化。单路手册还残留“两个通道同时校准”的字样,不能据此把单路硬件解释成双路。

附件未说明基线校准的完整机理、参数保存方式和恢复默认操作。校准后应重新读取,记录水样、温度、回包和重复性;若不能稳定复现,先查探头与环境,不通过继续改参数掩盖问题。

十二、第一次使用,最容易踩的 9 个坑

图 11  浸没位置、容器距离与干湿边界的安装示意

1. 显示为 0,就认定是纯水

也可能是探头未浸没、接口松动、通信失败或旧值。先确认有效 AA 帧,再检查探头状态。

2. 把温度接口当成第二路 TDS

NTC 与 TDS 两接口用途不同。接反可能导致异常温度,并影响 TDS 校正;按线组与丝印复核。

3. 波特率正确,却总是无返回

检查 TX / RX 是否交叉、是否共地、是否 HEX 发送,以及是否误加回车换行。再核对串口与供电电平。

4. Arduino 例程收够 12 字节才解析

单路例程确有 available() >= 12,但随后只读 6 字节,注释也不一致。单路应按实际 6 字节帧组帧,避免等待第二帧才处理第一帧。

5. 换水后读数迟迟不稳定

先冲洗并避免上个样品残留,再排除电极气泡;让温度平衡,固定深度和位置后观察稳定性。

6. 探头贴杯壁、触杯底或靠近其他电极

电场与导电路径可能改变。同一比较实验保持相似位置,双探头使用时减少相互干扰。

7. 认为模块测温 100 ℃,整套就能测开水

BA01 选型表和保护罩的边界为 0~70 ℃。整套系统按探头、线材、连接器和模块中的较严限制使用。

8. 用滤波掩盖数值跳变或温度错误

先排查电源纹波、接线、NTC 参数与收帧问题。平均值能减小随机波动,不能修复错误协议和错误补偿。

9. 把校准命令放进每次采样流程

校准需要特定条件,随意执行会改变基线。日常采样发 A0;只有明确需要时才进入独立校准流程。  

十三、若有项目需要可私信联系,包含但不限于:开题报告、嵌入式项目软硬件功能实现

更多推荐