目录
[2.1 硬件清单:](#2.1 硬件清单:)
[2.2 功能介绍:](#2.2 功能介绍:)
[资料获取 查看主页介绍:兆龙电子单片机设计](#资料获取 查看主页介绍:兆龙电子单片机设计)
一、设计背景和意义
1.1设计背景:
在现代农业集约化、智能化发展的背景下,家用小型种植大棚、乡村集体种植大棚、规模化商用农业大棚的日常精细化管理、无人值守场景下的环境动态调控、种植全周期状态监控、异常环境快速溯源及种植户简易查看棚内生长环境,成为农业大棚种植的核心需求。传统农业大棚管理方式存在明显局限:一方面,高端商用农业大棚管控系统(如定制化智慧农业运维平台、工业级多环境参数监测网关、品牌成套商用大棚智能控制设备)功能虽全但成本高昂,部署复杂且需专业人员上门调试与后期维护,难以普及到家用小型种植大棚、乡村零散集体大棚及中小规模农户配套大棚等日常场景,且系统生态封闭性强,不同品牌、不同协议的大棚监测设备与控制终端兼容性差,无法与个人移动终端、乡村农业服务平台、区域农业管控中心灵活联动,更换或升级成本高,无法满足不同人群(如普通种植农户、乡村农业管理员、中小规模大棚种植经营者)的便捷精细化管控需求;另一方面,普通简易大棚管理装置(如传统手动通风设备、单一温度监测仪表、基础款滴灌开关装置)虽操作简单、价格低廉,但功能单一,仅能实现单一项环境参数的基础监测或人工被动调控,缺乏多环境参数协同监测、异常状态智能判断、种植数据存储、远程状态推送及故障精准定位提醒(如高温报警、缺水故障、通风设备卡滞)等功能,无法满足现代化农业大棚种植场景下对全面覆盖、智能响应、便捷高效的种植管控与运维需求。
现有关农业大棚管控方案还存在功能割裂与集成度低的问题:部分高端商用农业大棚管控系统虽具备多维度环境参数监测与远程运维功能,但依赖复杂的软硬件架构与专属生态维护,后期使用成本高,难以覆盖预算有限的普通种植农户、乡村集体大棚或中小规模大棚种植的管控场景;而低成本大棚管理装置又在功能完整性与智能化上存在欠缺,无法实现监测数据与大棚控制终端、移动 APP、区域农业服务平台的实时联动,导致环境调控延迟、参数监测误差偏大、个性化需求(如家用小型大棚夜间低温保温调控、集体大棚缺水自动滴灌提醒)无法满足等问题,无法为农业大棚作物的健康生长(如无人值守场景下的主动环境调控)及高效种植管理(如精准溯源大棚环境隐患影响作物生长)提供可靠支撑。基于此,本设计以 STM32 单片机为核心,融合高精度环境监测与辅助模块(如温湿度采集模块、土壤墒情监测模块、光照强度检测模块、CO₂浓度感应模块)、LCD 显示模块、数据存储模块及蓝牙通信与异常提醒模块,构建低成本、高集成度的物联网智慧农业大棚控制系统,以解决传统农业大棚管理方式操作繁琐、智能化程度低、功能单一及大棚种植管控效率低的问题。
1.2设计意义:
从使用体验与农业大棚精细化管控效率角度,该系统突破了传统农业大棚管理方式的局限:一是实现了多维度环境监测与全周期作物生长联动(如支持温湿度采集、土壤墒情实时监测、光照强度检测、CO₂浓度感应,联动蓝牙通信模块、异常声光提醒模块、大棚智能调控执行模块),无需种植户或管理员现场逐一排查环境参数与设备状态,减少农业大棚管理的繁琐性与环境调控的延迟性;二是配备 OLED 实时显示模块,直观呈现当前大棚运行参数(温度 / 湿度 / 土壤墒情 / 光照强度)、作物生长环境评估、系统运行状态(正常 / 异常)及预警类型,同时支持数据自动存储(可通过蓝牙传输至移动 APP / 乡村农业服务平台 / 大棚种植运维管理平台),方便种植户与农业管理员长期追溯大棚环境历史数据与设备运行记录,也为优化大棚种植管控方案、排查设备故障隐患及大棚集群高效运维提供完整数据支撑;三是新增个性化环境预警与自动调控执行功能,当监测到异常参数(如高温 / 低温、土壤过干 / 过湿、光照不足 / 过强、CO₂浓度偏低 / 偏高、灌溉设备卡滞),系统根据环境异常类型自动触发对应执行动作(同时通过声光提醒模块反馈预警信息与设备当前工作状态,蓝牙同步推送至关联移动终端),并联动大棚设备执行智能调控操作(如联动高温故障,自动开启通风设备、启动降温喷淋、记录异常发生时间与环境参数数据),无需人工现场干预即可实现农业大棚的智能化精细化管控,大幅提升了大棚管理的便捷性与种植运维的高效性。
从技术实践与成本控制角度,本设计以 STM32 单片机为核心,充分利用其低功耗、高性价比的优势,搭配低成本的高精度环境监测模块及通用外围模块,在保证监测精度(核心环境参数监测准确率可控制在 98% 以上,异常预警与调控响应时间可控制在 0.5 秒以内)的前提下,有效降低了系统整体成本,相比同功能的高端商用农业大棚管控系统成本降低 40%-60%,更易普及到家用小型种植大棚、乡村集体种植大棚、零散布设便民大棚及老旧大棚智能化改造等场景。同时,系统支持模块化扩展(如后续可新增大棚远程启停调控功能、多大棚集群组网监测功能、作物生长周期统计与环境异常溯源功能),为后续功能升级预留了空间,具备良好的灵活性与可扩展性。
**二、**实物展示
下方为实物演示视频
下方为实物展示图片

三、硬件功能介绍
2.1 硬件清单:
-
STM32F103C8T6
-
OLED显示
-
温湿度传感器
-
土壤湿度传感器
-
降压电路
-
声光报警
-
二氧化碳传感器
-
继电器控制电路
-
水泵
-
风扇
-
ULN2003步进电机驱动
-
光照采集
-
WIFI模块
2.2 功能介绍:
(1)检测功能:环境温湿度数据、土壤温湿度数据、光照强度Lux、二氧化碳浓度ppm
(2)显示功能:将检测到的环境数据显示在oled屏幕上
(3)阈值设置:可以自主设置各环境参数的阈值,断电数据保存
(4)手动模式:通过按键控制风扇、水泵和步进电机的开启和关闭
(5)自动模式:当环境温湿度、土壤温湿度超出阈值,自动开启风扇进行除湿和降温、
自动开启水泵进行浇水和降温以及打开蜂鸣器报警
(6)远程控制:通过WIFI机智云APP控制风扇 水泵和步进电机的运行,监控当前环境数据
四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示
void ThresholdModification(uint8_t num)
{
switch (num)
{
case 1:
if (KeyNum == 3)
{
KeyNum = 0;
Sensorthreshold.tempValue++;
if (Sensorthreshold.tempValue > 99)
{
Sensorthreshold.tempValue = 1;
}
}
else if (KeyNum == 4)
{
KeyNum = 0;
Sensorthreshold.tempValue--;
if (Sensorthreshold.tempValue < 1)
{
Sensorthreshold.tempValue = 99;
}
}
break;
case 2:
if (KeyNum == 3)
{
KeyNum = 0;
Sensorthreshold.humiValue++;
if (Sensorthreshold.humiValue > 99)
{
Sensorthreshold.humiValue = 1;
}
}
else if (KeyNum == 4)
{
KeyNum = 0;
Sensorthreshold.humiValue--;
if (Sensorthreshold.humiValue < 1)
{
Sensorthreshold.humiValue = 99;
}
}
break;
case 3:
if (KeyNum == 3)
{
KeyNum = 0;
Sensorthreshold.soilTempValue++;
if (Sensorthreshold.soilTempValue > 99)
{
Sensorthreshold.soilTempValue = 1;
}
}
else if (KeyNum == 4)
{
KeyNum = 0;
Sensorthreshold.soilTempValue--;
if (Sensorthreshold.soilTempValue < 1)
{
Sensorthreshold.soilTempValue = 99;
}
}
break;
case 4:
if (KeyNum == 3)
{
KeyNum = 0;
Sensorthreshold.soilHumiValue++;
if (Sensorthreshold.soilHumiValue > 99)
{
Sensorthreshold.soilHumiValue = 1;
}
}
else if (KeyNum == 4)
{
KeyNum = 0;
Sensorthreshold.soilHumiValue--;
if (Sensorthreshold.soilHumiValue < 1)
{
Sensorthreshold.soilHumiValue = 99;
}
}
break;
case 5:
if (KeyNum == 3)
{
KeyNum = 0;
Sensorthreshold.luxValue += 10;
if (Sensorthreshold.luxValue > 2000)
{
Sensorthreshold.luxValue = 0;
}
}
else if (KeyNum == 4)
{
KeyNum = 0;
Sensorthreshold.luxValue -= 10;
if (Sensorthreshold.luxValue > 2000)
{
Sensorthreshold.luxValue = 2000;
}
}
break;
case 6:
if (KeyNum == 3)
{
KeyNum = 0;
Sensorthreshold.CO2Value += 10;
if (Sensorthreshold.CO2Value > 2000)
{
Sensorthreshold.CO2Value = 0;
}
}
else if (KeyNum == 4)
{
KeyNum = 0;
Sensorthreshold.CO2Value -= 10;
if (Sensorthreshold.CO2Value > 2000)
{
Sensorthreshold.CO2Value = 2000;
}
}
break;
default: break;
}
}
/**
* @brief 获取二氧化碳数据
* @param *data 为数据传参
* @retval 无
*/
void CO2GetData(uint16_t *data)
{
if (Usart3_RxFlag == 1)
{
Usart3_RxFlag = 0;
*data = Usart3_RxPacket[1] * 256 + Usart3_RxPacket[2];
}
}
/**
* @brief 传感器数据扫描
* @param 无
* @retval 无
*/
void SensorScan(void)
{
DHT11_Read_Data(&sensorData.humi, &sensorData.temp);
YL69_PercentageData(&sensorData.soilHumi);
LDR_LuxData(&sensorData.lux);
CO2GetData(&sensorData.CO2);
DS18B20_Read_Temp(&sensorData.soilTemp);
}
int main(void)
{
ADCX_Init();
Timer2_Init(9,14398);
Uart2_Init(9600);
Uart1_Init(115200);
Uart3_Init();
LDR_Init();
YL69_Init();
OLED_Init();
DHT11_Init();
LED_Init();
Buzzer_Init();
Relay_Init();
MOTOR_Init();
Key_Init();
Sensorthreshold.CO2Value = FLASH_R(FLASH_START_ADDR); //从指定页的地址读FLASH
Sensorthreshold.luxValue = FLASH_R(FLASH_START_ADDR+2); //从指定页的地址读FLASH
Sensorthreshold.tempValue = FLASH_R(FLASH_START_ADDR+4); //从指定页的地址读FLASH
Sensorthreshold.humiValue = FLASH_R(FLASH_START_ADDR+6); //从指定页的地址读FLASH
Sensorthreshold.soilTempValue = FLASH_R(FLASH_START_ADDR+8); //从指定页的地址读FLASH
Sensorthreshold.soilHumiValue = FLASH_R(FLASH_START_ADDR+10); //从指定页的地址读FLASH
GENERAL_TIM_Init();
while (1)
{
SensorScan(); //获取传感器数据
Key_scan(); //按键扫描函数
switch (menu)
{
case display_page1:
SensorDataDisplay1(); //显示传感器1数据
OLED_Menu1(); //显示主页面1固定信息
if (KeyNum == KEY_2) //是否按下按键2
{
KeyNum = 0;
OLED_Clear(); //清屏
menu = display_page2; //menu = 主页面2
}
MotorOperation();
break;
case display_page2:
SensorDataDisplay2(); //显示传感器2数据
OLED_Menu2(); //显示主页面2固定信息
if (KeyNum == KEY_2) //是否按下按键2
{
KeyNum = 0;
OLED_Clear(); //清屏
menu = display_page1; //menu = 主页面1
}
MotorOperation();
break;
case settingsPage:
//从主页面跳转至设置页面时进行一次清屏
if (OLED_Clear_Flag)
{
OLED_Clear_Flag = 0; //清除清屏标志位
OLED_Clear(); //清屏
}
ThresholdModification(SetSelection()); //调节传感器阈值
OLED_Option(SetSelection()); //获取按键次数,从而判断">"显示位置
settingsThresholdDisplay1(); //显示传感器阈值1数据
OLED_settingsPage1(); //显示阈值设置界面1固定信息
if (KeyNum == KEY_2) //判断用户是否按下退出按键
{
KeyNum = 0;
OLED_Clear(); //清屏
menu = display_page1; //回到主页面1
//存储修改的传感器阈值至flash内
FLASH_W(FLASH_START_ADDR, Sensorthreshold.CO2Value, Sensorthreshold.luxValue,
Sensorthreshold.tempValue, Sensorthreshold.humiValue,
Sensorthreshold.soilTempValue, Sensorthreshold.soilHumiValue);
}
break;
default: break;
}
}
}
七、单片机实物资料
