【STM32项目开源】STM32单片机智能农业大棚控制系统
目录
一、设计背景和意义
1.1设计背景:
1.2设计意义:
二、实物展示
三、硬件功能介绍
2.1 硬件清单:
2.2 功能介绍:
四、软件设计流程图
五、硬件PCB展示
六、软件主函序展示
七、单片机实物资料
资料获取 查看主页介绍:兆龙电子单片机设计
一、设计背景和意义
1.1设计背景:
在温室大棚日常种植管理、作物生长状态监护及精准农业生产等场景中,大棚环境参数监测与智能调控是基础且核心的需求。传统温室大棚管理方式多依赖人工巡检或功能单一的简易监测工具,这类工具存在明显局限:一方面,专业农业环境监测设备(如大型多参数环境分析仪、高精度土壤检测站)体积庞大、操作复杂,且成本高昂,难以普及到中小农户家庭温室或小型种植基地场景,同时数据需人工记录整理,易出现记录误差与数据丢失,导致无法及时响应作物生长的环境需求;另一方面,普通简易监测工具(如手持温湿度计、手动光照表)虽便携性提升,但大多仅能监测单一环境指标(如仅测空气温度或仅测土壤湿度),缺乏多指标协同监测、数据实时传输及自动调控功能,无法满足现代化精准农业场景下对温室环境全方位、智能化管理的需求。
现有温室大棚控制方案还存在功能割裂与集成度低的问题:部分高端农业物联网设备虽具备多指标监测与数据存储功能,但依赖特定品牌生态系统,兼容性差,且设备与维护成本较高,难以覆盖中老年农户或低收入种植群体;而低成本的监测工具又往往在数据精度与功能完整性上有所欠缺,无法实现环境数据与移动端 APP、云端管理平台的联动,导致数据难以高效分析与长期管理,无法为作物生长规律总结及后续种植优化提供数据支撑。基于此,本设计以 STM32 单片机为核心,融合高精度环境参数采集模块(如温湿度传感器、光照传感器、土壤湿度传感器、CO₂浓度传感器)、LCD 显示模块、数据存储模块及继电器控制与报警模块,构建低成本、高集成度的 STM32 单片机智能温室大棚控制系统,以解决传统温室管理中指标单一、智能化程度低、数据利用效率低及普及性差的问题。
1.2设计意义:
本设计通过整合 STM32 单片机的高效数据处理能力与多模块协同工作机制,在智能温室大棚种植管理领域具有多重实用价值,具体体现在以下三方面:
从使用体验与管理效率角度,该系统突破了传统温室管理工具的局限:一是实现了多环境指标同步监测(如支持空气温湿度、土壤湿度、光照强度、CO₂浓度等核心指标),无需人工频繁使用不同工具巡检,减少操作繁琐性;二是配备 LCD 实时显示模块,直观呈现当前各项环境数据、数据采集时间及作物适宜生长范围,同时支持数据自动存储(可通过 SD 卡或 WiFi 传输至手机 APP / 云端平台),方便农户长期追溯环境变化趋势,为作物生长规律分析与种植方案优化提供完整数据支撑;三是新增环境异常预警与自动调控功能,当监测到某项环境指标超出预设适宜范围(如温度过高、土壤湿度过低、光照不足)时,系统自动触发声光报警,同时联动继电器开启风扇、水泵、补光灯等设备,无需人工干预即可及时调整环境,大幅提升了温室管理的便捷性与作物生长安全性。
从技术实践与成本控制角度,本设计以 STM32 单片机为核心,充分利用其低功耗、高性价比的优势,搭配低成本的高精度环境参数传感器(如 DHT11 温湿度传感器、BH1750 光照传感器、FC - 28 土壤湿度传感器、MG - 811 CO₂传感器)与通用外围模块,在保证数据精度(温度测量误差可控制在 ±0.5℃以内,土壤湿度测量误差可控制在 ±3% 以内)的前提下,有效降低了系统整体成本,相比同功能的高端农业物联网设备成本降低 40%-60%,更易普及到中小农户、家庭温室及小型种植基地场景。同时,系统支持模块化扩展(如后续可新增土壤酸碱度监测模块、蓝牙远程控制功能),为后续功能升级预留了空间,具备良好的灵活性与可扩展性。
从应用场景与行业价值角度,该系统可广泛适配多类种植场景:在家庭温室种植中,可作为花卉、蔬菜等作物的智能管理工具,实时调控生长环境,提升种植成功率;在高校农业工程与电子信息相关专业教学中,可作为单片机应用与农业环境监测的实践案例,帮助学生理解嵌入式系统与农业传感器协同工作原理;在中小规模经济作物种植基地(如草莓园、蔬菜大棚)中,可为农户提供低成本的精准管理方案,减少人工成本与水资源、电力资源浪费,提升作物产量与品质。此外,本设计探索了 STM32 单片机在低成本智能温室领域的应用方案,推动传统温室管理从 “单一指标、人工调控” 向 “多指标协同、智能监测、自动调控” 升级,为低成本智能化农业设备的开发提供了可参考的集成思路,具有较好的实践应用与行业推广价值。
二、实物展示
下方为实物演示视频
【开源】基于STM32单片机智能农业大棚控制系统
下方为实物展示图片
三、硬件功能介绍
2.1 硬件清单:
- STM32F103C8T6
- LCD1602显示
- 光照采集
- DHT11温湿度采集
- 土壤湿度采集
- 声光报警电路
- 继电器控制电路与
- 水泵
- 风扇
- 台灯
- ESP8266 WIFI模块
2.2 功能介绍:
(1)检测功能: 系统检测周围环境温度数据、土壤湿度数据、光照强度
(2)显示功能: 将检测到的环境数据显示在oled屏幕上
(3)控制功能: 当光照强度低于设定值时,开启灯光;温度高于设定值,开启风扇;蜂鸣器报警土壤湿度低于设定值,开启水泵;蜂鸣器报警
(4)无线通信:通过WiFi模块与手机APP可实时检测环境
(5)自动模式:自动模式可根据阈值工作
(6)手动模式:手动模式用户可自由控制开关
四、软件设计流程图
五、硬件PCB展示
六、软件主函序展示
#include "sys.h"
#include "adc.h"
#include "delay.h"
#include "lcd1602.h"
#include "ds18b20.h"
#include "timer.h"
#include "gpio.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>unsigned int light=0;
unsigned char temperature=0;
unsigned char setTempValue=35; //温度设置值
unsigned int setSoilMoisture=10;
unsigned char setLightValue=20; //光照设置值
unsigned int soilMoisture; //土壤湿度bool shuaxin = 0;
bool shanshuo = 0;
bool mode = 0; //0是自动模式,1是手动模式unsigned char setn=0;//记录设置键按下的次数void displayLight(void)//显示光照
{u16 test_adc=0;/////////////获取光线值test_adc = Get_Adc_Average(ADC_Channel_8,10);//读取通道9的5次AD平均值light = test_adc*99/4096;//转换成0-99百分比light = light >= 99? 99: light;//最大只能到百分之99if(light<=setLightValue && shanshuo){LCD_Write_Char(3,1,' ');
LCD_Write_Char(4,1,' '); }
else{
LCD_Write_Char(3,1,light/10+'0');
LCD_Write_Char(4,1,light%10+'0'); }
}void displaySoilMoisture(void)//显示土壤湿度
{float voltage = 0.0;voltage = Get_Adc_Average(ADC_Channel_9,10)*3.3/4096;if(voltage > 3.3)voltage = 3.3;if(voltage < 1.0) soilMoisture=99;else{soilMoisture = (3.3 - voltage) / 0.023; if(soilMoisture > 99)soilMoisture = 99; //最大取百分之99}if(soilMoisture<=setSoilMoisture && shanshuo){LCD_Write_Char(9,0,' '); LCD_Write_Char(10,0,' ');}
else{LCD_Write_Char(9,0,soilMoisture/10+'0'); LCD_Write_Char(10,0,soilMoisture%10+'0');}
}void displayTemperature(void)//显示温度
{temperature=ReadTemperature();if(temperature>=setTempValue && shanshuo){LCD_Write_Char(12,1,' '); LCD_Write_Char(13,1,' ');}
else{if(temperature!=0){LCD_Write_Char(12,1,temperature/10+'0'); LCD_Write_Char(13,1,temperature%10+'0');}}
}void displaySetValue(void)
{
if(setn == 1){
LCD_Write_Char(7,1,setSoilMoisture/10+'0'); LCD_Write_Char(8,1,setSoilMoisture%10+'0');}if(setn == 2){
LCD_Write_Char(7,1,setTempValue/10+'0'); LCD_Write_Char(8,1,setTempValue%10+'0');}if(setn == 3){
LCD_Write_Char(7,1,setLightValue/10+'0'); LCD_Write_Char(8,1,setLightValue%10+'0');}
}void keyscan(void)
{
if(KEY1 == 0)//模式切换按键{
delay_ms(20);//消抖if(KEY1 == 0){
while(KEY1 == 0);//等待按键松开
if(setn == 0){mode = !mode;
if(mode==0)LCD_Write_String(13,0,"ZD");else LCD_Write_String(13,0,"SD");}}}if(KEY2 == 0){
delay_ms(20);//消抖if(KEY2 == 0){
while(KEY2 == 0);BEEP=0;
if(mode==0){setn ++;}
if(mode==1){RELAY3=~RELAY3;;}if(setn == 1){
LCD_Write_String(0,0,"set the Moisture");//显示字符串
LCD_Write_String(0,1," 00% ");}if(setn == 2){
LCD_Write_String(0,0," set the Temp ");//显示字符串
LCD_Write_String(0,1," 00 C ");LCD_Write_Char(9,1,0xdf);}if(setn == 3){
LCD_Write_String(0,0," set the Light ");//显示字符串
LCD_Write_String(0,1," 00% ");}displaySetValue();if(setn >= 4){setn = 0;LCD_Write_String(0,0,"Moisture: % ");//显示字符串
LCD_Write_String(0,1,"Gx: % Temp: C");
LCD_Write_Char(14,1,0xdf);if(mode==0)LCD_Write_String(13,0,"ZD");else LCD_Write_String(13,0,"SD");}}}
if(KEY3 == 0)//加键{
delay_ms(20);//消抖if(KEY3 == 0 ){
while(KEY3 == 0);
if(setn == 0 && mode==1){RELAY1=~RELAY1;}if(setn == 1){
if(setSoilMoisture<99)setSoilMoisture++;}if(setn == 2){
if(setTempValue<99)setTempValue++;}if(setn == 3){if(setLightValue<99)setLightValue++;}displaySetValue();}}if(KEY4 == 0)//减键{
delay_ms(20);//消抖if(KEY4 == 0 ){
while(KEY4 == 0);if(setn == 0 && mode==1){RELAY2=~RELAY2;}if(setn == 1){
if(setSoilMoisture>0)setSoilMoisture--;}if(setn == 2){
if(setTempValue>0)setTempValue--;}if(setn == 3){if(setLightValue>0)setLightValue--;}displaySetValue();}}
}unsigned char temp_=0;int main(void)
{
delay_init(); //延时函数初始化 NVIC_Configuration();
delay_ms(500); //上电瞬间加入一定延时在初始化DS18B20_GPIO_Init();Adc_Init(); //ADC初始化KEY_GPIO_Init(); //按键初始化
LCD_Init(); //屏幕初始化DS18B20_Init();LCD_Write_String(0,0," loading... ");LCD_Write_String(0,0,"Moisture:00% ZD ");//显示字符串LCD_Write_String(0,1,"Gx:00% Temp:00 C");LCD_Write_Char(14,1,0xdf);
TIM3_Init(99,719); //定时器初始化,定时1ms
//Tout = ((arr+1)*(psc+1))/Tclk ;
//Tclk:定时器输入频率(单位MHZ)
//Tout:定时器溢出时间(单位us)
while(1){ keyscan();if(setn == 0){if(shuaxin == 1){shuaxin = 0;displayLight(); //显示光照displaySoilMoisture(); //显示土壤湿度displayTemperature(); //显示温度if(mode==0) {if(light<=setLightValue)RELAY1=1;else RELAY1=0; //光线暗开灯if(soilMoisture<=setSoilMoisture)RELAY2=1;else RELAY2=0; //湿度低开水泵if(temperature>=setTempValue)RELAY3=1;else RELAY3=0; //温度高开风扇if(light<=setLightValue||temperature>=setTempValue||soilMoisture<=setSoilMoisture)BEEP=1;else BEEP=0; //蜂鸣器提醒}else{BEEP=0;}}}delay_ms(20);}
}void TIM3_IRQHandler(void) //TIM3中断,50毫秒一次中断
{
static u16 timeCount1 = 0;if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 {
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源 timeCount1++;if(timeCount1 >= 300) //300ms{timeCount1 = 0;shanshuo = !shanshuo;shuaxin = 1;}}
}