【Proteus仿真】【STM32单片机】大棚远程监测控制

news2025/2/27 1:50:52

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

系统运行后,LCD1604显示传感器检测的环境温湿度、土壤湿度、光照强度、CO2浓度和阈值;可通过上位机远程观察传感器采集的数据显示;可通过K3键进入阈值设置模式,K1和K2调节,K4确定。如果温度高于上限,散热;如果温度低于下限,加热;如果温度正常,关闭;如果湿度高于上限,除湿;如果湿度低于下限,加湿;如果湿度正常,关闭;如果土壤湿度低于下限,加水;如果光照低于下限,补光;如果CO2高于上限,排气;


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/


//系统数据显示
void sys_data_show(void)
{
	static u8 cnt=0;
	while(1)
	{
		if(sys_ctrl.mode==0)
		{
			//DHT11温湿度显示
			lcd1604_show_nums(3,0,sys_ctrl.temp,2,0);
			lcd1604_show_nums(3,1,sys_ctrl.humi,2,0);
			//土壤湿度显示
			lcd1604_show_nums(3,2,sys_ctrl.trhumi,2,0);
			//光照强度显示
			lcd1604_show_nums(13,2,sys_ctrl.light,2,0);
			//CO2浓度显示
			lcd1604_show_nums(4,3,sys_ctrl.co2,2,0);
			
			//温度阈值显示
			lcd1604_show_nums(7,0,sys_ctrl.templ,2,0);
			lcd1604_show_nums(10,0,sys_ctrl.temph,2,0);
			//湿度阈值显示
			lcd1604_show_nums(7,1,sys_ctrl.humil,2,0);
			lcd1604_show_nums(10,1,sys_ctrl.humih,2,0);
			//土壤湿度阈值显示
			lcd1604_show_nums(7,2,sys_ctrl.trhumil,2,0);
			//光照阈值显示
			lcd1604_show_nums(13,3,sys_ctrl.lightl,2,0);
			//CO2阈值显示
			lcd1604_show_nums(8,3,sys_ctrl.co2h,2,0);
			
			//发送数据到远程APP
			cnt++;
			if(cnt%10==0)
			{
				printf("\r\n温度:%d°C,湿度:%d%%\r\n",sys_ctrl.temp,sys_ctrl.humi);
				printf("土壤湿度:%d%%\r\n",sys_ctrl.trhumi);
				printf("光照强度:%d%%\r\n",sys_ctrl.light);
				printf("CO2浓度:%d%%\r\n",sys_ctrl.co2);
			}
		}
		
		//阈值闪烁
		switch(sys_ctrl.mode)
		{
			case 1://温度下
				lcd1604_show_string(7,0,"  ");
				delay_ms(1);
				lcd1604_show_nums(7,0,sys_ctrl.templ,2,0);
				break;
			case 2://温度上
				lcd1604_show_string(10,0,"  ");
				delay_ms(1);
				lcd1604_show_nums(10,0,sys_ctrl.temph,2,0);
				break;
			case 3://湿度下
				lcd1604_show_string(7,1,"  ");
				delay_ms(10);
				lcd1604_show_nums(7,1,sys_ctrl.humil,2,0);
				break;
			case 4://湿度上
				lcd1604_show_string(10,1,"  ");
				delay_ms(1);
				lcd1604_show_nums(10,1,sys_ctrl.humih,2,0);
				break;
			case 5://土壤湿度
				lcd1604_show_string(7,2,"  ");
				delay_ms(1);
				lcd1604_show_nums(7,2,sys_ctrl.trhumil,2,0);
				break;
			case 6://光照
				lcd1604_show_string(13,3,"  ");
				delay_ms(1);
				lcd1604_show_nums(13,3,sys_ctrl.lightl,2,0);
				break;
			case 7://CO2
				lcd1604_show_string(8,3,"  ");
				delay_ms(1);
				lcd1604_show_nums(8,3,sys_ctrl.co2h,2,0);
				break;
		}
		
		break;			
	}
}

//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	key=KEY_Scan(0);
	//模式设置
	if(key==KEY3_PRESS)
	{
		sys_ctrl.mode++;
		if(sys_ctrl.mode>7)sys_ctrl.mode=1;
	}
	//在设置模式下,加
	else if(key==KEY1_PRESS)
	{
		switch(sys_ctrl.mode)
		{
			case 1://温度下
				sys_ctrl.templ++;
				if(sys_ctrl.templ>99)sys_ctrl.templ=0;
				break;
			case 2://温度上
				sys_ctrl.temph++;
				if(sys_ctrl.temph>99)sys_ctrl.temph=0;
				break;
			case 3://湿度下
				sys_ctrl.humil++;
				if(sys_ctrl.humil>99)sys_ctrl.humil=0;
				break;
			case 4://湿度上
				sys_ctrl.humih++;
				if(sys_ctrl.humih>99)sys_ctrl.humih=0;
				break;
			case 5://土壤湿度下
				sys_ctrl.trhumil++;
				if(sys_ctrl.trhumil>99)sys_ctrl.trhumil=0;
				break;
			case 6://光照下
				sys_ctrl.lightl++;
				if(sys_ctrl.lightl>99)sys_ctrl.lightl=0;
				break;
			case 7://CO2上
				sys_ctrl.co2h++;
				if(sys_ctrl.co2h>99)sys_ctrl.co2h=0;
				break;
		}
	}
	//在设置模式下,减
	else if(key==KEY2_PRESS)
	{
		switch(sys_ctrl.mode)
		{
			case 1://温度下
				sys_ctrl.templ--;
				if(sys_ctrl.templ<0)sys_ctrl.templ=99;
				break;
			case 2://温度上
				sys_ctrl.temph--;
				if(sys_ctrl.temph<0)sys_ctrl.temph=99;
				break;
			case 3://湿度下
				sys_ctrl.humil--;
				if(sys_ctrl.humil<0)sys_ctrl.humil=99;
				break;
			case 4://湿度上
				sys_ctrl.humih--;
				if(sys_ctrl.humih<0)sys_ctrl.humih=99;
				break;
			case 5://土壤湿度下
				sys_ctrl.trhumil--;
				if(sys_ctrl.trhumil<0)sys_ctrl.trhumil=99;
				break;
			case 6://光照下
				sys_ctrl.lightl--;
				if(sys_ctrl.lightl<0)sys_ctrl.lightl=99;
				break;
			case 7://CO2上
				sys_ctrl.co2h--;
				if(sys_ctrl.co2h<0)sys_ctrl.co2h=99;
				break;
		}
	}
	//确定
	else if(key==KEY4_PRESS)
	{
		sys_ctrl.mode=0;
	}
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=5;
	sys_parm_init();//系统参数初始化
	DHT11_Init();
	KEY_Init();
	ctrl_pin_init();
	pcf8591_init();
	USART1_Init(9600);
	while(i--)
	{
		//读取DHT11温湿度值
		DHT11_Read_Data(&sys_ctrl.temp,&sys_ctrl.humi);
		//获取土壤湿度
		sys_ctrl.trhumi=pcf8591_read_adcvalue(0);
		sys_ctrl.trhumi=pcf8591_read_adcvalue(0);
		sys_ctrl.trhumi=cal_map(sys_ctrl.trhumi,0,255,0,99);	
		//获取光照强度
		sys_ctrl.light=pcf8591_read_adcvalue(1);
		sys_ctrl.light=pcf8591_read_adcvalue(1);
		sys_ctrl.light=cal_map(sys_ctrl.light,0,255,0,99);
		//获取CO2浓度
		sys_ctrl.co2=pcf8591_read_adcvalue(2);
		sys_ctrl.co2=pcf8591_read_adcvalue(2);
		sys_ctrl.co2=cal_map(sys_ctrl.co2,0,255,0,99);
		delay_ms(100);
	}
	lcd1604_init();//LCD1604初始化
	sys_open_show();//系统初始界面显示

	while(1)
	{
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_data_set();//系统数据设置
		sys_fun_ctrl();//系统功能控制		
	}
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619

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


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

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

相关文章

如何使用大型语言模型LLMs作为历史课程的教学工具?#提示工程技巧

Mixlab从2018就开始分享过一些关于教育的内容&#xff1a; GPT-4等对教育的未来意味着什么&#xff1f;2023-05-05 学习的目的是什么&#xff1f;我喜欢的教育产品应该是这样的 2019-07-08 你是 Infinite Learner 吗&#xff1f;2018-05-27 今天继续教育的话题&#xff0c;我们…

基于微信小程序的超市售货管理平台设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

通过内网穿透,在Windows 10系统下搭建个人《我的世界》服务器公网联机

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …

浅谈电气防火保护器在地下商场的应用 安科瑞 缪阳扬

摘 要&#xff1a;近年来&#xff0c;我国城市发展速度加速。很多城市大力建造地下建筑设施&#xff0c;比如地铁、地下停车场和地下商场等。地下商场属于人员密集型建筑&#xff0c;其防火设计一直令相关的专家头疼。由于人员密集&#xff0c;防火处理不好将酿成灾难性的后果。…

软件定制APP开发步骤分析|小程序

软件定制APP开发步骤分析|小程序 软件定制开发步骤&#xff1a; 1.需求分析&#xff1a; 这是软件定制开发的第一步&#xff0c;也是最关键的一步。在这个阶段&#xff0c;软件开发团队需要与客户进行沟通&#xff0c;了解客户的具体需求和期望。通过讨论和交流&#xff0c;确…

【C++】左值和右值

基本概念左值和右值左值引用和右值引用 右值引用使用场景和意义左值引用的使用场景左值引用的短板右值引用和移动语义编译器优化移动赋值move右值引用引用左值右值引用的其他使用场景 完美转发万能引用forward 模板函数 基本概念 左值和右值 左值 左值&#xff08;lvalue&…

tp5连接多个数据库

一、如果你的主数据库配置文件都在config.php里 直接在config.php中中定义db2&#xff1a; 控制器中打印一下&#xff1a; <?php namespace app\index\controller; use think\Controller; use think\Db; use think\Request; class Index extends Controller {public fun…

DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。

DEM格式转换&#xff1a;转换NSDTF-DEM国标数据格式为通用格式&#xff0c;使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。 *.dem是一种比较常见的DEM数据格式&#xff0c;其有两种文件组织方式&#xff0c;即NSDTF-DEM和USGS-DEM。 &#xff08;1&#xff09;NSDT…

【Linux基础】第26讲 Linux 查找和过滤命令(一)——find命令

find命令是根据文件属性进行查找的&#xff0c;如文件名&#xff0c;文件大小&#xff0c;所有者&#xff0c;所有组&#xff0c;是否为空&#xff0c;访问时间&#xff0c;修改时间等。基本格式&#xff1a; find path [options] 先定位到etc 目录下 cd /etc1.按照文件名查找 …

C-Lodop 在域名下使用跨域问题

Access to script at http://localhost:18000/CLodopfuncs.js?priority0 from origin http://xxxxxx has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space local. 解决&#xff1a; 浏览器输入…

记一次 Java Testcontainers CPU 100% 问题排查过程

以为代码进入了死循环&#xff0c;结果并没有&#xff01; 文章目录 背景与问题排查过程代码路经确认内存分析咨询 okio 社区等等&#xff0c;好像并没有死循环能否从内存快照发现其他问题&#xff1f; 背景与问题 本问题来源于 ShardingSphere issue: Integration tests occa…

使用applescript自动化trilium的数学公式环境

众所周知&#xff0c;trilium什么都好&#xff0c;就是对数学公式的支持以及markdown格式的导入导出功能太拉了&#xff0c;而最拉的时刻当属把这两个功能结合起来的时候&#xff1a;导入markdown文件之后&#xff0c;原来的数学公式全没了&#xff0c;需要一个一个手动用ctrlm…

解密list的底层奥秘

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

AS中部署NCNN

参考链接 http://681314.com/A/Clzr6Q2OBO https://blog.csdn.net/xs1997/article/details/131747372 一、文章背景&#xff1a;公司再进行一个项目时&#xff0c;使用PyTorch框架&#xff0c;python语言及opencv工具进行神经网络深度学习算法进行训练。生成ONNX模型&#xff…

RocketMQ 消费者分类与分组

文章目录 消费者分类PushConsumerPushConsumer 内部原理使用注意事项 SimpleConsumerinvisibleDuration 消息不可见时间 消费者分组&#xff08;消费者负载均衡&#xff09;广播消费和共享消费负载均衡策略多个消费者消费顺序消息多消费者消费顺序消息示例 消费者分组管理关闭自…

八股文死记硬背打脸记

背景 我们都知道&#xff0c;再编程领域数据结构的重要性&#xff0c;常见的数据结构包括 List、Set、Map、Queue、Tree、Graph、Stack 等&#xff0c;其中 List、Set、Map、Queue 可以从广义上统称为集合类数据结构。而Java也提供了很多的集合数据结构以供开发者开箱即用&…

左神高级提升班2 约瑟夫环结构

目录 【案例1】 【题目描述】 【输入描述&#xff1a;】 【输出描述&#xff1a;】 【输入】 【输出】 【思路解析】 【代码实现】 【案例1】 【题目描述】 某公司招聘&#xff0c;有n个人入围&#xff0c;HR在黑板上依次写下m个正整数A1、A2、……、Am&#xff0c;然后…

alist windows桌面版下载安装

官网 Desktop | AList Docs 点击下载windows版本 安装 双击exe 修改安装路径 太可惜了&#xff0c;需要收费

LeetCode刷题---Add Two Numbers(一)

文章目录 &#x1f352;题目&#x1f352;解法一 迭代&#x1f352;解法二 递归&#x1f352;递归小案例&#x1f352;迭代 VS 递归 &#x1f352;题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只…

聚观早报 | 飞书签约韵达速递;蔚来首颗自研芯片“杨戬”量产

【聚观365】9月22日消息 飞书签约韵达速递 蔚来首颗自研芯片“杨戬”10月量产 靳玉志接任华为车 BU CEO 亚马逊发布全新Alexa语音助手 OpenAI推出图像生成器DALL-E 3 飞书签约韵达速递 近日&#xff0c;国内物流服务公司韵达快递宣布全员上飞书。飞书解决方案副总裁何斌表…