用Arduino和TDS传感器DIY一个家庭水质监测仪(附ESP32/ESP8266完整代码)
用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寸OLEDI2C接口电源模块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 开发环境配置在开始编码前需要准备好开发环境安装Arduino IDE最新版本添加ESP32/ESP8266开发板支持在首选项中添加开发板管理器网址搜索并安装对应开发板包安装必要库文件OneWire和DallasTemperature用于DS18B20Adafruit_SSD1306用于OLED显示WiFi和HTTPClient用于网络功能# 通过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。有几种实现方式Blynk平台快速构建物联网App支持数据图表显示可设置报警阈值支持历史数据查询MQTT协议轻量级物联网协议设备发布数据到MQTT brokerApp订阅相关主题获取数据支持多种客户端平台自定义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 低功耗设计如果希望设备电池供电需要考虑功耗优化睡眠模式ESP32支持深度睡眠可大幅降低功耗// 深度睡眠示例 esp_sleep_enable_timer_wakeup(60 * 1000000); // 60秒后唤醒 esp_deep_sleep_start();传感器管理仅在进行测量时给传感器供电digitalWrite(SENSOR_POWER_PIN, HIGH); delay(100); // 等待稳定 // 进行测量 digitalWrite(SENSOR_POWER_PIN, LOW);显示优化OLED仅在需要时刷新或完全关闭显示5.3 外壳设计与防水处理一个实用的水质监测设备还需要考虑物理防护3D打印外壳设计防水外壳保护电子部件探头防水确保只有传感器部分接触水安装方式考虑固定支架或浮标式设计对于长期水下监测的应用可以使用防水盒配合电缆接头确保电子部分完全隔离。