用Arduino和TDS传感器DIY一个家庭水质监测仪(附ESP32/ESP8266完整代码)
2026/6/6 4:36:05 网站建设 项目流程

用Arduino和TDS传感器打造智能水质监测系统

最近几年,家庭健康监测设备越来越受到DIY爱好者的关注。水质作为影响健康的重要因素之一,其监测需求也日益增长。TDS(总溶解固体)作为衡量水质的重要指标,能够快速反映水中溶解性物质的含量。本文将手把手教你如何用常见的Arduino开发板和TDS传感器,打造一个功能完善的家庭水质监测系统。

这个项目不仅适合有一定基础的创客,也适合想要入门物联网开发的初学者。我们将从硬件选型开始,逐步讲解电路连接、代码编写、数据可视化以及云端数据上传等完整流程。最终你将获得一个能够实时显示水质数据,并支持远程监控的实用设备。

1. 硬件选型与准备

1.1 核心组件选择

构建一个水质监测系统,首先需要选择合适的硬件组件。以下是我们的推荐清单:

  • 主控板选择

    • Arduino Uno:适合入门级项目,价格便宜但功能有限
    • ESP32:推荐选择,内置Wi-Fi和蓝牙,适合物联网应用
    • ESP8266:性价比高,适合预算有限的项目
  • TDS传感器模块

    • 常见型号:Gravity TDS传感器、DFRobot TDS传感器
    • 工作电压:3.3V-5V
    • 测量范围:0-1000ppm(部分高端型号可达2000ppm)
    • 接口类型:模拟输出
  • 辅助模块

    • 温度传感器:DS18B20(用于温度补偿)
    • 显示模块:0.96寸OLED(I2C接口)
    • 电源模块:5V USB供电或3.7V锂电池

提示:购买TDS传感器时,注意选择带有防水探头型号,这样可以直接浸入水中测量。

1.2 硬件连接指南

正确的硬件连接是项目成功的关键。下面以ESP32为例,展示各模块的连接方式:

模块ESP32引脚连接说明
TDS传感器GPIO34模拟输入引脚
DS18B20GPIO4单总线接口
OLED SCLGPIO22I2C时钟线
OLED SDAGPIO21I2C数据线
// 引脚定义示例 #define TDS_PIN 34 #define ONE_WIRE_BUS 4

对于电源连接,建议使用独立的5V电源为传感器供电,避免开发板电源噪声影响测量精度。如果使用锂电池供电,记得添加一个升压模块将电压稳定在5V。

2. 软件环境搭建

2.1 开发环境配置

在开始编码前,需要准备好开发环境:

  1. 安装Arduino IDE(最新版本)
  2. 添加ESP32/ESP8266开发板支持
    • 在首选项中添加开发板管理器网址
    • 搜索并安装对应开发板包
  3. 安装必要库文件:
    • OneWireDallasTemperature(用于DS18B20)
    • Adafruit_SSD1306(用于OLED显示)
    • WiFiHTTPClient(用于网络功能)
# 通过Arduino库管理器安装所需库 工具 -> 管理库 -> 搜索并安装上述库

2.2 基础代码框架

水质监测系统的代码主要包含以下几个部分:

  • 传感器数据读取
  • 温度补偿计算
  • 数据显示
  • 数据上传(可选)

下面是一个基本的代码框架结构:

#include <Wire.h> #include <Adafruit_SSD1306.h> #include <OneWire.h> #include <DallasTemperature.h> // 全局变量定义 float tdsValue = 0; float waterTemp = 25.0; void setup() { // 初始化串口 Serial.begin(115200); // 初始化传感器 initSensors(); // 初始化显示 initDisplay(); } void loop() { // 读取传感器数据 readSensors(); // 处理并显示数据 processData(); displayData(); delay(1000); // 每秒更新一次 }

3. 核心功能实现

3.1 TDS值测量与温度补偿

TDS测量需要考虑温度补偿,因为水的电导率会随温度变化。以下是实现代码的关键部分:

float readTDS(float temperature) { static unsigned long analogSampleTimepoint = millis(); static int analogBuffer[SAMPLE_COUNT]; static int analogBufferIndex = 0; // 采样 if(millis() - analogSampleTimepoint > 40) { analogSampleTimepoint = millis(); analogBuffer[analogBufferIndex] = analogRead(TDS_PIN); analogBufferIndex = (analogBufferIndex + 1) % SAMPLE_COUNT; } // 计算平均值 float averageVoltage = getMedianValue(analogBuffer, SAMPLE_COUNT) * (VREF / 1024.0); // 温度补偿 float compensationCoefficient = 1.0 + 0.02 * (temperature - 25.0); float compensationVoltage = averageVoltage / compensationCoefficient; // 转换为TDS值 float tdsValue = (133.42 * pow(compensationVoltage, 3) - 255.86 * pow(compensationVoltage, 2) + 857.39 * compensationVoltage) * 0.5; return tdsValue; }

注意:TDS传感器的测量精度受多种因素影响,建议定期用标准溶液校准。

3.2 数据可视化实现

OLED显示可以让设备脱离电脑独立工作。以下是显示功能的实现:

void displayData() { display.clearDisplay(); // 显示标题 display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Water Quality Monitor"); // 显示TDS值 display.setCursor(0,20); display.print("TDS: "); display.print(tdsValue); display.println(" ppm"); // 显示温度 display.setCursor(0,40); display.print("Temp: "); display.print(waterTemp); display.println(" C"); display.display(); }

为了提升用户体验,可以添加水质评估功能,根据TDS值给出水质评级:

TDS值(ppm)水质评价
0-50纯净水
50-150优质饮用水
150-300一般饮用水
300-500硬水
500+不建议直接饮用

4. 高级功能扩展

4.1 物联网数据上传

让设备接入网络可以实现远程监控。以下是使用ESP32连接WiFi并上传数据到服务器的示例:

#include <WiFi.h> #include <HTTPClient.h> const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* serverURL = "http://yourserver.com/api/data"; void connectWiFi() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("Connected"); } void uploadData(float tds, float temp) { if(WiFi.status() == WL_CONNECTED) { HTTPClient http; http.begin(serverURL); http.addHeader("Content-Type", "application/json"); String payload = "{\"tds\":" + String(tds) + ",\"temp\":" + String(temp) + "}"; int httpCode = http.POST(payload); if(httpCode > 0) { Serial.printf("Uploaded: %s\n", payload.c_str()); } else { Serial.printf("Error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } }

4.2 手机App监控

对于更友好的用户界面,可以考虑开发配套手机App。有几种实现方式:

  1. Blynk平台:快速构建物联网App

    • 支持数据图表显示
    • 可设置报警阈值
    • 支持历史数据查询
  2. MQTT协议:轻量级物联网协议

    • 设备发布数据到MQTT broker
    • App订阅相关主题获取数据
    • 支持多种客户端平台
  3. 自定义App:使用Flutter或React Native开发

    • 完全自定义界面和功能
    • 需要后端服务器支持
    • 开发成本较高但灵活性最好
// Blynk集成示例 #define BLYNK_PRINT Serial #include <BlynkSimpleEsp32.h> char auth[] = "YourAuthToken"; void setup() { Blynk.begin(auth, ssid, password); } void loop() { Blynk.run(); // 定期发送数据到Blynk Blynk.virtualWrite(V1, tdsValue); Blynk.virtualWrite(V2, waterTemp); }

5. 项目优化与实用技巧

5.1 提高测量精度

水质监测的准确性至关重要,以下是几个提升精度的技巧:

  • 定期校准:使用342ppm或1413ppm的标准溶液校准
  • 稳定供电:使用线性稳压电源,避免开关电源噪声
  • 温度补偿:确保温度传感器与TDS探头处于同一环境
  • 探头维护:定期清洁探头,避免污染影响测量

5.2 低功耗设计

如果希望设备电池供电,需要考虑功耗优化:

  1. 睡眠模式:ESP32支持深度睡眠,可大幅降低功耗

    // 深度睡眠示例 esp_sleep_enable_timer_wakeup(60 * 1000000); // 60秒后唤醒 esp_deep_sleep_start();
  2. 传感器管理:仅在进行测量时给传感器供电

    digitalWrite(SENSOR_POWER_PIN, HIGH); delay(100); // 等待稳定 // 进行测量 digitalWrite(SENSOR_POWER_PIN, LOW);
  3. 显示优化:OLED仅在需要时刷新,或完全关闭显示

5.3 外壳设计与防水处理

一个实用的水质监测设备还需要考虑物理防护:

  • 3D打印外壳:设计防水外壳保护电子部件
  • 探头防水:确保只有传感器部分接触水
  • 安装方式:考虑固定支架或浮标式设计

对于长期水下监测的应用,可以使用防水盒配合电缆接头,确保电子部分完全隔离。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询