基于物联网的智能植物养护系统的设计与实现

基于物联网的智能植物养护系统的设计与实现

系统简介

        由于大多数人喜欢花草却不会照料,买了花草之后却没有时间照顾,从而导致花草枯萎。本设计利用wifi传输设定植物的适当光照强度,适当的土壤温湿度。然后根据温湿度传感器及光照传感进行实时监测。当温度,湿度高于适当温湿度时,采取措施降低温湿度。当温度,湿度低于适当温度时,采取措施升高温湿度。当光照太强时,适当遮挡,降低光照强度;当光照强度太弱时,开灯增强光照强度。总之给植物一个适宜的生长环境。

材料

  • 正点原子战舰V3开发板
  • 连接到电脑的T口线
  • DHT11温湿度模块
  • 整点原子3.4寸TFT显示屏

展示视频

基于物联网的智能植物养护系统下位机演示视频

基于物联网的智能植物养护系统上位机演示视频

制作

        下位机使用的芯片是STM32F103ZET6,软件使用的是Keil,语言是C。
        上位机软件用的是VS2017,语言是C#。
        硬件连接:插上战舰板子就行了。

下位机制作

led灯会根据光照传感器检测光强自动调节亮度;
还有一个IO口我也用pwm做好了,连接上马达,就可以根据温度自动调整转速;
目前没有湿度补充,我打的是风扇转速的数据;

主函数

 int main(void){	 u8 Light ;u16 led0pwmval=0;u8 dir=1;	vu8 key=0;int i;u8 t=0;		u16 len;		 u8 temperature;  	    u8 humidity;    	   u16 temp_sup=25,humi_sup=35,light_sup=0;KEY_Init();delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);	 	//串口初始化为115200LED_Init();		  		//初始化与LED连接的硬件接口TIM4_PWM_Init(899,0);TIM3_PWM_Init(899,0);LCD_Init();			   	//初始化LCD  Lsens_Init();POINT_COLOR=RED;		//设置字体为红色 display0();while(DHT11_Init())	//DHT11初始化	{LCD_ShowString(30,100,200,16,16,"DHT11 Error");delay_ms(200);LCD_Fill(30,130,239,130+16,WHITE);delay_ms(200);}			POINT_COLOR=BLUE;//设置字体为蓝色display1(); display2();while(1){	  POINT_COLOR=RED; 	    Light=Lsens_Get_Val();LCD_ShowxNum(35,130,Light,2,24,0);				//显示ADC的值 t++;if(t%10==0)			//每100ms读取一次{									  DHT11_Read_Data(&temperature, &humidity);	//读取温湿度值LCD_ShowNum(100,130,temperature,2,24);		//显示温度LCD_ShowNum(165,130,humidity,2,24);			//显示湿度LCD_ShowNum(120,190,light_sup,4,16);		//显示湿度LCD_ShowNum(120,230,humi_sup,4,16);			//显示湿度LCD_ShowNum(120,270,temp_sup,4,16);			//显示湿度POINT_COLOR=BLUE;printf("温度%2d",temperature);delay_ms(10);printf("湿度%2d",humidity);delay_ms(10);printf("光强%2d",Light);delay_ms(10);}USART_SendData(USART1, temperature*16);light_sup = 300-(Light*3);humi_sup = temp_sup = (temperature-24)*60;TIM_SetCompare1(TIM4,humi_sup);TIM_SetCompare2(TIM3,light_sup);}
}

显示函数

void display2()
{LCD_ShowChinese(90,110,0,16,1);		 	//温度:LCD_ShowChinese(108,110,2,16,1);	LCD_ShowChinese(126,110,12,16,1);LCD_ShowChinese(155,110,1,16,1);		//湿度:LCD_ShowChinese(173,110,2,16,1);		LCD_ShowChinese(191,110,12,16,1);LCD_ShowChinese(30,110,13,16,1);		//光强LCD_ShowChinese(48,110,14,16,1);LCD_ShowChinese(66,110,12,16,1);LCD_ShowString(126,137,200,16,16,"C");LCD_ShowString(191,137,200,16,16,"%");LCD_ShowString(60,137,200,16,16,"cd");
}

上位机制作

数据可以同下位机实时更新;
用的是串口1,有线,蓝牙还没有回来;
产生的折线图只有温度的;
折线图快捷键可以使用。**

主窗口函数

namespace Drawer
{public delegate void ShowWindow();public delegate void HideWindow();public delegate void OpenPort();public delegate void ClosePort();public delegate Point GetMainPos();public delegate int GetMainWidth();public partial class Form1 : Form{Drawer Displayer;public Form1(){InitializeComponent();System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;serialPort1.Encoding = Encoding.GetEncoding("GB2312");                                  //串口接收编码this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(Form1_FormClosing);}private void Form1_FormClosing(object sender, EventArgs e){try { serialPort1.Close(); }catch { }}public void ClosePort()//关闭串口,供委托调用{try{serialPort1.Close();}catch (System.Exception){}}private Point GetMyPos()//供委托调用{return this.Location;}public void OpenPort()//打开串口,供委托调用{try{serialPort1.Open();}catch (System.Exception){MessageBox.Show("串口打开失败,请检查", "错误");}}public void ShowMe()//供委托调用{this.Show();}public void HideMe()//供委托调用{this.Hide();}private void Form1_Load(object sender, EventArgs e){for (int i = 0; i < 20; i++){try{serialPort1.PortName = "COM" + i;serialPort1.Open();toolStripComboBox1.Items.Add(serialPort1.PortName);serialPort1.Close();if (toolStripComboBox1.Text == "")toolStripComboBox1.Text = serialPort1.PortName;}catch { }timer1.Start();}}private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){try{textBox7.Text = serialPort1.ReadExisting();byte[] data = new byte[serialPort1.BytesToRead];  //定义缓冲区,因为串口事件触发时有可能收到不止一个字节serialPort1.Read(data, 0, data.Length);if (Displayer != null)                            //Displayer就是波形绘制窗口的一个对象  就是那个窗口Displayer.AddData(data);if (textBox7.Text.Contains("温度"))textBox1.Text = textBox7.Text.Substring(2, 2);else if (textBox7.Text.Contains("湿度"))textBox2.Text = textBox7.Text.Substring(2, 2);else if (textBox7.Text.Contains("光强"))textBox3.Text = textBox7.Text.Substring(2, 2);//foreach (byte Member in data)                                                   //遍历用法//{//    string str = Convert.ToString(Member, 16).ToUpper();//    textBox8.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//}textBox4.Text = (300 - (Convert.ToInt16(textBox3.Text) * 3)).ToString();textBox5.Text = textBox6.Text = ((Convert.ToInt16(textBox1.Text) - 24) * 60).ToString();}catch { }}private void CreateNewDrawer()//创建ADC绘制窗口{Displayer = new Drawer();//创建新对象Displayer.ShowMainWindow = new ShowWindow(ShowMe);//初始化类成员委托Displayer.HideMainWindow = new HideWindow(HideMe);Displayer.GetMainPos = new GetMainPos(GetMyPos);Displayer.CloseSerialPort = new ClosePort(ClosePort);Displayer.OpenSerialPort = new OpenPort(OpenPort);Displayer.GetMainWidth = new GetMainWidth(GetMyWidth);Displayer.Show();//显示窗口}int GetMyWidth()//供委托调用{return this.Width;}private void CreateDisplayer(){this.Left = 0;CreateNewDrawer();Rectangle Rect = Screen.GetWorkingArea(this);Displayer.SetWindow(Rect.Width - this.Width, new Point(this.Width, this.Top));//设置绘制窗口宽度,以及坐标}private void timer1_Tick(object sender, EventArgs e){label1.Text = DateTime.Now.ToString();}private void 打开串口ToolStripMenuItem_Click(object sender, EventArgs e){if (打开串口ToolStripMenuItem.Text == "打开串口"){try{serialPort1.PortName = toolStripComboBox1.Text;serialPort1.Open();打开串口ToolStripMenuItem.Text = "关闭串口";}catch{MessageBox.Show("端口错误!请检查端口,或重启软件!", "错误!");}}else{serialPort1.Close();打开串口ToolStripMenuItem.Text = "打开串口";}}private void 变化曲线ToolStripMenuItem_Click(object sender, EventArgs e){if (serialPort1.IsOpen){if (Displayer == null)//第一次创建Displayer = null{CreateDisplayer();}else{if (Displayer.IsDisposed)//多次创建通过判断IsDisposed确定串口是否已关闭,避免多次创建{CreateDisplayer();}}}elseMessageBox.Show("请打开串口!", "。。。是不是没打开串口!");}}
}

总结

项目本身功能简单,但是包含内容还是挺多的,扩展的话也比较容易。

项目地址:https://download.csdn.net/download/weixin_42320020/88779084

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

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

相关文章

文件备份管理软件系统

1、我解决的问题 避免因为硬盘故障&#xff0c;导致数据丢失; 避免因为中了病毒&#xff0c;文件被加密&#xff0c;无法取回; 避免了员工恶意删除文件; 规范企业内部的文件管理&#xff0c;使它井井有条; 防范于未然&#xff0c;不必再为可能的风险担忧; 2、我的优点 我支持定…

第二篇【传奇开心果系列】beeware的toga开发移动应用示例:手机应用视频播放器

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列 博文目录一、项目目标二、编程思路三、初步实现项目目标示例代码四、第一次扩展示例代码五、第二次扩展示例代码六、第三次扩展示例代码七、第四次扩展示例代码八、第五次扩展示例代码九、第六次扩展示例代码…

1.19号网络

超时检测 概念 1> 在网络通信中&#xff0c;有很多函数是阻塞函数&#xff0c;会导致进程的阻塞&#xff0c;例如&#xff1a;accept、recv、recvfrom、等等 2> 为了避免进程在阻塞函数处&#xff0c;无休止的等待&#xff0c;我们可以设置一个超时时间&#xff0c;当…

详细分析MybatisPlus中的Page类(附实战)

目录 前言1. 基本知识2. 常用方法3. 实战 前言 由于工作中经常使用到MybatisPlus的框架&#xff0c;对此详细连接Page类有利于开发&#xff0c;更加游刃有余 对于该类的源码&#xff1a;baomidou / mybatis-plus 中的Page源码 MybatisPlus的框架&#xff1a;MyBatis-plus从入…

【操作系统基础】【CPU访存原理】:寄存 缓存 内存 外存、内存空间分区、虚拟地址转换、虚拟地址的映射

存储器怎么存储数据、内存空间分区、虚拟地址转换 计算机的存储器&#xff1a;寄存 缓存 内存 外存&#xff08;按功能划分&#xff09; 计算机的处理器需要一个存储器来存储大量的指令和数据以便自己不断取指执行和访问数据。 内存&#xff08;内存就是运行内存&#xff0c…

java web 校园健康管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web校园健康管理系统是一套完善的java web信息管理系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

【AI】深度学习与图像描述生成——看图说话(2)

目录 一、计算机视觉 应用场景 重要意义 二、自然语言处理 应用场景 重要意义 三、二者的联系与结合 联系 结合场景 重要意义 四、图像描述处理&#xff08;生成&#xff09; 关键技术 发展历程 五、一些补充 计算机视觉和自然语言处理是人工智能领域的两大重要分…

查询列表实时按照更新时间降序排列 没有更新时间就按创建时间

例子: sql两个字段排序 ORDER BY update_time DESC , create_time DESC <select id"selectLawIllegalActivitiesList" parameterType"LawIllegalActivities" resultMap"LawIllegalActivitiesResult"><include refid"selectL…

252.【2023年华为OD机试真题(C卷)】局域网中的服务器个数(优先搜索(DFS)-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-局域网中的服务器个数二.解题思路三.题解代码P…

04.Elasticsearch应用(四)

Elasticsearch应用&#xff08;四&#xff09; 1.目标 这一章主要解读以下索引 2.什么是索引 索引是文档的容器&#xff0c;是一类文档的结合索引是一个逻辑命名空间&#xff0c;它映射到一个或多个主分片&#xff0c;并且可以具有零个或多个副本分片索引中数据分散在Shard…

宠物空气净化器怎么挑选?猫用空气净化器品牌性比价推荐

作为一个养猫家庭的主人&#xff0c;每天都要面对一个挑战——清理猫砂盆。那种难以形容的气味实在让人受不了。尤其是家里有小孩和老人&#xff0c;他们偶尔可能会出现过敏性鼻炎等问题&#xff0c;而抵抗力较差的人更容易受到影响。此外&#xff0c;一到换毛季节&#xff0c;…

【基础算法练习】二分模板

文章目录 二分模板题二分的思想C 版本的二分整数二分模板 Golang 版本的二分整数二分模板 例题&#xff1a;在排序数组中查找元素的第一个和最后一个位置题目描述C 版本代码Golang 版本代码 二分模板题 704. 二分查找&#xff0c;这道题目是最经典的二分查找&#xff0c;使用于…

Spring依赖注入之setter注入与构造器注入以及applicationContext.xml配置文件特殊值处理

依赖注入之setter注入 在管理bean对象的组件的时候同时给他赋值&#xff0c;就是setter注入&#xff0c;通过setter注入&#xff0c;可以将某些依赖项标记为可选的&#xff0c;因为它们不是在构造对象时立即需要的。这种方式可以减少构造函数的参数数量&#xff0c;使得类的构…

天津大数据培训班推荐,数据分析过程的常见错误

大数据”是近年来IT行业的热词&#xff0c;目前已经广泛应用在各个行业。大数据&#xff0c;又称海量信息&#xff0c;特点是数据量大、种类多、实时性强、数据蕴藏的价值大。大数据是对大量、动态、能持续的数据&#xff0c;通过运用分析、挖掘和整理&#xff0c;实现数据信息…

【dpdk】Getting Started Guide for Linux DPDK

Getting Started Guide for Linux — Data Plane Development Kit 23.11.0 documentation (dpdk.org) DPDK官网 文章目录 1.dpdk build with isa-l2.System Requirements3.Running DPDK Applications3.1. dpdk-hugepages Application3.1.1. Running the Application3.1.2. Opt…

生产力工具|卸载并重装Anaconda3

一、Anaconda3卸载 &#xff08;一&#xff09;官方方案一&#xff08;Uninstall-Anaconda3-不能删除配置文件&#xff09; 官方推荐的方案是两种&#xff0c;一种是直接在Anaconda的安装路径下&#xff0c;双击&#xff1a; &#xff08;可以在搜索栏或者使用everything里面搜…

Python 列表定义与一些常用属性和方法

一、定义&#xff1a; 列表是一种有序、可变的容器&#xff0c;可以包含任意类型的元素。定义一个列表使用的是方括号&#xff08;[]&#xff09;&#xff0c;列表中的元素之间用逗号分隔。 以下是几种常见的列表定义方式&#xff1a; 空列表&#xff1a; my_list []包含元素…

Windows10上通过MSYS2编译FFmpeg 6.1.1源码操作步骤

1.从github上clone代码&#xff0c;并切换到n6.1.1版本&#xff1a;clone到D:\DownLoad目录下 git clone https://github.com/FFmpeg/FFmpeg.git git checkout n6.1.1 2.安装MSYS2并编译FFmpeg源码: (1).从https://www.msys2.org/ 下载msys2-x86_64-20240113.exe &#…

超优秀的三维模型轻量化、格式转换、可视化部署平台!

1、基于 HTML5 和 WebGL 技术&#xff0c;可在主流浏览器上进行快速浏览和调试&#xff0c;支持PC端和移动端 2、自主研发 AMRT 展示框架和9大核心技术&#xff0c;支持3D模型全网多端流畅展示与交互 3、提供格式转换、减面展UV、烘焙等多项单模型和倾斜摄影模型轻量化服务 4、…

Java实现对系统CPU、内存占用率的控制

背景&#xff1a;由于使用的业主的云资源&#xff0c;由于使用率低&#xff0c;会不持续的缩减服务器配置。为了避免后续由于新业务上线&#xff0c;需要更多资源的时候&#xff0c;无法再次获得资源&#xff08;回收容易&#xff0c;申请难&#xff09;。 问题&#xff1a;怎…