水温浑浊度pH三参数监测、超标自动换水、手机APP远程查看附摘要吹溶氧氨氮、图注抄成GPS翻车实录一、系统功能拆解二、器件选型对比2.1 主控STM32F103C8T6 vs STM32F407VG2.2 水温DS18B20 vs LM352.3 浑浊度SEN0189 红外 vs SEN0176 激光2.4 pHPH-4502C vs SEN01612.5 通信与显示2.6 BOM 成本清单三、硬件接线四、软件设计4.1 主程序框架4.2 关键子程序一DS18B20 非阻塞读水温4.3 关键子程序二pH 两点校准原文完全没做的一步4.4 关键子程序三SEN0189 浑浊度采样4.5 关键子程序四pH 超标自动换水带防抽干保护五、系统调试验证六、常见坑汇总原文翻车实录七、可扩展方向养鱼先养水。鱼缸水质崩了鱼翻肚往往就在一夜之间——等你肉眼发现水浑、鱼浮头亚硝酸盐早就爆表了。市面上一支带温度补偿的 pH 笔就要上百溶氧仪更是几百起步。其实用 STM32 三支传感器一百出头就能做一套水温、浑浊度、pH 三参数实时监测 超标报警 自动换水 手机远程查看的系统。本文基于一篇毕设论文改写方案、选型、接线、代码一次讲清顺带扒一扒原文摘要吹了没做的参数、图注从别的论文抄串这些一抓一个准的翻车点。一、系统功能拆解功能域模块说明水质监测DS18B20 防水探头水温检测超阈值报警水质监测SEN0189 红外浑浊度水中颗粒物散射测浑浊超阈值报警水质监测PH-4502C pH 电极酸碱度检测超标触发换水泵人机交互OLED12864实时显示三参数人机交互4 按键本地设置阈值远程通信ESP8266MQTT→阿里云数据上云APP 远程查看设阈值报警执行蜂鸣器 LED超限声光报警换水执行继电器 小水泵pH 超标自动换水带防抽干保护主逻辑初始化 → 循环采集三参数 → OLED 刷新 → MQTT 上云 → 水温/浑浊度超阈值声光报警 → pH 超标启动换水泵限时保护→ 响应按键与 APP 指令。二、器件选型对比2.1 主控STM32F103C8T6 vs STM32F407VG三路采集里两路是 ADC浑浊度、pHC8T6 自带 2 个 12 位 ADC、10 个通道完全够用选它合理。2.2 水温DS18B20 vs LM35⚠️原文又一个理由写反结论说DS18B20 提供了更高的测量精度和更广泛的温度范围——LM35 精度 ±0.25°C 高于 DS18B20 的 ±0.5°C量程 150°C 也宽于 125°C。DS18B20 真正的优势是防水封装成品探头 数字输出免标定鱼缸场景就该选它但理由得写对。另外原文结论还写成选择方案1DS18B20——DS18B20 是方案2编号又张冠李戴了。2.3 浑浊度SEN0189 红外 vs SEN0176 激光对比项SEN0189红外 850nmSEN0176激光原理红外 LED 光电管测散射激光散射分辨率高价格≈45 元≈200 元适用家用浑浊度粗判精密测量家用鱼缸只需要知道水是否开始浑了SEN0189 够用。注意SEN0189 输出的是模拟电压浑浊度百分比并没有严格的物理单位正规写法应换算 NTU 或直接以电压/ADC 值表征——原文写将电压值转换为水质浑浊度的百分比一个没有定义的百分比答辩会被问百分比相对什么。2.4 pHPH-4502C vs SEN0161PH-4502C±0.1pH配 BNC 电极比 SEN0161±0.2pH精度高一档做水质监测选它合理。但有两个原文没提的硬前提PH-4502C 要 5V 供电。原文电路写VCC 与单片机的 3.3V 相连——这个板子是按 5V 设计的含板载 LED 和放大电路3.3V 供电读数漂移严重。正确做法5V 供电OUT 信号经分压2:1后再进 3.3V ADC。pH 电极必须两点校准。用 pH4.01 和 pH6.86 标准液标定斜率和偏移不校准的 pH 读数纯属随机数。原文软件章节通篇没有校准流程这是 pH 测量最大的坑。2.5 通信与显示ESP8266-01S家庭 Wi-Fi 直连 OLED12864I2C常规选择。原文一处抄串的坑显示选型结论OLED12864 如图3.6 所示图注却印着图3.6 ATGM336H 选型图——ATGM336H 是 GPS 定位模块跟鱼缸八竿子打不着明显是模板复制没改干净。图注、编号交稿前必须逐个核。2.6 BOM 成本清单器件参考价STM32F103C8T6 最小系统板≈15 元DS18B20 防水探头≈8 元SEN0189 浑浊度模块≈45 元PH-4502C pH 玻璃电极≈30 元ESP8266-01S≈10 元OLED12864I2C≈10 元继电器 5V 小水泵≈15 元蜂鸣器、LED、按键、洞洞板≈10 元合计≈143 元三、硬件接线模块引脚说明DS18B20 DQPB84.7kΩ 上拉防水探头直接入水SEN0189 AOPA1ADC1_IN15V 供电AO 输出注意量程PH-4502C OUTPB1ADC1_IN9→ 分压后⚠️ 见接线坑 1OLED SDA/SCLPB6/PB7I2C1—ESP8266 TX/RXPA2/PA3USART2115200bps继电器水泵PA0高电平吸合蜂鸣器PB9高电平响按键×4PB12~PB15内部上拉接线坑三条PH-4502C 的 5V/3.3V 混搭问题板子 5V 供电OUT 静态输出约 2.5V、极限可到 5V直接接 F103 的 ADC 有过压风险F103 引脚耐压 3.6VADC 满量程 3.3V。用两个 10kΩ 分压成 0~2.5V 再进 ADC标定时把分压比一起标进去。两个 ADC 别用 ADC3原文 pH 章节调用Get_Adc3——C8T6 根本没有 ADC3ADC3 只在 100 脚以上的 F103 才有浑浊度章节又用 ADC2。实际两路都挂 ADC1 的不同通道即可代码抄大的芯片的工程就会出这种错。水泵走继电器隔离5V 潜水泵启动电流是标称的 3~5 倍别用 IO 直推继电器线圈两端并一个续流二极管1N4007否则断电瞬间反向电动势会打坏驱动管。四、软件设计4.1 主程序框架int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(); TIM4_Init(300, 7200); /* 1ms 时基 */ OLED_Init(); DS18B20_Init(); /* PB8 水温 */ Relay_init(); /* PA0 换水泵 */ KEY_Init(); /* PB12~PB15 */ Beep_init(); /* PB9 */ Adc_Init(); /* PA1 浑浊度 / PB1 pH */ ALi_ESP8266_GPIO_Init(); MQTT_Buff_Init(); AliIoT_Parameter_Init(); while (1) { Sensor_Update(); /* 三参数采集 */ OLED_Display_Cotrol(); /* 显示刷新 */ Alarm_Check(); /* 水温/浑浊度超限 - 声光报警 */ PH_AutoWater(); /* pH 超标 - 换水限时保护 */ Key_Scan(); /* 阈值设置 */ MQTT_Loop(); /* 上报 响应 APP 指令 */ } }先说原文代码里一个刺眼的残留附录主程序开头赫然写着u16 Servor_CPWM_Set_Buffer[9] {1500,2450,...}——这是舵机云台例程的 PWM 脉宽数组1500µs 中位、2450µs 限位跟鱼缸系统毫无关系纯粹的复制残留。抄例程时记得删干净这种一行代码就能让答辩老师起疑。4.2 关键子程序一DS18B20 非阻塞读水温void DS18B20_Task(void) { static u8 phase 0; static u32 t0; switch (phase) { case 0: /* 发起转换 */ DS18B20_Reset(); DS18B20_WriteByte(0xCC); /* 跳过ROM */ DS18B20_WriteByte(0x44); /* 启动转换 */ t0 GetTick(); phase 1; break; case 1: /* 750ms 后再读期间不阻塞主循环 */ if (GetTick() - t0 750) { DS18B20_Reset(); DS18B20_WriteByte(0xCC); DS18B20_WriteByte(0xBE); /* 读暂存器 */ u8 tl DS18B20_ReadByte(); u8 th DS18B20_ReadByte(); water_temp ((s16)((th 8) | tl)) * 0.0625f; phase 0; } break; } }4.3 关键子程序二pH 两点校准原文完全没做的一步pH 电极的能斯特响应是一条直线pH K * V BK 和 B 由两种标准液标定typedef struct { float v4, v7; } PH_Calib; /* 标定电压 */ float PH_GetValue(PH_Calib *c) { float v Adc_ReadAvg(CH_PH, 20) * 3.3f / 4095; /* 分压后电压 */ /* 两点法pH4.01 对应 v4pH6.86 对应 v7 */ float k (4.01f - 6.86f) / (c-v4 - c-v7); float ph 6.86f k * (v - c-v7); /* 温度补偿水温每偏离 25°C斜率约变化 0.3%/°C */ ph - (ph - 7.0f) * (water_temp - 25.0f) * 0.003f; return ph; }标定流程电极依次插入 pH6.86 和 pH4.01 标液各按一次校准键记录电压存 Flash。电极每 1~2 个月要重校玻璃电极干放后要先浸泡活化。4.4 关键子程序三SEN0189 浑浊度采样u16 Turbidity_GetAdc(void) { u32 sum 0; u8 i; for (i 0; i 20; i) { sum Get_Adc(CH_TURB); delay_ms(2); } return (u16)(sum / 20); /* 均值滤波 */ }表述建议显示浑浊度 ADC 值/电压并标注数值越大水越浑即可硬要 NTU 需要专业浊度仪对比标定毕设别乱写换算公式。4.5 关键子程序四pH 超标自动换水带防抽干保护原文的换水逻辑是pH 超阈值 → 开水泵问题单泵只能抽水不能进水“换水实际是抽水”抽到干涸鱼就全死了而且换多少水、新水从哪来都没交代。工程上至少要加时长限制和回差#define PUMP_MAX_RUN_MS 60000 /* 单次最多抽 60s按缸容积算好 */ #define PH_HYST 0.5f /* 回差防止在阈值附近反复启停 */ void PH_AutoWater(void) { static u32 t_start; static u8 running 0; float ph PH_GetValue(ph_calib); if (!running) { if (ph ph_high_th PH_HYST || ph ph_low_th - PH_HYST) { running 1; t_start GetTick(); Relay_On(); /* 开泵抽旧水 */ } } else { if (GetTick() - t_start PUMP_MAX_RUN_MS) { Relay_Off(); /* 限时到强制停 */ running 0; Beep_On(); /* 提醒用户手动补新水 */ } } }想做成真自动换水加水位传感器或双泵 蓄水桶按抽 20% → 补 20%流程闭环pH 偏酸用小苏打、偏碱用榄仁叶纠正——换水本身只是稀释不能定向调 pH这一点论文里吹过头了。五、系统调试验证测试项方法预期结果水温与温度计对比误差 ±0.5°C 内浑浊度清水 vs 投饵后水样ADC 值明显区分阈值可调pH 校准6.86/4.01 标液两点标定标液回测误差 ≤±0.1pHpH 精度测 pH5/7/9 缓冲液误差 ≤±0.2pH报警人为调低阈值触发蜂鸣LEDAPP 收到推送自动换水pH 超上限泵启动 60s 后自动停止并提示通信关 Wi-Fi 30s 再开自动重连数据续传六、常见坑汇总原文翻车实录摘要吹没做的参数摘要说监测溶氧量、氨氮等关键指标——硬件清单里根本没有溶氧/氨氮传感器全文只测温度、浑浊度、pH。摘要与实物对不上答辩第一问就露馅。图注抄串成 GPS 模块显示选型OLED12864 如图3.6图注却是ATGM336H 选型图GPS 模块复制模板没改干净。选型理由与编号双错LM35 vs DS18B20 的精度/量程优势写反且选择方案1DS18B20DS18B20 是方案2。PH-4502C 供电写错5V 的板子接 3.3V读数漂移OUT 还需分压才能进 3.3V ADC。pH 没有校准流程pH 电极不两点标定读数没有意义也没做温度补偿。代码用 ADC3C8T6 没有 ADC3那是大封装 F103 才有的抄工程没核对芯片资源。换水功能会抽干鱼缸单泵无水位反馈、无时长限制pH 超标开水泵抽到干涸为止。舵机数组残留主程序开头Servor_CPWM_Set_Buffer[9]{1500,2450,...}是舵机云台例程的复制残留。TCP 透传 vs MQTT 混用无线通信章节写 AT 透传连 TCP 服务器上位机章节和代码却是 MQTT 阿里云。研究现状编造感强MIT 艾米丽·约翰逊、“区块链鱼缸水质管理”苏黎世联邦理工、清华李华、北航王伟……名字泛化、情节离谱被追问文献出处会很被动。七、可扩展方向补氨氮/亚硝酸盐虽然低成本离子选择性电极精度一般但可以做趋势预警比摘要空吹强真·自动换水双泵 蓄水桶 水位/霍尔传感器抽补联动闭环加热棒联动水温低于设定自动开加热棒继电器防水加热棒养热带鱼刚需喂食提醒RTC 定时 APP 推送把系统升级为完整智能鱼缸管家。八、资料内容完整工程资料原理图、PCB、代码、元件清单九、资料获取方式