STM32云鸡舍监控系统设计
DS18B20测温+KY-037声音+TCRT5000红外入侵+蓝牙报警推送,散养户也装得起的鸡舍哨兵
养鸡最怕两件事:半夜温度超标没人知道,黄鼠狼和小偷光顾鸡舍毫无察觉。传统做法靠人巡舍,效率低、反应慢。这篇基于 STM32 的云鸡舍监控系统就是冲着这两个痛点去的:DS18B20 实时测温超阈值蜂鸣器报警、KY-037 监听异常声响、TCRT5000 红外检测非法入侵、JDY-31 蓝牙把入侵信息直接推到手机 APP,OLED 本地显示温度和时间。方案怎么定、器件怎么选、电路怎么连、程序怎么写、整机怎么调,一次讲透。
一、系统功能拆解
一句话总结:多传感器采集(温度/声音/入侵/时间)→ 阈值判断分级报警(本地蜂鸣 / 蓝牙推送手机)。
| 功能 | 实现方式 | 对应硬件 |
|---|---|---|
| 时间管理 | 实时时钟断电走时,OLED 显示 | DS1302 + 备用电池 |
| 温度检测 | 数字温度传感器实时测温 | DS18B20 |
| 温度报警 | 超过按键设定的阈值 → 蜂鸣器报警 | 蜂鸣器 + 独立按键 |
| 声音检测 | 模拟量采样声音强度 | KY-037(AO 接 ADC) |
| 声音报警 | 声音强度超阈值 → 蜂鸣器报警 | 蜂鸣器 |
| 入侵检测 | 红外反射检测有人闯入 | TCRT5000 |
| 入侵推送 | 检测到人 → 蓝牙发报警信息到手机 APP | JDY-31 |
| 数据显示 | 温度、时间、状态实时刷新 | OLED12864(SSD1306) |
报警是分级的:温度、声音超标只在本地蜂鸣器响(环境问题,养殖户白天到场处理);红外检测到入侵则蜂鸣器 + 蓝牙推送手机双管齐下(安全问题,必须立刻知道)。这个分级思路是整套系统设计里最值得借鉴的一笔。
二、器件选型:每个模块都对比过
| 器件 | 选型结果 | 淘汰方案 | 核心理由 |
|---|---|---|---|
| 主控 | STM32F103C8T6 | ESP32-WROOM-32 | 稳定成熟、外设够用、性价比高 |
| 时钟 | DS1302 | PCF8563 | 电池备份断电走时、接口简单成本低 |
| 温度 | DS18B20 | LM35 | 数字输出免 ADC、单总线抗干扰 |
| 声音 | KY-037 | MAX4466 | 自带放大和阈值比较、便宜够用 |
| 入侵 | TCRT5000 | QTR-8RC | 单点检测接线简单、反射式响应快 |
| 显示 | OLED12864 | ILI9341 彩屏 | 自发光低功耗、广视角对比度高 |
| 无线 | JDY-31 蓝牙 | NRF24L01 | 标准串口透传、手机直连不用网关 |
几个关键选型理由展开讲:
- STM32 vs ESP32:ESP32 双核 240MHz 还自带蓝牙 WiFi,看着更香,但鸡舍监控的数据量——温度一个数、声音一个数、入侵一个开关量——Cortex-M3 的 72MHz 绰绰有余;ESP32 的无线优势在本设计里用不上(选了蓝牙透传方案),多花的钱和更复杂的开发环境纯属浪费。
- KY-037 vs MAX4466:MAX4466 是正经的驻极体放大方案,线性度好,但它是纯模拟输出,还得自己搭比较电路;KY-037 一块板集齐麦克风、放大器、电位器阈值调节和 AO/DO 双输出,十几块钱,做"声音异常就报警"这种开关型判断完全够用。本设计只接 AO 走 ADC 采样,DO 悬空不用。
- TCRT5000 vs QTR-8RC:QTR-8RC 是 8 路阵列,给循迹小车用的;入侵检测只需要一个监控点位,单路 TCRT5000 反射式红外对管,有遮挡反射就有信号,简单直接。
- JDY-31 vs NRF24L01:NRF24L01 是 2.4G 私有协议,手机连不上,还得自配接收端;JDY-31 是标准蓝牙 SPP 串口透传,单片机端就是普通 UART 收发,手机 APP 直接连,"推送报警到手机"这个需求它天生就满足。
整套物料成本约 60~80 元,对散养户和小型养殖场来说,比雇人守夜划算太多。
三、电路设计:接线表 + 关键要点
主控最小系统:HSE 8MHz 主晶振 + LSE 32.768kHz(或由 DS1302 独立走时),复位电路 NRST + 上拉电阻 + 去耦电容。
| 模块 | 接口方式 | 连接(参考) | 备注 |
|---|---|---|---|
| DS1302 | 三线串行 | SCLK/IO/CE → 数字 IO | VBAT 接纽扣电池,断电走时 |
| DS18B20 | 单总线 | DQ → 数字 IO | 4.7kΩ 上拉到 3.3V |
| KY-037 | 模拟输出 | AO → ADC2 输入通道 | 5V 供电,DO 不接 |
| TCRT5000 | 数字输出 | OUT → 数字输入 | 5V 供电,电平判人 |
| OLED12864 | IIC | SCL/SDA | 3.3V |
| JDY-31 | UART | TX/RX 交叉接串口 | 3.3V,波特率 9600 |
| 蜂鸣器 | GPIO 输出 | 高电平驱动 | 三极管放大驱动 |
| 按键 | GPIO 输入 | 温度阈值设定 | 内部上拉输入 |
接线四个坑:
- KY-037 只接 AO 不接 DO:模块 DO 是板载电位器比较后的开关量,阈值固定还受 5V 供电影响;走 ADC 采 AO 才能在软件里灵活设阈值、做均值滤波。5V 模块 AO 直怼 3.3V 单片机前先量一下输出范围,必要时分压。
- TCRT5000 电平逻辑先实测:不同厂家的模块"检测到反射物"输出高还是低并不统一,上电后拿手在探头前晃一下,用万用表量 OUT 确认,再写判断逻辑,别照抄代码。
- DS1302 备用电池不能省:鸡舍环境供电不稳,没有 VBAT 电池,每次停电时间归零,报警记录的时间戳就全废了。
- 蜂鸣器别用 IO 直推:有源蜂鸣器也要 30mA 左右,IO 直推长期工作有风险,加一只 NPN 三极管(或 ULN2003 里借一路)驱动,IO 只给控制电平。
四、软件设计
4.1 主程序框架
int main(void)
{
SystemInit();
delay_init();
KEY_Init(); // 温度阈值设定按键
DS1302_Init();
DS18B20_Init();
ADC2_Init(); // KY-037 AO 声音采样
OLED_Init();
USART1_Init(9600); // JDY-31 蓝牙
Buzzer_Init();
while (1)
{
DS1302_GetTime(time_buf); // 实时时间
temp = DS18B20_GetTemp(); // 温度
sound = Get_Sound_Level(); // 声音强度(多次均值)
intruder = TCRT5000_Scan(); // 红外检测到人?
/* 温度报警:超过按键设定阈值 → 蜂鸣器 */
if (temp > temp_th) Buzzer(ON);
else if (!sound_alarm && !intruder) Buzzer(OFF);
/* 声音报警:强度超阈值 → 蜂鸣器 */
if (sound > sound_th) Buzzer(ON);
/* 入侵报警:本地响 + 蓝牙推手机 */
if (intruder)
{
Buzzer(ON);
BT_Send("ALARM:INTRUDER!"); // JDY-31 → 手机 APP
}
OLED_Show(time_buf, temp, sound, status);
BT_Report(temp, sound); // 周期上报环境数据
}
}
4.2 KY-037 声音采样:ADC 配置 + 均值滤波
ADC2 的配置要点:分频因子设 6,把 72MHz 的 PCLK 分到 12MHz,满足 ADC 时钟上限;引脚设模拟输入;转换前先复位校准:
void ADC2_Init(void)
{
ADC_InitTypeDef s;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2 | RCC_GPIO_CLK, ENABLE);
s.ADC_Mode = ADC_Mode_Independent; // 独立模式
s.ADC_ScanConvMode = DISABLE; // 单次转换
s.ADC_ContinuousConvMode = DISABLE; // 软件触发
s.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
s.ADC_DataAlign = ADC_DataAlign_Right;
s.ADC_NbrOfChannel = 1;
ADC_Init(ADC2, &s);
ADC_RegularChannelConfig(ADC2, ADC_CH_SOUND, 1, ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC2, ENABLE);
ADC_ResetCalibration(ADC2); // 复位校准
while (ADC_GetResetCalibrationStatus(ADC2));
ADC_StartCalibration(ADC2);
while (ADC_GetCalibrationStatus(ADC2));
}
/* 多次采样取均值 + 短延时稳读数,再换算声音强度 */
u16 Get_Sound_Level(void)
{
u32 sum = 0;
u8 i;
for (i = 0; i < 10; i++)
{
ADC_SoftwareStartConvCmd(ADC2, ENABLE);
while (!ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC));
sum += ADC_GetConversionValue(ADC2);
delay_ms(2); // 两次采样间隔,稳定读数
}
return (sum / 10) * 3300 / 4095 * 100 / 3300; // 均值 → 电压 → 强度值(×100)
}
均值滤波是必须的:麦克风拾音是波动的模拟量,单次采样赶上波峰波谷判断就乱跳,10 次均值后阈值判断才稳。
4.3 DS1302 实时时间:初始化 + 读取
上电先通过 time_buf 数组写入一次当前时间(年月日时分秒星期),之后每轮主循环读取:
u8 time_buf[8] = {20, 26, 8, 26, 3, 15, 30, 00}; // 年(2位)月日星期时分秒
/* 写入:CE 拉高 → SCLK 上升沿逐位写命令字节+数据字节 → CE 拉低
* 读取:发读命令后 SCLK 下降沿逐位收数据,LSB 在前
* 写时间前必须先开写保护(WP 命令 0x8E),写完关掉 */
DS1302_WriteTime(time_buf); // 仅首次上电调用
DS1302_GetTime(time_buf); // 主循环里刷新
断电测试是 DS1302 调试的必做项:拔电再上电,时间应连续走(VBAT 电池接管),断了就查电池和电池座接触。
4.4 DS18B20 温度读取
单总线四步:复位(拉低 480µs)→ 等存在脉冲(60~240µs)→ 发 0x44 启动转换(等 750ms)→ 复位后发 0xBE 读两字节,温度 = ((高<<8)|低) × 0.0625。DQ 引脚发送时设输出、读取时切输入,4.7kΩ 上拉不能省,否则读出 85°C 假值。
4.5 TCRT5000 入侵判断与蓝牙推送
u8 TCRT5000_Scan(void)
{
if (GPIO_ReadInputDataBit(GPIO_INTR, PIN_INTR) == Bit_SET) // 实测确认电平
return 1; // 检测到反射物(人)
return 0;
}
JDY-31 走标准 UART:单片机串口发什么,手机 APP(蓝牙串口类应用即可)就收什么。入侵事件用醒目的报文头(如 ALARM:INTRUDER!)区别于周期性的环境数据上报(T:xx;S:xx),APP 端按报文头做推送判断。
五、整机调试:按功能逐项验证
调试环境 Keil + ST-Link,关键函数(时间读取、温度转换、ADC 均值、入侵判断)设断点单步;硬件先做电源测试,再逐模块验波形。
| 测试项 | 操作 | 预期结果 |
|---|---|---|
| 焊接检查 | 放大镜查焊点 + 万用表测各模块电压 | 无桥接漏焊,电压在范围 |
| 实时时间 | 设置时间 → OLED 观察 → 断电再上电 | 走时准确,断电时间不丢 |
| 温度采集 | 热风枪/手捂对比温度计 | 显示一致,响应及时 |
| 温度报警 | 阈值附近缓慢升温 | 临界值准确触发蜂鸣器 |
| 声音报警 | 调灵敏度电位器 → 不同音量测试 | 正常说话不误报,异响即报 |
| 红外入侵 | 模拟人经过监控区(不同速度方向) | 检测稳定,即时蜂鸣+蓝牙推送 |
| 蓝牙通信 | 手机配对 → 收数据/发命令 | 报文完整,距离内不丢包 |
| 嘈杂环境 | 播放背景噪声下测试声音报警 | 不误触发不漏报 |
六、常见坑汇总
- TCRT5000 检测距离只有 1~5mm 量级:它是反射式对管,不是人体红外(PIR)!想覆盖门口整个通道,要么用多只对射/反射管做"光幕",要么换 HC-SR501 PIR 人体感应。用 TCRT5000 的正确姿势是装在门口踏板/必经缝隙处做近距离触发。
- 声音阈值要结合环境噪声标定:鸡舍白天鸡叫此起彼伏,阈值照搬实验室数值必然误报到怀疑人生。装机后让系统在正常环境跑半小时记录声音强度基线,阈值设在基线明显上方(如 1.5 倍),夜间白天可以软件里分时段用不同阈值。
- 报警互锁别忘写:三个报警源共用一个蜂鸣器,任何一个解除条件就把蜂鸣器关掉,会把别的还在持续的报警也"顺手关了"。正确做法是三个报警标志独立置位/清除,蜂鸣器状态 = 三个标志的"或"。
- 蓝牙推送要防刷屏:人站在红外检测区不动,主循环几百毫秒一轮,手机一秒收十几条报警。入侵事件要做事件沿触发(上一次没人、这一次有人才发)或加几秒的推送间隔。
- 原论文里有处时钟电路描述要留意:文中写"HSE 接 PA8/PA9",实际上 STM32F103 的 HSE 晶振接的是专用 OSC_IN/OSC_OUT 引脚,PA8 是 MCO 时钟输出——照着这句话画图会直接翻车,画最小系统时以数据手册为准。
七、可扩展方向
- 加 DHT11/DS18B20 多点布置,鸡舍不同区位温度分布一屏看全;
- 氨气(MQ-137)、湿度传感器补齐空气质量维度,这才是"环境监控"的完全体;
- JDY-31 换 ESP8266/4G 模块接入云平台,人在城里也能收到鸡舍报警,"云"鸡舍才名副其实。
八、资料内容完整工程资料(原理图、PCB、代码、元件清单)

九、资料获取方式

更多推荐



所有评论(0)