基于单片机的鸡舍环境控制系统
在本设计中,基于单片机的鸡舍环境控制系统软件是以气体检测为重点研究对象,而STM32单片机的设计是关键操作,DHT11会采集当前温湿度。OLED显示获取的气体浓度和检测的光照强度,环境的温湿度。独立按键可以设置指定的值。当气体浓度超过最大值,蜂鸣器发出警报,继电器闭合,风扇打开。
1.系统整体方案
图1-1 系统框图
如图1-1所示,该设计利用STM32单片机作为核心控制单元,结合多个模块实现了一个基于单片机的智能鸡舍系统。系统设计包括中控单元、输入单元和输出单元三个主要部分。中心控制单元以STM32F103C8T6单片机为核心,负责接收输入单元的数据,经过处理后驱动输出单元。
输入单元共分为九个部分,其中:第一部分采用氨气传感器,用于监测环境中氨气的浓度;第二部分使用硫化氢传感器,检测空气中的硫化氢浓度;第三部分的CO2检测模块负责测定CO2浓度;第四部分的光敏电阻模块用于侦测当前光照水平;第五部分的PM2.5模块检测环境中的颗粒物浓度;第六部分利用DHT11温湿度传感器来获取环境温湿度数据;第七部分通过DS1302时钟模块来提供准确时间;第八部分设有独立按键,用于界面切换与时间校准;第九部分的供电电路则为系统整体提供电力支持。
输出单元由五个部分组成:第一部分的OLED显示屏用于展示检测到的各项参数值、设置阈值及时间等信息;第二部分的USB灯提供必要的照明;第三部分通过继电器来控制风扇,实现通风;第四部分的ECB02蓝牙模块负责将收集的数据传输至手机;最后一部分的蜂鸣器则在参数异常时发出报警信号。通过这样的系统架构,不仅提升了鸡舍环境的智能监控能力,还实现了高效的数据处理与设备管理。
2. 硬件整体设计分析
该设计方案基于智能检测系统,适用于检测及控制环境温湿度和气体浓度。如图31所示该系统软件是由STM32最小单片机系统软件,OLED液晶显示器,DHT11温湿度检测模块,ADC模数转换芯片,气体传感器,蓝牙控制模块,由继电器所控制的风扇,各个功能键,以及蜂鸣器组成的方案。
图2-1 总体电路图
3.主程序流程设计
如图3-1展示了系统的主流程图。主程序首先初始化各个模块,随后持续运行while主循环。主循环的开始是执行按键功能。该功能由两部分组成:首先,通过执行扫描操作获取键盘输入或接受蓝牙命令作为第一步。接着,基于接收到的按键值或指令,进行相应操作,例如切换用户界面、模式选择、参数阈值设定、手动控制照明或时间调整等。继之,程序进入第二个功能,监测功能,它首先通过传感器检测温湿度、光照、二氧化碳、氨气和硫化氢的值,并读取时间,然后将这些数据发送到手机。第三个功能是显示功能,负责展示时间、温湿度、光照强度和二氧化碳浓度等信息。接下来是第四个功能,处理功能,主要检查蜂鸣器是否报警、风扇和照明的工作状态。最后,一个延时功能被用于控制各个功能的扫描时间。以下为部分主程序源码的展示:
void main()
{
LCD1602_init(); // 初始化LCD1602显示屏
Delay_function(50); // 延时50毫秒
lcd1602_clean(); // 清除LCD显示内容
Delay_function(50); // 再次延时50毫秒
Uart_Init(); // 初始化串口通信
while(1)
{
// 此处省略的代码继续执行相应功能
// ……
}
}
图3-1 程序总体流程图
-
-
按键函数程序设计
-
如图3-2所展现的是按键功能的子流程图。该功能初始化时,利用扫描功能读取按键输入的键值以及接收到的蓝牙命令。然后,根据不同的键值或命令,对应地调整变量值。
图3-2 按键函数子流程图
在获取键值或指令时,系统将执行不同的操作。键值/指令为1时,系统将进行界面切换。键值/指令为2时,会跳转到设置阈值的界面。当键值/指令为3时,系统模式发生改变。
对于键值/指令为4的情况,操作依据当前界面的不同而变化:在界面0,实现灯光的手动控制;在界面1至6,分别将温度、湿度、二氧化碳、光照、氨气和硫化氢的阈值增加10;从界面7到8,分别增加灯光打开和关闭的时间。而在界面9至15,分别对年、月、日、时、分、秒和星期的数值进行+1的调整。
当键值/指令为5时,根据当前选中的界面执行减操作:在界面0下,手动切换风扇的开闭状态;在界面1至6,相应的环境参数阈值将减少10;在界面7与8,分别调节风扇的启停时间。对于界面9至15,执行对应日期和时间参数的-1调整。
若键值/指令为6,系统将回到初始界面。相关功能的实现细节记录在部分程序源码中。:
void Key_function(void)
{
key_num = Chiclet_Keyboard_Scan(); // 执行按键扫描
// 检查是否有按键按下或接收到蓝牙指令
if (key_num != 0 || uart_num != 0)
{
// 如果收到蓝牙指令
if (uart_num != 0)
{
key_num = uart_num; // 使用蓝牙指令更新按键值
uart_num = 0; // 重置蓝牙指令变量
}
// 根据按键值执行相应操作
switch (key_num)
{
case 1: // 按键1被按下
flag_display++; // 更新显示标志
if (flag_display >= 16) // 超过模式数,重置
flag_display = 0;
lcd1602_clean(); // 清除屏幕显示
break;
// 以下代码段被省略
// ……
}
}
}
-
-
显示函数流程设计
-
如图3-3所揭示的子流程图表明,显示功能通过不同的显示标识选择呈现相应的界面内容。具体地,界面0用于显示当前时间以及温度、湿度、光照强度、二氧化碳浓度、氨气和硫化氢的浓度。界面1至6分别用于展现温度、湿度、二氧化碳、光照、氨气和硫化氢的设置上限值。界面7和8显示灯光的开启与关闭时间。从界面9到15,依次显示设定的年、月、日、时、分、秒及星期值。相关功能实施的具体代码段在软件的部分程序源码中进行了说明。
void Display_function(void)
{
switch(flag_display) // 根据显示标志来决定显示哪个界面
{
case 0: // 界面0
switch(flag_display_1)
{
case 0:
lcd1602_display_str(1,0,"T:"); // 显示温度
lcd1602_display_temp(1,2,temp_value); // 在指定位置显示温度值
lcd1602_display_str(1,9,"H:"); // 显示湿度
lcd1602_display_humi(1,11,humi_value); // 在指定位置显示湿度值
lcd1602_display_str(2,0,"L:"); // 显示光照
lcd1602_display_light(2,2,light_value); // 在指定位置显示光照值
lcd1602_display_str(2,9,"C:"); // 显示二氧化碳浓度
lcd1602_display_gas(2,11,CO2_value); // 在指定位置显示CO2浓度
break;
// 其他部分代码被省略
// ……
}
break;
// 其他情况的代码也被省略
// ……
}
}
图3-3 显示函数子流程图
-
-
处理函数流程设计
-
如图3-4显示,当系统处于自动模式并且显示标志为1时,如果温度、湿度、二氧化碳、氨气或硫化氢的任一测量值超出预设的阈值,将触发处理函数子流程执行控制动作。此时,风扇继电器会被激活以应对超标情况。同样,若测得的二氧化碳、氨气或硫化氢浓度超过阈值,系统会启动蜂鸣器发出警报信号。同时,如果二氧化碳、氨气或硫化氢的测量值超过阈值,蜂鸣器将发出警报。此外,如果当前时间处于灯光预设的开启与关闭时间范围内,并且光照强度低于设定的最小值,灯将被自动开启。相关的程序细节详细记录在软件的部分源码中。
void Manage_function(void)
{
// 当显示标志位为0且状态为1时
if (flag_display == 0 && state == 1)
{
// 检查任一环境参数是否超过其最大允许值
if (temp_value > temp_max || humi_value > humi_max || CO2_value > CO2_max || NH3_value > NH3_max || H2S_value > H2S_max)
{
jdq_fs = 0; // 启动风扇继电器,对应环境参数过高
}
else
{
jdq_fs = 1; // 环境稳定,继电器关闭
}
// 其他代码被省略
// ……
}
}
图3-4 处理函数子流程图
作者:别来无恙802