单片机毕业设计基于stm32的蔬菜大棚智能监控系统设计

news2024/9/20 14:04:48

文章目录

  • 前言
  • 资料获取
  • 设计介绍
  • 功能介绍
    • 程序代码部分参考
  • 设计清单
  • 具体实现截图
  • 参考文献
  • 设计获取


前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

资料获取

文章底部名片,详细资料联系我。

设计介绍

随着科技的不断发展,人们的生活水平逐步上升,对自身的健康有越来越重视,故而绿色食品成了人们的追捧,但是绿色食品的参量却不尽人意。蔬菜大棚种植可以完美得解决了人们的需求,但是传统的蔬菜大棚有许多明显的缺点,因此设计了基于STM32单片机蔬菜大棚温控系统。
在本设计中,通过使用STM32作为中央处理器,同时使用了层次化和模块化的电路设计理念,将软件与硬件巧妙的融合在一起,硬件为主,软件为辅。通过各种传感器对蔬菜大棚的内部环境因子进行采集,如空气的温度与湿度、光照的强度、土壤的温度与湿度,这些环境因子的数据就会被采集,通过加热片模块与java语言编译的客户端网站进行对接,客户端对数据进行处理后对STM32单片机反馈,STM32单片机反馈的信息进行处理。试验证实,此设计可以对蔬菜大棚的温度,土壤的湿度与温度,以及光照的强度进行检测并对其做出反应,如进行通风,洒水,补光。均实现了预期的效果.

功能介绍

1.可通过温湿度传感器,采集当前环境的温度、湿度数值。
2.可通过光敏传感器,采集当前的光照数值。
3.可通过继电器控制加热片实现种植环境温度恒温控制。
4.可通过继电器控制启水泵进行浇水,实现种植环境水量饱和。
5.可通过LED灯实现种植植物光照吸收充足
6.蜂鸣器警报

程序代码部分参考

#include "sys.h"
#include "adc.h"
#include "delay.h"
#include "lcd1602.h"
#include "ds18b20.h"
#include "timer.h"
#include "usart1.h"
#include "gpio.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#define STM32_RX1_BUF       Usart1RecBuf 
#define STM32_Rx1Counter    RxCounter
#define STM32_RX1BUFF_SIZE  USART1_RXBUFF_SIZE

unsigned int  light=0;
unsigned char temperature=0;
unsigned char setTempValue=35;        //温度设置值
unsigned int  setSoilMoisture=10;
unsigned char setLightValue=20;       //光照设置值
unsigned int  soilMoisture;           //土壤湿度

bool usart_send_flag = 0;
bool mode = 0;               //0是自动模式,1是手动模式
bool shuaxin  = 0;
bool shanshuo = 0;
bool sendFlag = 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)
		{
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 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(RELAY2==1)delay_ms(50);
		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(RELAY2==1)delay_ms(50);
		if(KEY2 == 0)
		{
       while(KEY2 == 0);
			 BEEP=0;
			setn ++;
			 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);
			 }
			 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(RELAY2==1)delay_ms(50);
		if(KEY3 == 0 )
		{
			while(KEY3 == 0);
			 {
					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(RELAY2==1)delay_ms(50);
		if(KEY4 == 0 )
		{
			 {
				 if(setLightValue>0)setLightValue--;
			 }
			 displaySetValue();
		}
	}
}

void UsartSendReceiveData(void)
{
		char *str1=0,i;
	  int  setValue=0;
	  char setvalue[5]={0};
	
		if(STM32_Rx1Counter > 0)
		{
			
			  delay_ms(20);
			
				if(strstr(STM32_RX1_BUF,"light:")!=NULL)
				{
					  BEEP = 1;
						delay_ms(80);
					  BEEP = 0;
					
						str1 = strstr(STM32_RX1_BUF,"light:");
					  
					while(*str1 >= '0' && *str1 <= '9')        //判断是不是0到9有效数字
						{
								setvalue[i] = *str1;
								i ++; str1 ++;
								if(*str1 == ',')break;            //换行符,直接退出while循环
					
ak;            //换行符,直接退出while循环
								delay_ms(10);
						}
						setvalue[i] = '\0';            //加上结尾符
						setValue = atoi(setvalue);
						if(setValue>=0 && setValue<=99)
int main(void)
{	
		delay_init();	    //延时函数初始化	  
	  NVIC_Configuration();
		delay_ms(500);       //上电瞬间加入一定延时在初始化
	  DS18B20_GPIO_Init();
	  Adc_Init();          //ADC初始化
	  KEY_GPIO_Init();    //按键初始化
		LCD_Init();         //屏幕初始化
	  DS18B20_Init();
	  uart1_Init(9600);
  	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(temperature>=setTempValue||soilMoisture<=setSoilMoisture)RELAY2=1;else RELAY2=0;         //温度高或者湿度低开水泵
								 
									 if(light<=setLightValue||temperature>=setTempValue||soilMoisture<=setSoilMoisture)BEEP=1;else BEEP=0;  //蜂鸣器提醒
							 }
							 else
							 {
									 BEEP=0;
							 }
					 }
			 }
			 UsartSendReceiveData();   //串口发送接收数据
			 delay_ms(20);
		}	
}


设计清单

步进电机元件清单
1.7*9万用板
2.四位一体共阳.36数码管
3.STC89C51
4.步进电机

具体实现截图

在这里插入图片描述
在这里插入图片描述

参考文献

[1] 嵌入式温室环境智能控制系统设计与实现[D]. 王惠.安徽大学,2020
[2] 基于STM32的物联网温室控制管理系统设计[D]. 王鹏辉.合肥工业大学,2019
[3] 基于嵌入式系统的蔬菜大棚管控系统设计[J]. 朱婧玮.南方农机,2023(05)
[4] 基于STM32蔬菜大棚控制系统设计[J]. 赵圆圆.智慧中国,2022(02)
[5] 基于STM32的蔬菜大棚控制系统设计[J]. 潘澳;周丽丽;何源长;谢欣秀.南方农机,2020(24)
[6] 基于STM32的蔬菜大棚环境监测系统设计[J]. 郑洋;宋振凯;赵婧.无线互联科技,2022(19)
[7] 智能蔬菜大棚生产环境调控系统[J]. 刘灿;朱晓坤;丁奇;邢康慧;伍刚.智慧农业导刊,2022(17)
[8] 基于物联网的农业蔬菜大棚环境监控系统设计[J]. 陈根;易治国.南方农机,2022(16)
[9] 我国设施农业发展现状、障碍及对策研究[J]. 李浩.南方农机,2021(23)
[10] 设施农业发展现状及对策[J]. 张小燕.甘肃农业,2021(04)
[11] 基于STM32单片机的仓库温度监测系统设计与控制[J]. 占华林;陈亮亮;张配阳;诸丽芳;于子正.科技创新与应用,2021(29)
[12] 基于物联网和雾计算的温室智能感控系统设计[J]. 苑光明;王曼娜;丁承君;冯玉伯.传感器与微系统,2020(08)
[13] 基于物联网技术的农业环境监控系统设计[J]. 潘新元;刘志强;张礼麟;段海军;韩勇.无线互联科技,2020(04)
[14]基于STM32的智慧蔬菜大棚系统设计[J] 冼进 冼允廷 华南理工大学计算机科学与工程学院 2023(04)
[15] 现代智慧农业设施大棚环境监测系统设计[J]. 张玮.计算机测量与控制,2020(08)
[16] Intelligent Temperature Control System of Greenhouse Based on STM32 Single Chip Microcomputer

设计获取

文章下方名片联系我即可~

精彩专栏推荐订阅:在下方专栏👇🏻

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.2.3 UDP的可靠传输协议QUIC 2

udp可靠传输 kcp协议 网络通畅下&#xff0c;kcp比tcp慢 这里直接看课件图片&#xff0c; 延迟ack比非延迟减少应答包数量&#xff0c;但是慢 kcp 讲解 kan代码ikcp.c 按照readme指南编译一下&#xff01;&#xff01; mkdir build cd build cmake .. make第一遍报错&#xf…

ant-design-vue中实现a-tree树形控件父子关联选中过滤的算法

在使用ant-design-vue的框架时&#xff0c;a-tree是比较常用的组件&#xff0c;比较适合处理树形结构的数据。 但是在与后台数据进行授权交互时&#xff0c;就不友好了。 在原生官方文档的例子中&#xff0c;若子项被勾选&#xff0c;则父级节点会被关联勾选&#xff0c;但这勾…

【堆的应用--C语言版】

前面一节我们都已将堆的结构&#xff08;顺序存储&#xff09;已经实现&#xff0c;对树的相关概念以及知识做了一定的了解。其中我们在实现删除操作和插入操作的时候&#xff0c;我们还同时实现了建大堆&#xff08;小堆&#xff09;的向上&#xff08;下&#xff09;调整算法…

【CSS in Depth 2 精译_024】4.2 弹性子元素的大小

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

PyInstaller问题解决 onnxruntime-gpu 使用GPU和CUDA加速模型推理

前言 在模型推理时&#xff0c;需要使用GPU加速&#xff0c;相关的CUDA和CUDNN安装好后&#xff0c;通过onnxruntime-gpu实现。 直接运行python程序是正常使用GPU的&#xff0c;如果使用PyInstaller将.py文件打包为.exe&#xff0c;发现只能使用CPU推理了。 本文分析这个问题…

TL-Tomcat中长连接的底层源码原理实现

长连接&#xff1a;浏览器告诉tomcat不要将请求关掉。 如果不是长连接&#xff0c;tomcat响应后会告诉浏览器把这个连接关掉。 tomcat中有一个缓冲区 如果发送大批量数据后 又不处理 那么会堆积缓冲区 后面的请求会越来越慢。

Java架构师未来篇大模型

目录 1. 大模型的定义2 大模型相关概念区分3 大模型的发展历程4. 大模型的特点5 大模型的分类6 大模型的泛化与微调7 大模型岗位需求8 理解大模型8.1 生活中的比喻8.2 大模型的定义9 大模型工作9.1 数据的积累9.2 模型的训练9.3 预测和应用10 大模型的实际应用10.1 语言处理10.…

240907-Gradio插入Mermaid流程图并自适应浏览器高度

A. 最终效果 B. 示例代码 import gradio as grmermaid_code """ <iframe srcdoc <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width" />…

C++初阶:STL详解(一)——string类

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 1.为什么会有string类 C 语言中&#xff0c…

Nodejs中使用Minio

Minio 安装Minio MinIO下载 下载完&#xff0c;服务端和客户端后&#xff0c;最好像我这样做&#xff0c;去分一下路径。 安装完后&#xff0c;进入bin目录输入以下指令&#xff1a; # 设置账户 setx MINIO_ROOT_USER admin# 设置密码 setx MINIO_ROOT_PASSWORD password# …

高效办公必备!图片转PDF功能,让工作更轻松

在数字化时代&#xff0c;将图片转换为PDF格式是一项非常实用的技能&#xff1b;无论是在工作、学习还是生活中&#xff0c;我们都可能遇到需要将图片转化为PDF格式的情况&#xff1b;今天通过这篇文章给大家分享四款好用的图片转pdf 的工具&#xff1a; 第一款&#xff1a;福…

flutter开发实战-flutter web加载html及HtmlElementView的使用

flutter开发实战-flutter web加载html及HtmlElementView的web控件 HtmlElementView 是 Flutter 中用于嵌入 HTML 内容的 widget。这个 widget 允许你将一个 HTML 元素嵌入到 Flutter 应用中。 一、HtmlElementView基本使用 在工程的pubspec.yaml中引入插件 HtmlElementView…

多波束EM2040D以及POSMV使用记录

多波束EM2040D采集软件SIS4.3升级到SIS5.11之后&#xff0c;我们碰到了很多问题&#xff0c;现在将问题和解决过程记录一下。 1、SIS5软件打不开 SIS5软件打不开&#xff0c;报KSlSMainApp has stopped working弹框。 ​ 判断是电脑问题&#xff0c;更新最新win10系统&#…

ue5 伤害插件

主角或敌人都能用的插件&#xff0c;复用性很高 首先创建以下插件、接口、类型文件 两个枚举中的参数名称&#xff0c;E_DamageResponse区分是各个伤害后的反应&#xff0c;比如不同伤害造成的动画或粒子特效等的不同&#xff0c;E_DamageType是伤害类型&#xff0c;有各种伤害…

【网络安全】空字节绕过:URL回调+XSS+SQL绕WAF

未经许可,不得转载。 文章目录 空字节URL回调XSSSQL空字节 \0,也称为null字节,是一个值为零的特殊字符。在编程中,通常用来表示字符串的结束。攻击者可以利用null字节注入来绕过一些验证或过滤机制。 以下三个漏洞,空字节功不可没。 URL回调 密码重置功能,发起请求后…

【牛站 / USACO2007】

题目 思路 离散化&#xff08;降低空间复杂度&#xff09; 点的编号 ∈ [ 1 , 1000 ] &#xff0c;但是点的个数最多为 2 ⋅ T ∈ [ 4 , 200 ] 点的编号 \in [1, 1000]&#xff0c;但是点的个数最多为 2 \cdot T \in[4, 200] 点的编号∈[1,1000]&#xff0c;但是点的个数最多为…

【NLP】大模型长文本处理技术与GLM-4-Plus评测

本文将介绍Transformer模型在处理长文本数据时所采用的关键技术&#xff0c;特别是旋转位置编码&#xff08;RoPE&#xff09;和Flash Attention机制。 此外&#xff0c;本文介绍GLM系列模型&#xff0c;特别是最新发布的GLM-4-Plus模型。我们将通过实际的评测方法和结果&…

管理学习(一)马云《赢在中国》创业演讲整理

目录 一、小公司也需要制度二、不要害怕冒险三、创业者要的不是技术&#xff0c;而是胆识四、不要惧怕和大企业竞争五、理念不一样&#xff0c;老板永远是对的六、要真实地为客户创造价值七、跟风险投资谈判&#xff0c;说到要做到八、风险投资&#xff0c;只能帮你不能救你九、…

24秋开学考

文件上传 上传一个.php的格式&#xff0c;上面说是非法的文件格式。 2.传了一个phpinfo.gif&#xff0c;说什么在目录里。 3.有两个页面一个labs1一个labs2 &#xff0c;当在第一个页面上传1.jpg&#xff0c;在第二个页面上传1.jpg时&#xff0c;给了我们一个目录,在测试其他时…

[图解]识别类和属性-投资少见效快产量高

1 00:00:00,530 --> 00:00:04,360 接下来&#xff0c;我们就要来识别实体类和属性了 2 00:00:05,670 --> 00:00:07,260 前面也讲了&#xff0c;从哪里识别 3 00:00:08,120 --> 00:00:11,470 从用例规约那里来识别 4 00:00:12,400 --> 00:00:15,770 在识别的时候…