基于STM32的‘水位检测自动控制系统‘:支持超声波模块、DS18B20传感器,包含原理图、P...

张开发
2026/5/17 10:38:18 15 分钟阅读
基于STM32的‘水位检测自动控制系统‘:支持超声波模块、DS18B20传感器,包含原理图、P...
基于STM32的水位检测自动控制系统 支持: 水位检测、水温检测、水泵控制、水温水位数据分析、已连接阿里云服务器、有手机端APP 水位检测: 超声波模块 水温检测: 温度传感器DS18B20 内容: 原理图、PCB文件、程序源码、服务器配置资料、模块参考资料鱼缸总得手动换水太麻烦养鱼佬的终极解决方案来了今天带大家用STM32搞个全自动水位水温控制系统手机点两下就能远程管理连阿里云都接上了卷死隔壁用机械浮球的老王先上干货整个系统用STM32F103C8T6当大脑超声波测水位DS18B20测水温继电器控制水泵。最骚的是接上了ESP8266传数据到阿里云自己撸了个安卓APP监控数据。代码里用了FreeRTOS搞多任务调度保证传感器读取和网络通信两不误。超声波模块驱动代码必须秀一波HCSR04这货用起来是真香// 超声波模块触发函数 void HCSR04_Trigger(void) { HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET); delay_us(12); // 关键必须大于10us HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET); } // 计算距离公式 float Get_WaterLevel(void) { uint32_t echo_time TIM2-CNT; // 用定时器2捕获高电平时间 return (echo_time * 0.017); // 0.017340m/s / 2 }这里有个坑爹点定时器时钟必须配置成1MHz精度不然厘米级误差能气死人。实测发现水温变化会影响声速后来在代码里加了温度补偿公式声速331.4 0.6*T水温25℃时误差从3cm降到了0.5cm。DS18B20的驱动最能体现嵌入式工程师的暴躁// 单总线复位脉冲 uint8_t DS18B20_Reset(void) { set_as_output(); HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, 0); delay_us(480); // 保持480-960us set_as_input(); delay_us(80); // 等待传感器回应 return HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin); } // 温度读取函数 float Read_WaterTemp(void) { uint8_t tempL read_byte(); uint8_t tempH read_byte(); float temp ((tempH 8) | tempL) * 0.0625; // 转换公式 return temp * 0.95; // 实测校准系数 }这破传感器对时序要求变态到微秒级调试时用逻辑分析仪抓到波形不对直接摔了两个传感器后来发现是GPIO配置没开高速模式。建议新手用现成的库别学我硬刚底层时序。基于STM32的水位检测自动控制系统 支持: 水位检测、水温检测、水泵控制、水温水位数据分析、已连接阿里云服务器、有手机端APP 水位检测: 超声波模块 水温检测: 温度传感器DS18B20 内容: 原理图、PCB文件、程序源码、服务器配置资料、模块参考资料水泵控制逻辑才是核心科技void Pump_Control(float level, float temp) { static uint8_t pump_status 0; if(level LOW_LEVEL temp 35.0f) { HAL_GPIO_WritePin(PUMP_GPIO_Port, PUMP_Pin, 1); pump_status 1; MQTT_Publish(pump/status, ON); // 推送到阿里云 } else if(level HIGH_LEVEL || temp 40.0f) { HAL_GPIO_WritePin(PUMP_GPIO_Port, PUMP_Pin, 0); pump_status 0; MQTT_Publish(pump/status, OFF); } APP_Update(pump_status); // 同步到手机APP }为了防止水泵频繁启停代码里加了状态锁存机制。实测发现继电器物理延迟有0.5秒所以在逻辑判断里加了软件去抖比硬件RC电路更省钱。阿里云对接部分用了MQTT魔改协议上核心配置代码// ESP8266 AT指令配置 void ESP8266_Init(void) { Send_AT_Command(ATCWMODE3, OK, 1000); Send_AT_Command(ATCWJAP\SSID\,\PASSWORD\, OK, 5000); Send_AT_Command(ATMQTTUSERCFG0,1,\clientID\,\deviceName\,\deviceSecret\, OK, 1000); Send_AT_Command(ATMQTTCONN0,\iot-xxx.mqtt.aliyuncs.com\,1883,1), OK, 5000); }这里藏着个大坑阿里云三元组要转换成username/password格式新手容易在这里卡三天。建议用阿里云官方提供的计算工具生成认证信息别自己瞎拼接。最后说下PCB设计的血泪史超声波模块必须远离水泵电源走线不然干扰大到怀疑人生。DS18B20的信号线要加1K上拉电阻长度超过20cm就得改开漏输出。原理图里STM32的VDDA没接滤波电容结果ADC采样值飘得跟心电图似的...全套代码和PCB工程已扔GitHub搜索STM32水族馆管家就能找到。下期预告用这个系统养鳄龟看自动换水能不能扛住龟爷的暴力拆解

更多文章