基于STM32的水位检测自动控制系统 支持: 水位检测、水温检测、水泵控制、水温水位数据分析、...
先上干货,整个系统用STM32F103C8T6当大脑,超声波测水位,DS18B20测水温,继电器控制水泵。实测发现水温变化会影响声速,后来在代码里加了温度补偿公式:声速=331.4 + 0.6*T,水温25℃时误差从3cm降到了0.5cm。今天带大家用STM32搞个全自动水位水温控制系统,手机点两下就能远程管理,连阿里云都接上了,卷死隔壁用机械浮球的老王!建议用阿里云官方提供的计算工具生成认证信息
基于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.017=340m/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配置没开高速模式)。建议新手用现成的库,别学我硬刚底层时序。
水泵控制逻辑才是核心科技:
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("AT+CWMODE=3", "OK", 1000);
Send_AT_Command("AT+CWJAP=\"SSID\",\"PASSWORD\"", "OK", 5000);
Send_AT_Command("AT+MQTTUSERCFG=0,1,\"clientID\",\"deviceName\",\"deviceSecret\"", "OK", 1000);
Send_AT_Command("AT+MQTTCONN=0,\"iot-xxx.mqtt.aliyuncs.com\",1883,1)", "OK", 5000);
}
这里藏着个大坑:阿里云三元组要转换成username/password格式,新手容易在这里卡三天。建议用阿里云官方提供的计算工具生成认证信息,别自己瞎拼接。
最后说下PCB设计的血泪史:超声波模块必须远离水泵电源走线,不然干扰大到怀疑人生。DS18B20的信号线要加1K上拉电阻,长度超过20cm就得改开漏输出。原理图里STM32的VDDA没接滤波电容,结果ADC采样值飘得跟心电图似的...
全套代码和PCB工程已扔GitHub,搜索"STM32水族馆管家"就能找到。下期预告:用这个系统养鳄龟,看自动换水能不能扛住龟爷的暴力拆解!

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)