基于STM32的农业大棚温湿度采集控制系统的设计

目录

1、设计要求

2、系统功能

3、演示视频和实物

4、系统设计框图

5、软件设计流程图

6、原理图

7、主程序

8、总结


 🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智能教室。

设备的详细功能见网盘中的文章《8、基于STM32的大棚温湿度》:

链接:https://pan.baidu.com/s/1uWSZX2zbZwy9sYwwnvyktQ?pwd=5132

提取码:5132

 农业大棚是设施农业的重要组成部分,大棚测控系统是实现大棚自动化、科学化的基本保证。通过对监测数据的分析,结合作物生长规律,控制环境条件,使作物达到优质、高产、高效的栽培目的。计算机应用技术的发展,也使得用计算机控制的方面也涉及到各个领域,其中在大棚内用单片机控制温度、湿度是应用于实践的主要方面之一。

1、设计要求

本设计选用STM32F103C8T6芯片为核心,通过DHT11检测模块、光敏传感器、土壤湿度传感器输出模块、按键模块和显示模块等,完成一种大棚温湿度监控系统的设计。通过编写相应的程序实现按键控制温湿度的设定,DHT11温湿度传感器检测温湿度的变化并在OLED模块显示测量温湿度数据和设置参数值,最后通过STM32单片机控制风扇和发热片输出实现温湿度的调节。

3、演示视频和实物

D27-基于STM32的大棚温湿度监控系统设计

4、系统设计框图

5、软件设计流程图

大棚温湿度监测系统设计的主程序主要是对相关硬件环境初始化,只有在系统硬件环境初始化成功后,系统才能够正常的工作。初始化过程涵盖了多个方面主要包括外部中断初始化、采集模块初始化、输入模块初始化、输出模块初始化和显示模块初始化,程序完成初始化后,单片机采集到原始ADC数据后,将原始ADC数据经过比例运算得到当前的真实值;然后将当前真实值显示在OLED屏幕上;显示完成后单片机会将当前真实值与设置的阈值进行比较,如果超出了当前设置的阈值,单片机将控制执行对应的输出设备。

6、原理图

 

7、主程序

 下面这个主程序,主要是设计的逻辑控制。

#include "stm32f10x.h" // 有问题和需求的,可以联系VX:lwfw123456789
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "delay.h"
#include "OLED.h"
#include "Key.h"
#include "OLED.h"
#include "Serial.h"
#include "led.h"
#include "Buzzer.h"
#include "MyRTC.h"
#include "dht11.h"
#include "AD.h"uint8_t KeyNum;        //存储按键值
uint8_t RxData;        //蓝牙接收到的数据
u8 temp, humi;
uint32_t bufe[5];
uint16_t AD0, AD1, AD2, AD3;       //存储ADC的值
u8 state1 = 1;          //设备开关
u8 state2 = 0;         //模式选择
u8 state3 = 0;         //阈值切换
u8 state4 = 0;         //阈值切换
u8 state5 = 0;         //阈值切换u8 t = 0;              //温湿度读取值的间隔
short temperature;     //存储DS18B20的温度值
u8 flag1;              //清屏用到的标志,为了使OLED_Clear();执行一次
u8 flag2;              //menu1()中为了使显示的提示信息执行一次
u8 flag3;  
u8 flag4;  
u8 flag5;  
u8 flag6;  
u8 wenyu = 23, shiyu = 65, guangyu = 50, tuyu = 50;void ctrlue()
{if(state1==0&&state3 == 0 )	{if(bufe[1]>shiyu)  //湿度大于设定阈值开风扇{		      LED4=0;}else{LED4=1;}if(bufe[0]<wenyu )   //温度小于阈值开加热,关闭粉丝{LED3=1; LED4=0;}else{LED3=0; LED4=1;}    }    
}void shoudong()
{
if(state1==0&&state3 == 1 )	
{if (KeyNum == 4)          //一键控制多媒体   PB10{delay_ms(20);if (KeyNum == 4){state4++;if (state4 > 1){state4 = 0;}}}if (state4 == 0){LED3 = 1;           //开启指示灯      }if (state4 == 1){LED3 = 0;            //关闭设备指示灯      }if (KeyNum == 5)          //一键控制多媒体   PB10{delay_ms(20);if (KeyNum == 5){state5++;if (state5 > 1){state5 = 0;}}}if (state5 == 0){LED4 = 1;           //开启指示灯      }if (state5 == 1){LED4 = 0;            //关闭设备指示灯}
}}void menu0()       //显示题目
{if (flag3 == 0) {OLED_ShowString(1, 1, "XX/XX");        //第一行显示时间OLED_ShowString(1, 12, "XX:XX");flag3 = 1;}//    OLED_ShowNum(1, 6, MyRTC_Time[0], 4);    //年OLED_ShowNum(1, 1, MyRTC_Time[1], 2);   //月OLED_ShowNum(1, 4, MyRTC_Time[2], 2);   //日OLED_ShowNum(1, 12, MyRTC_Time[3], 2);    //时OLED_ShowNum(1, 15, MyRTC_Time[4], 2);    //分
//      OLED_ShowNum(2, 12, MyRTC_Time[5], 2);   //秒OLED_ShowChinese(3, 3, 73);    //显示题目OLED_ShowChinese(3, 4, 74);OLED_ShowChinese(3, 5, 75);OLED_ShowChinese(3, 6, 76);OLED_ShowChinese(4, 1, 77);    //显示题目OLED_ShowChinese(4, 2, 78);OLED_ShowChinese(4, 3, 79);OLED_ShowChinese(4, 4, 80);OLED_ShowChinese(4, 5, 81);OLED_ShowChinese(4, 6, 84);OLED_ShowChinese(4, 7, 85);}void menu1()          //核心页面,用来显示传感器参数和逻辑判断
{if (flag4 == 0) {OLED_ShowString(1, 1, "XX/XX");        //第一行显示时间OLED_ShowString(1, 12, "XX:XX");flag4 = 1;}
//    OLED_ShowNum(1, 6, MyRTC_Time[0], 4);    //年OLED_ShowNum(1, 1, MyRTC_Time[1], 2);   //月OLED_ShowNum(1, 4, MyRTC_Time[2], 2);   //日OLED_ShowNum(1, 12, MyRTC_Time[3], 2);    //时OLED_ShowNum(1, 15, MyRTC_Time[4], 2);    //分
//      OLED_ShowNum(2, 12, MyRTC_Time[5], 2);   //秒if (flag2 == 0)      //里面的代码执行一次{flag2 = 1;OLED_ShowChinese(2, 1, 2); //温湿度OLED_ShowChinese(2, 2, 4);OLED_ShowString(2, 5, ":");OLED_ShowChinese(2, 5, 3);OLED_ShowChinese(2, 6, 4);OLED_ShowString(2, 13, ":");OLED_ShowChinese(3, 1, 51); //土壤湿度OLED_ShowChinese(3, 2, 52);OLED_ShowChinese(3, 3, 37);OLED_ShowChinese(3, 4, 38);OLED_ShowString(3, 9, ":");OLED_ShowChinese(4, 1, 16); //光照强度OLED_ShowChinese(4, 2, 17);OLED_ShowChinese(4, 3, 37);OLED_ShowChinese(4, 4, 38);OLED_ShowString(4, 9, ":");}//******************************传感器数据采集****************************************************//if (t % 10 == 0){DHT11_Read_Data(&temp, &humi);  //读取温湿度并显示在OLED上bufe[0] = temp;bufe[1] = humi;OLED_ShowNum(2, 6, bufe[0], 2);OLED_ShowString(2, 8, "%");OLED_ShowNum(2, 14, bufe[1], 2);OLED_ShowString(2, 16, "%");}t++;AD0 = AD_GetValue(ADC_Channel_0);    //土壤湿度传感器if (AD0 > 4000)AD0 = 4000;bufe[2] = (u8)(AD0 / 40);OLED_ShowNum(3, 10, bufe[2], 2);OLED_ShowString(3, 12, "%");AD1 = AD_GetValue(ADC_Channel_1);    //光照强度传感器if (AD1 > 4000)AD1 = 4000;bufe[3] = (u8)(100-AD1 / 40);OLED_ShowNum(4, 10, bufe[3], 2);OLED_ShowString(4, 12, "%");//******************************设备开关****************************************************//if (KeyNum == 1)          //一键控制多媒体   PB10{state4=0;state5=0;delay_ms(20);if (KeyNum == 1){state1++;if (state1 > 1){state1 = 0;}}}if (state1 == 0){LED2 = 0;           //开启指示灯 }if (state1 == 1){LED2 = 1;            //关闭设备指示灯	Buzzer_OFF();		LED3 = 1;LED4 = 1;					}
//**************************************模式切换*****************************************************//if (KeyNum == 3 & state1 == 0) //一键控制自动或者手动   PB11{flag6 = 0; flag5 = 0;state4=0;state5=0;delay_ms(20);if (KeyNum == 3){state3++;if (state3 > 1){state3 = 0;}}}if (state3 == 0 ){ctrlue();   // 开OLED_ShowChinese(4, 8, 30);if (flag5 == 0) {LED3 = 1;LED4 = 1;flag5 = 1;}}if (state3 == 1 ){shoudong();   // 开OLED_ShowChinese(4, 8, 29);if (flag6 == 0) //目的就是使OLED_Clear();执行一次{LED3 = 1;LED4 = 1;flag6 = 1;}}
}void menu2()       //阈值控制
{OLED_ShowChinese(1, 3, 86);OLED_ShowChinese(1, 4, 87);OLED_ShowChinese(1, 5, 88);OLED_ShowChinese(1, 6, 89);OLED_ShowChinese(2, 1, 2); //温湿度OLED_ShowChinese(2, 2, 4);OLED_ShowString(2, 5, ":");OLED_ShowChinese(2, 5, 3);OLED_ShowChinese(2, 6, 4);OLED_ShowString(2, 13, ":");OLED_ShowChinese(3, 1, 51); //土壤湿度OLED_ShowChinese(3, 2, 52);OLED_ShowChinese(3, 3, 37);OLED_ShowChinese(3, 4, 38);OLED_ShowString(3, 9, ":");OLED_ShowChinese(4, 1, 16); //光照强度OLED_ShowChinese(4, 2, 17);OLED_ShowChinese(4, 3, 37);OLED_ShowChinese(4, 4, 38);OLED_ShowString(4, 9, ":");if (KeyNum == 3)          //{delay_ms(20);if (KeyNum == 3){state3++;if (state3 > 4){state3 = 0;}}}if (state3 == 0){if (KeyNum == 4)   wenyu++;if (KeyNum == 5)  wenyu--;}OLED_ShowNum(2, 6, wenyu, 2);if (state3 == 1){if (KeyNum == 4)   shiyu++;if (KeyNum == 5)  shiyu--;}OLED_ShowNum(2, 14, shiyu, 2);if (state3 == 2){if (KeyNum == 4)   tuyu++;if (KeyNum == 5)  tuyu--;}OLED_ShowNum(3, 10, tuyu, 2);if (state3 == 3){if (KeyNum == 4)   guangyu++;if (KeyNum == 5)  guangyu--;}OLED_ShowNum(4, 10, guangyu, 2);
}
int main(void)     //主函数
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级delay_init();      //延时函数初始化SystemInit();Key_Init();      //按键初始化LED_Init();OLED_Init();Buzzer_Init();Serial_Init();   //串口1初始化MyRTC_Init();DHT11_Init();AD_Init();while (1){MyRTC_ReadTime();    //读取时间(每一个页面都有时间显示)KeyNum = Key_GetNum();               //按键检查//*********************页面切换*****************************************************if (KeyNum == 2)    //页面切换PB1{flag1 = 0;flag3 = 0;flag4 = 0;delay_ms(20);if (KeyNum == 2){state2++;if (state2 > 2)    //3个页面{state2 = 0;}}}if (state2 == 0)           //初始页面   显示题目“智能大棚温湿度采集“{if (flag1 == 0) //目的就是使OLED_Clear();执行一次{OLED_Clear();flag1 = 1;}menu0();}else if (state2 == 1)      //第一页面{if (flag1 == 0){OLED_Clear();flag1 = 1;}menu1();}else if (state2 == 2)        //等二页面    阈值控制{flag2 = 0;if (flag1 == 0){OLED_Clear();flag1 = 1;flag2 = 1;}menu2();}}
}

8、总结

基于STM32的温湿度监控系统是将STM32单片机作为主控制器的,外接OLED显示模块、DHT11数字温湿度传感器、按键电路和输出模块,共同构成了大棚温湿度监控系统的硬件。

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

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

相关文章

“机器说人话”-AI 时代的物联网

万物互联的物联网愿景已经提了许多年了&#xff0c;但是实际效果并不理想&#xff0c;除了某些厂商自己的产品生态中的产品实现了互联之外&#xff0c;就连手机控制空调&#xff0c;电视机和调光灯都没有实现。感觉小米做的好一点&#xff0c;而华为的鸿蒙的全场景&#xff0c;…

C#+layui+echarts实现动态生成折线图

概要 C#layuiecharts实现动态生成折线图 整体架构流程 后端是c#语言编写的业务流程,前端是layui和echarts 技术细节 1.先看echarts折线图需要什么样子的数据,在想后端怎么处理 2.后端代码 List<ValveTempData> list new List<ValveTempData>(); string …

Docker容器逃逸漏洞-CVE-2024-21626

Snyk 在 Docker 引擎以及其他容器化技术(例如 Kubernetes)使用的 runc <=1.1.11 的所有版本中发现了一个漏洞。利用此问题可能会导致容器逃逸到底层主机操作系统,无论是通过执行恶意映像还是使用恶意 Dockerfile 或上游映像构建映像(即使用时FROM) CVE-2024-21626原理…

生成式人工智能之路,从马尔可夫链到生成对抗网络

人工智能&#xff08;Artificial intelligence&#xff0c;AI&#xff09;技术在过去几年中取得了显著进展&#xff0c;其中生成式AI&#xff08;Generative AI&#xff09;因其强大的内容生成能力而备受关注。生成式AI可以创建新的文本、图像、音频、视频、代码以及其他形式的…

SSRF学习笔记

1.NAT学习 Nat&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是 一种网络通信技术主要用于将私有网络中的内部IP地址转换成公共网络中的公共IP地址&#xff0c;以实现局域网内部设备访问互联网的功能。具体来说&#xff0c;Nat有以下几个主要…

Matlab画不同指标的对比图

目录 一、指标名字可修改 二、模型名字可修改 三、输入数据可修改 软件用的是Matlab R2024a。 clear,clc,close all figure1figure(1); % set(figure1,Position,[300,100,800,600],Color,[1 1 1]) axes1 axes(Parent,figure1);%% Initialize data points 一、指标名字可修…

MongoDB 学习笔记

一、简介 1、MongoDB 是什么 MongoDB 是一个基于分布式文件存储的数据库&#xff0c;官方地址 https://www.mongodb.com/ 2、数据看是什么 数据库&#xff08;DataBase&#xff09;是按照数据结构来组织、存储和管理数据的应用程序。 3、数据库的作用 主要作用是 管理数据…

mybatis中的缓存(一级缓存、二级缓存)

文章目录 前言一、MyBatis 缓存概述二、一级缓存1_初识一级缓存2_一级缓存命中原则1_StatementId相同2_查询参数相同3_分页参数相同4_sql 语句5_环境 3_一级缓存的生命周期1_缓存的产生2_缓存的销毁3_网传的一些谣言 4_一级缓存核心源码5_总结 三、二级缓存1_开启二级缓存2_二级…

基于Hutool实现自定义模板引擎,实现json个性化模板引擎转换

文章目录 前言编写引擎类&#xff1a;JsonTemplateEngine编写模板类&#xff1a;CustomTemplate编写测试代码测试json文件测试类 前言 由于百度搜索json模板引擎&#xff0c;推荐的都是一些freemarker之类的&#xff0c;需要引入其他的依赖&#xff0c;而且在编写json模板的时…

学习在测试时学习(Learning at Test Time)_ 具有表达性隐藏状态的循环神经网络(RNNs)

摘要 https://arxiv.org/pdf/2407.04620 自注意力机制在长文本语境中表现良好&#xff0c;但其复杂度为二次方。现有的循环神经网络&#xff08;RNN&#xff09;层具有线性复杂度&#xff0c;但其在长文本语境中的性能受到隐藏状态表达能力的限制。我们提出了一种新的序列建模…

LabVIEW多线圈电磁式振动发电机测试

开发了一种基于LabVIEW设计的多线圈电磁式振动发电机测试系统。系统通过高效的数据采集、波峰检测及相位差计算&#xff0c;优化了传统振动发电机的测试流程&#xff0c;提升了电压波形分析的精度和效率&#xff0c;具有较好的应用前景和推广价值。 项目背景 随着可再生能源技…

遇到not allow unquoted fieldName怎么办

前言 Exception in thread "main" com.alibaba.fastjson2.JSONException: not allow unquoted fieldName, offset 2, character , line 1, column 3, fastjson-version 2.0.25 { "data":null, "code":200, "msg":"成功"…

LIS系统源码,实验室管理信息系统LIS,.Net C#语言开发,支持DB2,Oracle,MS SQLServer等主流数据库

实验室管理信息系统LIS源码&#xff0c;采用.Net C#语言开发&#xff0c;C/S架构。支持DB2&#xff0c;Oracle&#xff0c;MS SQLServer等主流数据库。&#xff08;LIS系统全套商业源码&#xff0c;自主版权&#xff0c;多家大型综合医院应用案例&#xff0c;适合二次开发&…

Golang | Leetcode Golang题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; // 判断是否为完全平方数 func isPerfectSquare(x int) bool {y : int(math.Sqrt(float64(x)))return y*y x }// 判断是否能表示为 4^k*(8m7) func checkAnswer4(x int) bool {for x%4 0 {x / 4}return x%8 7 }func numSquares(n int) i…

四、GD32 MCU 常见外设介绍 (6) ADC 模块介绍

6.1.ADC 基础知识 12 位逐次逼近式模数转换器模块&#xff08;ADC&#xff09;&#xff0c;可以采样来自于外部输入通道、内部输入通道的模拟信号&#xff0c;采样转换后&#xff0c;转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。 6.2.GD…

elasticsearch-7.3.1安装注意事项

elasticsearch-7.3.1安装注意事项 一、背景二、步骤1、查看原ES版本2、新环境服务器2.1、是否有elasticsearch2.2、安装elasticsearch2.3、配置参数2.4、启动elasticsearch2.5、设置密码 三、报错-问题总结1、jdk不适用2、bootstrap checks failed3、Address already in use4、…

vue3前端开发-小兔鲜项目-图片切换效果和动态class

vue3前端开发-小兔鲜项目-图片切换效果和动态class!这次实现的效果是&#xff0c;图片预览效果&#xff0c;根据小图片&#xff0c;来实时改变大图&#xff08;预览&#xff09;的效果。同时让动态的特征class也跟着显示出来。 <script setup> import {ref} from vue // …

Linux 各目录

Linux 是一个非常严谨的操作系统&#xff0c;每个目录都有自己的作用&#xff0c;这些作用是固定的&#xff0c;没有特殊情况&#xff0c;应严格执行&#xff1b; Linux 中所有东西以文件形式存储和管理&#xff0c;命令也不例外&#xff1b; 以下四个 bin 是二进制文件&…

freesql简单使用操作mysql数据库

参考&#xff1a;freesql中文官网指南 | FreeSql 官方文档 这两天准备做一个测试程序&#xff0c;往一个系统的数据表插入一批模拟设备数据&#xff0c;然后还要模拟设备终端发送数据包&#xff0c;看看系统的承压能力。 因为系统使用的第三方框架中用到了freesql&#xff0c…

数据库的事务隔离级别有哪些?

并行事务会引发什么问题&#xff1f; 同时处理多个事务的时候&#xff0c;就可能出现脏读&#xff08;dirty read&#xff09;、不可重复读&#xff08;non-repeatable read&#xff09;、幻读&#xff08;phantom read&#xff09;的问题。脏读: 如果一个事务「读到」了另一个…