1. 从TDS传感器到智能水质监测系统

你可能见过那种插在水里就能显示数字的小型TDS检测笔,它们确实方便快捷,但有个致命缺陷——无法实现持续监测和数据记录。我在去年帮朋友搭建智能水培系统时就遇到过这个问题:半夜营养液浓度突然异常,等早上发现时作物已经受损。这正是传统检测设备的局限性。

TDS(总溶解固体)传感器则完全不同。它通过模拟信号输出,可以连接ESP32等微控制器实现:

  • 24小时不间断监测
  • 自动温度补偿
  • 数据记录与分析
  • 异常报警功能

实测下来,市面上常见的TDS传感器模块工作电压在3.3V-5.5V之间,功耗仅3-6mA,非常适合物联网场景。我比较推荐搭配ESP32使用,因为它内置ADC(模数转换器)和WiFi功能,单块开发板就能完成从数据采集到上传的全流程。

2. MicroPython开发环境搭建

第一次接触MicroPython的开发者常会遇到环境配置问题。根据我的踩坑经验,推荐以下配置方案:

  1. 固件刷写
esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash -z 0x1000 esp32-idf4-20210202-v1.14.bin
  1. 开发工具选择
  • Thonny IDE(新手友好)
  • VS Code + Pymakr插件(专业推荐)
  • Mu Editor(极简主义)
  1. 必备库安装
import upip
upip.install('micropython-umqtt.simple')
upip.install('micropython-urequests')

特别提醒:ESP32的ADC引脚输入电压范围是0-3.3V,而TDS传感器输出可能达到2.3V。我在实际项目中发现,直接连接会导致精度损失,建议配置分压电路:

[传感器] --(2.3V)--> [10KΩ电阻] --(1.65V)--> [ESP32 ADC]
                |
                [10KΩ电阻]
                |
               GND

3. 温度补偿算法的关键实现

很多开发者容易忽略温度对TDS测量的影响。实测数据显示,同一溶液在25°C时测得TDS为150ppm,当温度升至35°C时读数可能偏差超过10%。这是因为水温升高会增强离子活性,导致导电率增加。

MicroPython实现温度补偿的核心代码如下:

def get_compensated_tds(temperature):
    raw_voltage = adc.read() * 3.3 / 4095  # ESP32 ADC 12bit分辨率
    # 温度补偿公式
    comp_voltage = raw_voltage * (1 + 0.02 * (temperature - 25))
    # 三次方拟合曲线
    tds_value = 66.71*comp_voltage**3 - 127.93*comp_voltage**2 + 428.7*comp_voltage
    return round(tds_value, 1)

建议在实际部署时:

  1. 每30秒采集一次温度数据(DS18B20传感器性价比很高)
  2. 采用滑动窗口均值滤波(我通常用5点窗口)
  3. 设置异常值剔除机制(如±20%突变判定为无效)

4. 边缘计算架构设计

传统物联网方案会把原始数据全部上传云端,但在水质监测场景下这样做既浪费带宽又增加延迟。我的方案是采用三层处理架构:

  1. 边缘层(ESP32):
  • 实时数据采集(1Hz频率)
  • 本地温度补偿计算
  • 5分钟滑动平均值计算
  • 异常阈值判断(如>500ppm触发报警)
  1. 雾计算层(可选树莓派):
  • 多节点数据聚合
  • 24小时趋势分析
  • 本地规则引擎(如根据TDS变化自动调节水泵)
  1. 云端
  • 长期数据存储
  • AI模型训练
  • 多基地数据对比

具体到MicroPython实现,可以使用轻量级的MQTT协议:

from umqtt.simple import MQTTClient

def publish_data():
    client = MQTTClient("esp32_tds", "mqtt.iotserver.com")
    client.connect()
    while True:
        tds = get_compensated_tds(get_temperature())
        client.publish(b"sensor/tds", str(tds).encode())
        time.sleep(60)

5. 水培系统的实战应用

去年为某小型水培农场部署的监测系统,实现了这些关键功能:

  • 营养液自动调配
if tds < 300:
    pump.on()
    time.sleep(5)  # 添加营养液5秒
    pump.off()
  • 异常预警机制
def check_abnormal(values):
    if values[-1] > 2 * np.mean(values[:-1]):
        send_alert("TDS值异常升高!")
  • 数据可视化方案
  1. 本地LCD屏显示实时值
  2. 微信小程序远程查看
  3. Prometheus+Grafana监控看板

实际运行数据显示,这套系统将营养液浪费减少了35%,作物产量提升22%。最关键的是再也不用半夜起来手动检测水质了。

6. 常见问题排查指南

在十几个项目部署过程中,我总结出这些典型问题及解决方案:

  1. 读数不稳定
  • 检查电源电压(建议用示波器看纹波)
  • 确保探头远离容器壁(至少5cm)
  • 尝试添加0.1uF电容滤波
  1. 数值偏差大
  • 重新校准温度传感器(冰水混合物0°C测试)
  • 检查ADC参考电压(ESP32需外部提供稳定3.3V)
  • 测试标准溶液(如342ppm NaCl溶液)
  1. WiFi干扰
  • 为ADC引脚添加屏蔽层
  • 在ADC读取时临时关闭WiFi
  • 使用双核处理(Core0处理网络,Core1处理传感器)

对于长期部署的项目,建议每月用标准溶液进行一次人工校准。我习惯在设备维护日志里记录每次校准的原始数据和补偿参数,这样能清晰掌握传感器老化情况。

7. 进阶开发方向

当基础功能实现后,可以考虑这些增强功能:

  1. 多传感器融合
  • 结合pH传感器综合判断
  • 添加浊度传感器检测悬浮物
  • 集成ORP传感器评估氧化还原电位
  1. 预测性维护
# 使用指数平滑预测趋势
def predict_trend(values):
    alpha = 0.3
    forecast = values[0]
    for v in values[1:]:
        forecast = alpha * v + (1-alpha) * forecast
    return forecast
  1. 节能优化
  • 动态调整采样频率(平静时1分钟1次,突变时1秒1次)
  • 深度睡眠模式(仅ESP32就有多种睡眠模式可选)
  • 太阳能供电方案(配合超级电容应对阴雨天)

最近我在试验将TensorFlow Lite微控制器框架移植到ESP32上,尝试直接在边缘端运行简单的水质预测模型。虽然性能有限,但对于实时性要求高的场景确实能减少云端依赖。

更多推荐