DS18B20测温+KY-037声音+TCRT5000红外入侵+蓝牙报警推送,散养户也装得起的鸡舍哨兵

养鸡最怕两件事:半夜温度超标没人知道,黄鼠狼和小偷光顾鸡舍毫无察觉。传统做法靠人巡舍,效率低、反应慢。这篇基于 STM32 的云鸡舍监控系统就是冲着这两个痛点去的:DS18B20 实时测温超阈值蜂鸣器报警、KY-037 监听异常声响、TCRT5000 红外检测非法入侵、JDY-31 蓝牙把入侵信息直接推到手机 APP,OLED 本地显示温度和时间。方案怎么定、器件怎么选、电路怎么连、程序怎么写、整机怎么调,一次讲透。

一、系统功能拆解

一句话总结:多传感器采集(温度/声音/入侵/时间)→ 阈值判断分级报警(本地蜂鸣 / 蓝牙推送手机)

功能实现方式对应硬件
时间管理实时时钟断电走时,OLED 显示DS1302 + 备用电池
温度检测数字温度传感器实时测温DS18B20
温度报警超过按键设定的阈值 → 蜂鸣器报警蜂鸣器 + 独立按键
声音检测模拟量采样声音强度KY-037(AO 接 ADC)
声音报警声音强度超阈值 → 蜂鸣器报警蜂鸣器
入侵检测红外反射检测有人闯入TCRT5000
入侵推送检测到人 → 蓝牙发报警信息到手机 APPJDY-31
数据显示温度、时间、状态实时刷新OLED12864(SSD1306)

报警是分级的:温度、声音超标只在本地蜂鸣器响(环境问题,养殖户白天到场处理);红外检测到入侵则蜂鸣器 + 蓝牙推送手机双管齐下(安全问题,必须立刻知道)。这个分级思路是整套系统设计里最值得借鉴的一笔。

二、器件选型:每个模块都对比过

器件选型结果淘汰方案核心理由
主控STM32F103C8T6ESP32-WROOM-32稳定成熟、外设够用、性价比高
时钟DS1302PCF8563电池备份断电走时、接口简单成本低
温度DS18B20LM35数字输出免 ADC、单总线抗干扰
声音KY-037MAX4466自带放大和阈值比较、便宜够用
入侵TCRT5000QTR-8RC单点检测接线简单、反射式响应快
显示OLED12864ILI9341 彩屏自发光低功耗、广视角对比度高
无线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 → 数字 IOVBAT 接纽扣电池,断电走时
DS18B20单总线DQ → 数字 IO4.7kΩ 上拉到 3.3V
KY-037模拟输出AO → ADC2 输入通道5V 供电,DO 不接
TCRT5000数字输出OUT → 数字输入5V 供电,电平判人
OLED12864IICSCL/SDA3.3V
JDY-31UARTTX/RX 交叉接串口3.3V,波特率 9600
蜂鸣器GPIO 输出高电平驱动三极管放大驱动
按键GPIO 输入温度阈值设定内部上拉输入

接线四个坑:

  1. KY-037 只接 AO 不接 DO:模块 DO 是板载电位器比较后的开关量,阈值固定还受 5V 供电影响;走 ADC 采 AO 才能在软件里灵活设阈值、做均值滤波。5V 模块 AO 直怼 3.3V 单片机前先量一下输出范围,必要时分压。
  2. TCRT5000 电平逻辑先实测:不同厂家的模块"检测到反射物"输出高还是低并不统一,上电后拿手在探头前晃一下,用万用表量 OUT 确认,再写判断逻辑,别照抄代码。
  3. DS1302 备用电池不能省:鸡舍环境供电不稳,没有 VBAT 电池,每次停电时间归零,报警记录的时间戳就全废了。
  4. 蜂鸣器别用 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 观察 → 断电再上电走时准确,断电时间不丢
温度采集热风枪/手捂对比温度计显示一致,响应及时
温度报警阈值附近缓慢升温临界值准确触发蜂鸣器
声音报警调灵敏度电位器 → 不同音量测试正常说话不误报,异响即报
红外入侵模拟人经过监控区(不同速度方向)检测稳定,即时蜂鸣+蓝牙推送
蓝牙通信手机配对 → 收数据/发命令报文完整,距离内不丢包
嘈杂环境播放背景噪声下测试声音报警不误触发不漏报

六、常见坑汇总

  1. TCRT5000 检测距离只有 1~5mm 量级:它是反射式对管,不是人体红外(PIR)!想覆盖门口整个通道,要么用多只对射/反射管做"光幕",要么换 HC-SR501 PIR 人体感应。用 TCRT5000 的正确姿势是装在门口踏板/必经缝隙处做近距离触发。
  2. 声音阈值要结合环境噪声标定:鸡舍白天鸡叫此起彼伏,阈值照搬实验室数值必然误报到怀疑人生。装机后让系统在正常环境跑半小时记录声音强度基线,阈值设在基线明显上方(如 1.5 倍),夜间白天可以软件里分时段用不同阈值。
  3. 报警互锁别忘写:三个报警源共用一个蜂鸣器,任何一个解除条件就把蜂鸣器关掉,会把别的还在持续的报警也"顺手关了"。正确做法是三个报警标志独立置位/清除,蜂鸣器状态 = 三个标志的"或"。
  4. 蓝牙推送要防刷屏:人站在红外检测区不动,主循环几百毫秒一轮,手机一秒收十几条报警。入侵事件要做事件沿触发(上一次没人、这一次有人才发)或加几秒的推送间隔。
  5. 原论文里有处时钟电路描述要留意:文中写"HSE 接 PA8/PA9",实际上 STM32F103 的 HSE 晶振接的是专用 OSC_IN/OSC_OUT 引脚,PA8 是 MCO 时钟输出——照着这句话画图会直接翻车,画最小系统时以数据手册为准。

七、可扩展方向

  • 加 DHT11/DS18B20 多点布置,鸡舍不同区位温度分布一屏看全;
  • 氨气(MQ-137)、湿度传感器补齐空气质量维度,这才是"环境监控"的完全体;
  • JDY-31 换 ESP8266/4G 模块接入云平台,人在城里也能收到鸡舍报警,"云"鸡舍才名副其实。

八、资料内容完整工程资料(原理图、PCB、代码、元件清单)

九、资料获取方式

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐