【STM32项目开源】STM32单片机智能农业大棚控制系统

目录

一、设计背景和意义

1.1设计背景:

1.2设计意义:

二、实物展示

三、硬件功能介绍

[2.1 硬件清单:](#2.1 硬件清单:)

[2.2 功能介绍:](#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;//最大只能到百分之99
	  if(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;
				}
		}
}

七、单片机实物资料

资料获取 查看主页介绍:兆龙电子单片机设计

相关推荐
0南城逆流05 分钟前
【STM32】知识点介绍三:哈希算法详解
stm32·嵌入式硬件·哈希算法
云山工作室6 分钟前
基于STM32单片机的正激式开关电源设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·课程设计·毕设
芯希望41 分钟前
芯伯乐700mA线性稳压器XBLW L78M05H/L78M12H:稳定可靠,简化电源设计
单片机·嵌入式硬件
lingzhilab1 小时前
零知IDE——STM32F407VET6驱动SHT40温湿度传感器与ST7789实现智能环境监测系统
stm32·单片机·嵌入式硬件
研究司马懿2 小时前
【ETCD】ETCD——confd配置管理
数据库·golang·自动化·运维开发·etcd·argocd·gitops
商汤万象开发者2 小时前
LazyLLM教程 | 第13讲:RAG+多模态:图片、表格通吃的问答系统
人工智能·科技·算法·开源·多模态
Coovally AI模型快速验证2 小时前
视觉语言模型(VLM)深度解析:如何用它来处理文档
人工智能·yolo·目标跟踪·语言模型·自然语言处理·开源
2501_915921433 小时前
Fastlane 结合 开心上架(Appuploader)命令行版本实现跨平台上传发布 iOS App 免 Mac 自动化上架实战全解析
android·macos·ios·小程序·uni-app·自动化·iphone
13631676419侯3 小时前
智慧物流与供应链追踪
人工智能·物联网
星辰pid4 小时前
stm32的gpio模式到底该怎么选择?(及iic,spi,定时器原理介绍)
stm32·单片机·嵌入式硬件