1. 项目概述
这个智能鱼缸项目是我去年给朋友家改造的一个实用案例。传统鱼缸需要人工喂食、换水,对于经常出差或记性不好的养鱼爱好者来说很不友好。通过51单片机加上几个简单传感器,就能实现全自动喂食、水位监测和自动换水功能,整套成本不到200元。
我选择51单片机是因为它价格低廉(STC89C52RC芯片只要5块钱)、开发简单,对于这种不需要复杂运算的控制场景完全够用。整个系统包含三个核心模块:喂食机构、水位检测和换水系统。下面我会详细拆解每个模块的设计思路和具体实现方法。
2. 硬件设计与选型
2.1 主控芯片选择
STC89C52RC是这个项目的最佳选择:
- 8位8051内核,12MHz主频足够处理传感器数据和控制执行机构
- 4KB Flash存储,可以存储喂食时间表等配置信息
- 32个I/O口,完全满足外设连接需求
- 支持串口烧录,开发调试方便
- 工作电压5V,与常见传感器和执行器兼容
注意:购买时要选择DIP-40封装的版本,方便插在面包板或万能板上进行原型开发。
2.2 喂食机构设计
喂食机构由以下几个部件组成:
- 小型步进电机(28BYJ-48):控制饲料仓门的开关
- 3D打印的饲料仓:我设计了一个扇形仓门结构,旋转90度就能完成一次投喂
- 光电传感器:检测饲料是否正常落下,防止卡料
电机驱动选用ULN2003达林顿阵列模块,直接连接单片机P1口的4个引脚。实际测试发现,这种电机扭矩足够推动50g以内的饲料,且耗电量很低(单次喂食约消耗30mA电流)。
2.3 水位检测方案
水位检测有两种常见方案:
- 浮球式水位开关:成本低但精度差
- 超声波传感器:精度高但价格贵
我最终选择了第三种方案 - 使用不锈钢探针制作电阻式水位传感器:
- 用两根间距5mm的不锈钢棒作为探针
- 通过1MΩ上拉电阻连接到5V电源
- 探针另一端接单片机ADC输入引脚
- 水位上升导致探针间电阻变化,ADC值随之改变
这个方案成本不到5元,测量误差在±2mm以内,完全满足鱼缸需求。为了防止电解腐蚀,我采用PWM方式间歇供电(每秒通电50ms)。
2.4 换水系统实现
自动换水系统包含:
- 小型潜水泵(DC12V/5W):用于抽水
- 电磁阀(DN15):控制新水注入
- 继电器模块:控制大电流设备
水泵和电磁阀都通过继电器连接,单片机只需提供5V控制信号。我在鱼缸侧面安装了两个不锈钢探针作为最低水位检测,防止水泵干烧。
3. 电路设计与连接
3.1 电源方案
整个系统需要三种电压:
- 5V:单片机、传感器
- 12V:水泵
- 3.3V:部分传感器(通过AMS1117降压获得)
我采用一个12V/2A的电源适配器作为总电源,然后通过LM2596降压模块得到5V,再通过AMS1117得到3.3V。实测整个系统最大电流不超过800mA,这个配置足够稳定运行。
3.2 单片机最小系统
STC89C52RC最小系统包含:
- 11.0592MHz晶振(串口通信需要这个特定频率)
- 22pF谐振电容×2
- 10KΩ复位电阻
- 10μF复位电容
- 电源滤波电容(100nF+10μF)
3.3 外设连接表
| 外设 | 连接引脚 | 备注 |
|---|---|---|
| 步进电机 | P1.0-P1.3 | 通过ULN2003驱动 |
| 水位传感器 | P1.4 | ADC输入,需接上拉电阻 |
| 光电传感器 | P1.5 | 数字输入 |
| 水泵继电器 | P2.0 | 控制信号 |
| 电磁阀继电器 | P2.1 | 控制信号 |
| 按键组 | P3.0-P3.3 | 设置喂食时间 |
| LCD1602 | P0口 | 8位数据线 |
4. 软件设计与实现
4.1 主程序流程
c复制void main() {
init_all(); // 初始化外设
while(1) {
check_time(); // 检查是否到达喂食时间
check_water(); // 检测水位
process_key(); // 处理按键输入
update_display(); // 更新LCD显示
}
}
4.2 喂食控制逻辑
喂食功能实现要点:
- 使用定时器0产生1ms时基
- 在内存中维护一个喂食时间表(最多可设4个时间点)
- 当系统时间匹配预设时间时,启动喂食流程:
c复制void feed_fish() {
set_motor(OPEN); // 打开仓门
delay_ms(500); // 等待饲料落下
if(!check_sensor()) { // 如果光电传感器没检测到饲料
alarm(); // 触发报警
}
set_motor(CLOSE); // 关闭仓门
}
4.3 水位检测算法
水位检测采用滑动平均滤波算法:
c复制#define SAMPLE_NUM 10
int get_water_level() {
static int buf[SAMPLE_NUM];
static int index = 0;
int sum = 0;
buf[index] = read_adc(P1_4);
index = (index + 1) % SAMPLE_NUM;
for(int i=0; i<SAMPLE_NUM; i++) {
sum += buf[i];
}
return sum/SAMPLE_NUM;
}
当检测到水位低于设定值时,启动换水流程:
- 打开水泵抽水30秒
- 关闭水泵,延迟5秒让水位稳定
- 打开电磁阀注水,直到水位恢复正常
- 关闭电磁阀
5. 制作与调试要点
5.1 PCB布局建议
- 将大电流设备(继电器、电机驱动)和小信号电路分开放置
- 水泵和电磁阀的电源线要足够粗(建议18AWG以上)
- 水位传感器信号线要加磁珠滤波
- 为单片机晶振设计包地处理
5.2 常见问题排查
-
电机不转:
- 检查ULN2003输入输出是否对应
- 测量电机电压是否正常
- 确认单片机引脚配置为推挽输出
-
水位检测不准:
- 检查探针表面是否氧化(用砂纸打磨)
- 测量上拉电阻值是否准确
- 确认ADC参考电压稳定
-
喂食量不一致:
- 调整仓门开口大小
- 在饲料仓加装振动电机(用PWM控制)
- 改用螺旋送料机构
5.3 功耗优化技巧
- 使用定时器唤醒代替延时等待
- 非检测时段关闭传感器电源
- 将LCD背光改为PWM调光
- 选用低功耗型号的继电器(如HK19F)
6. 项目扩展方向
这个基础版本完成后,还可以考虑以下增强功能:
-
手机APP控制:
- 通过ESP8266增加WiFi功能
- 开发简易APP设置喂食计划
- 实现远程监控状态
-
水质监测:
- 增加PH值传感器
- 添加温度传感器(DS18B20)
- 监测氨氮含量
-
智能学习:
- 记录鱼的活动规律
- 根据季节调整喂食量
- 学习用户换水习惯自动优化
这个项目最让我满意的是它的实用性 - 朋友出差两周,鱼缸完全自主运行,回家时鱼儿状态比人工照料时还好。对于想要入门的电子爱好者,这是个很好的练手项目,涵盖了传感器、执行器、定时控制等物联网基础技术。