基于YOLOv12的无人机红外智能监测系统开发实践
2026/7/26 23:28:59
家里养鱼的朋友应该都有过这样的经历:明明按时换水喂食,鱼却莫名其妙生病甚至死亡。后来我发现,水质问题才是罪魁祸首。水温波动、PH值异常、水中杂质过多,这些肉眼看不见的变化都会影响水生生物健康。这就是为什么我决定用STM32开发一套智能水质监测系统。
这套系统的核心功能非常实用:
实测下来,这套方案成本不到200元,但效果堪比专业水质检测仪。我把它用在鱼缸、家庭饮用水和实验室培养液监测等多个场景,稳定性都很不错。
这是我反复测试后确定的最佳配置方案:
特别说一下传感器选择要点:
PH检测电路最容易被忽视。这里分享一个实测可用的设计:
// PH值读取代码示例 float Read_PH() { int buf[10], temp; for(int i=0;i<10;i++) { buf[i] = analogRead(PH_PIN); delay(10); } // 中值滤波 for(int i=0;i<9;i++) { for(int j=i+1;j<10;j++) { if(buf[i]>buf[j]) { temp = buf[i]; buf[i] = buf[j]; buf[j] = temp; } } } float avgValue = 0; for(int i=2;i<8;i++) avgValue += buf[i]; float phValue = (float)avgValue*5.0/1024/6; // 转换为电压值 phValue = 3.5 * phValue; // 根据校准结果调整系数 return phValue; }TDS模块的供电要注意稳定性,建议单独用LDO稳压到3.3V。我在PCB上加了0.1uF去耦电容,数据波动明显减小。
系统采用多任务调度架构:
void main() { HW_Init(); // 硬件初始化 WiFi_Connect(); // 连接路由器 while(1) { Read_Sensors(); // 读取所有传感器 OLED_Display(); if(++upload_cnt >= 30) { // 每60秒上传一次 WiFi_Upload(); upload_cnt = 0; } Check_Alarm(); // 异常检测 delay(1000); } }ESP8266配置有几个坑要注意:
这是我优化后的网络配置代码:
void WiFi_Init() { Serial2.begin(115200); // ESP8266通信串口 Send_AT("AT+RST", "ready", 3000); Send_AT("AT+CWMODE=1", "OK", 1000); Send_AT("AT+CWJAP=\"SSID\",\"PASSWORD\"", "OK", 5000); Send_AT("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",80", "CONNECT", 3000); } void WiFi_Upload() { String cmd = "GET /update?api_key=XXX&field1="+String(tds)+"&field2="+String(ph)+"&field3="+String(temp); Send_AT("AT+CIPSEND="+String(cmd.length()+2), ">", 1000); Serial2.println(cmd); }我用U8g2库实现了分级显示:
显示效果优化技巧:
推荐三种方案:
我用的Thingspeak配置流程:
用Python+PyQt5写了个简易监控程序,核心代码如下:
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.serial = SerialThread() self.serial.data_received.connect(self.update_ui) def update_ui(self, data): self.lcd_temp.display(data['temp']) self.lcd_ph.display(data['ph']) self.plot.addData(data['tds'])PH传感器校准:
TDS校准公式:
TDS = (133.42 * V^3 - 255.86 * V^2 + 857.39 * V) * 0.5其中V为传感器输出电压
踩过几个坑后总结的优化方案:
电源管理也很关键,我后来改用TP4056充电模块+18650电池的方案,续航能达到72小时以上。