基于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水族馆管家"就能找到。下期预告:用这个系统养鳄龟,看自动换水能不能扛住龟爷的暴力拆解!

Logo

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

更多推荐