【免费开源】STM32智能鱼缸自动喂食控温换水水族箱物联网项目完整源码分享
【免费开源】STM32智能鱼缸自动喂食控温换水水族箱物联网项目完整源码分享
一、项目背景
养鱼是很多人的爱好,但日常的喂食、加热、换水、过滤管理却让许多上班族望而却步。一个真正"省心"的智能鱼缸,至少要做到:定时定量喂食、自动维持水温、监测水质、远程控制和报警。本项目"基于 STM32 的智能鱼缸"正是为解决这些痛点而设计的开源项目,使用 STM32F103C8T6 作为主控,集成温度采集、舵机喂食、继电器控制加热棒/水泵/灯光、OLED 显示、ESP8266 联网,是一套完整的从硬件到软件的鱼缸物联网解决方案。
二、整机工作流程图
三、硬件清单
| 模块 | 接口 | STM32 引脚 |
|---|---|---|
| DS18B20 水温 | 单总线 | PB12 |
| OLED 0.96" | I2C | PB6/PB7 |
| 舵机 SG90 | PWM | PA0 (TIM2_CH1) |
| 继电器(加热棒) | GPIO | PB0 |
| 继电器(水泵) | GPIO | PB1 |
| 继电器(灯光) | GPIO | PB2 |
| ESP8266 | UART2 | PA2/PA3 |
| 按键x3 | GPIO | PA4/PA5/PA6 |
| 浑浊度传感器 | ADC | PA7 |
四、核心代码
4.1 DS18B20 温度采集
#include"ds18b20.h"#include"stm32f1xx_hal.h"#defineDQ_PORTGPIOB#defineDQ_PINGPIO_PIN_12staticvoidDQ_OUT(void){GPIO_InitTypeDef g={0};g.Pin=DQ_PIN;g.Mode=GPIO_MODE_OUTPUT_OD;g.Pull=GPIO_PULLUP;g.Speed=GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(DQ_PORT,&g);}staticvoidDQ_IN(void){GPIO_InitTypeDef g={0};g.Pin=DQ_PIN;g.Mode=GPIO_MODE_INPUT;g.Pull=GPIO_PULLUP;HAL_GPIO_Init(DQ_PORT,&g);}staticvoidusDelay(uint32_tus){uint32_tt=us*9;while(t--)__NOP();}intDS18B20_Reset(void){DQ_OUT();HAL_GPIO_WritePin(DQ_PORT,DQ_PIN,GPIO_PIN_RESET);usDelay(500);HAL_GPIO_WritePin(DQ_PORT,DQ_PIN,GPIO_PIN_SET);usDelay(60);DQ_IN();intp=HAL_GPIO_ReadPin(DQ_PORT,DQ_PIN);usDelay(420);returnp==0;}staticvoidWriteByte(uint8_tb){DQ_OUT();for(inti=0;i<8;i++){HAL_GPIO_WritePin(DQ_PORT,DQ_PIN,GPIO_PIN_RESET);usDelay(2);if(b&1)HAL_GPIO_WritePin(DQ_PORT,DQ_PIN,GPIO_PIN_SET);usDelay(60);HAL_GPIO_WritePin(DQ_PORT,DQ_PIN,GPIO_PIN_SET);usDelay(2);b>>=1;}}staticuint8_tReadByte(void){uint8_tv=0;for(inti=0;i<8;i++){DQ_OUT();HAL_GPIO_WritePin(DQ_PORT,DQ_PIN,GPIO_PIN_RESET);usDelay(2);DQ_IN();usDelay(8);if(HAL_GPIO_ReadPin(DQ_PORT,DQ_PIN))v|=(1<<i);usDelay(50);}returnv;}floatDS18B20_ReadTempC(void){if(!DS18B20_Reset())return-127.0f;WriteByte(0xCC);WriteByte(0x44);HAL_Delay(750);if(!DS18B20_Reset())return-127.0f;WriteByte(0xCC);WriteByte(0xBE);uint8_tl=ReadByte(),h=ReadByte();int16_traw=(h<<8)|l;returnraw*0.0625f;}4.2 舵机喂食控制
externTIM_HandleTypeDef htim2;/* SG90: 0.5ms~2.5ms 对应 0~180 度,TIM2 ARR=20000-1, PSC=72-1 → 1us 计数 */staticvoidServo_SetAngle(intdeg){if(deg<0)deg=0;if(deg>180)deg=180;intus=500+deg*2000/180;__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,us);}voidFeed_Once(intgrams){intturns=grams;/* 1g 一圈 */for(inti=0;i<turns;i++){Servo_SetAngle(0);HAL_Delay(400);Servo_SetAngle(180);HAL_Delay(400);}Servo_SetAngle(90);}4.3 主循环
#include"main.h"#include"ds18b20.h"#include"oled.h"floatlow=24.0f,high=28.0f;intfeed_hour[3]={8,12,18};intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_I2C1_Init();MX_TIM2_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);OLED_Init();uint32_tlast1s=0,last1m=0;while(1){uint32_tnow=HAL_GetTick();if(now-last1s>=1000){last1s=now;floatt=DS18B20_ReadTempC();HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,t<low?GPIO_PIN_SET:(t>high?GPIO_PIN_RESET:GPIO_PIN_RESET));charbuf[24];snprintf(buf,sizeof(buf),"T:%.1fC",t);OLED_ShowString(0,0,buf);}if(now-last1m>=60000){last1m=now;inth=(now/3600000)%24;/* 简化:用 tick 模拟当前小时 */for(inti=0;i<3;i++)if(h==feed_hour[i])Feed_Once(2);}}}五、技术亮点
5.1 三路继电器分时复用
加热棒、水泵、灯光各自接一路继电器。为了避免短时间频繁通断,软件加入"滞回控制":低于low才开加热,高于low+1°C才关,避免温度在阈值附近摇摆产生抖动。
5.2 DS18B20 抗干扰
水族鱼缸内潮湿且强干扰,DS18B20 的单总线信号必须使用屏蔽线,并就近放置 4.7kΩ 上拉电阻;软件层面读取 3 次取中位数,可以剔除偶发误读。
5.3 ESP8266 上云
通过AT+CWJAP连接 WiFi,再用AT+CIPSTART建立 TCP 与 MQTT Broker 通信。本工程默认对接 OneNET:上行水温/状态,下行喂食/换水指令。
5.4 自动换水
水泵继电器触发抽水电机,配合水位浮子开关检测水位下降到设定值后停止;进水阶段用电磁阀控制自来水进入,到达高水位再关闭。
5.5 喂食量精准控制
舵机带动一个螺旋送料器,每旋转 360° 投放约 1g 鱼食。用户在上位机可以配置每次投料份数。
六、应用场景
- 家庭桌面鱼缸自动化管理
- 水族馆远程批量监控
- 高端水草缸 CO₂ + 加热 + 灯光多通道控制
- 改造为爬宠饲养箱(温度 + 湿度 + 喷雾)
- 改造为家庭花房自动浇灌系统
七、调试经验
- DS18B20 上电后第一次读取要等 750ms,否则只能读到 85°C 默认值;
- 舵机不要长时间堵转,否则会发热烧毁;定时进入 90° 自然位置;
- 继电器吸合瞬间会引起电源跌落,必须在 STM32 电源端加大电容;
- OLED 在水汽环境中容易花屏,建议加防水膜并做 2s 刷新一次而非高频刷新。
八、总结
本项目用 STM32 完整实现了智能鱼缸的所有核心功能,软硬件资料齐全,适合作为物联网/嵌入式入门到进阶的练手项目。它不仅能让你的"鱼缸真正智能起来",还能帮助你掌握温度采集、PWM 舵机、继电器、OLED、ESP8266 串口 AT 命令等典型嵌入式知识。完整源码已经打包在项目压缩包中,欢迎下载、二次开发。
