基于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数字温湿度传感器、按键电路和输出模块,共同构成了大棚温湿度监控系统的硬件。
相关文章:
基于STM32的农业大棚温湿度采集控制系统的设计
目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智能教室。 设备的详细功能见网盘中的文章《8、基…...
go语言的命名规则
身为前端为什么去学go语言呢?我认为go在未来可能会给我带来一些收益。自认为收益是去做一件事情不可缺少的因素,就好像是你努力之后得到回报,努力的欲望会越来越强。《Head First Go》这本书里作者有一句话,如果你已经掌握了一门编…...
新增ClamAV病毒扫描功能、支持Java和Go运行环境,1Panel开源面板v1.10.12版本发布
2024年7月19日,现代化、开源的Linux服务器运维管理面板1Panel正式发布了v1.10.12版本。 在这一版本中,1Panel新增了多项实用功能。社区版方面,1Panel新增ClamAV病毒扫描功能、支持Java和Go运行环境,同时1Panel还新增了文件编辑器…...
Windows通过命令查看mac : getmac
要查看本机网卡mac,可以通过ipconfig /all 显示,但输出内容过多 可以通过getmac命令查看 示例 C:\Users\Desktop> getmac物理地址 传输名称暂缺 没有硬件 1C-1B-B5-04-E2-7D \Device\Tcpip_{80096E40-D51D-490C-9AF7-…...
Android笔试面试题AI答之Android系统与综合类(1)
答案仅供参考,来着文心一言、Kimi.ai 目录 1.简述嵌入式实时操作系统,Android 操作系统属于实时操作系统吗?嵌入式实时操作系统简述Android操作系统是否属于实时操作系统 2.简述Android系统的优势和不足?3.简述Android的系统架构 ࿱…...
【Android】数据存储方案——文件存储、SharedPreferences、SQLite数据库用法总结
文章目录 文件存储存储到文件读取文件 SharedPreferences存储存储获取SharedPreferences对象Context 类的 getSharedPreferences() 方法Activity 类的 getPreferences() 方法PreferenceManager 类中的 getDefaultSharedPreferences() 方法 示例 读取记住密码的功能 SQLite数据库…...
抖音矩阵管理系统功能说明:一站式掌握
在当下这个信息爆炸的时代,抖音作为短视频领域的佼佼者,其用户规模持续扩大,影响力日益增强。对于内容创作者和营销人员来说,如何高效管理抖音账号,实现内容的多平台分发和精准触达,成为了亟待解决的问题。…...
旅游卡使用指南及常见疑问解答
近期,许多朋友对旅游卡的免费旅游政策表示浓厚兴趣,但心中不免存疑:这真的是全程免费,无需自费一分吗? 在此,我们明确告知:免费旅游确实存在,但享受范围与条件需清晰界定。 本文将…...
【MySQL篇】Percona XtraBackup标准化全库完整备份策略(第三篇,总共五篇)
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...
背单词工具(C++)
功能分析 生词本管理: 创建生词本文件:在构造函数中创建了“生词本.txt”“背词历史.log”“历史记录.txt”三个文件。添加单词:用户可以输入单词、词性和解释,将其添加到生词本中。查询所有单词:展示生词本中所有的单…...
面试八股 | 数据库引擎 | InnoDB和myISAM的区别?
⭐️⭐️⭐️InnoDB和MyISAM的区别? InnoDB : 1、使用的是行锁,操作时候只锁一行数据,不会对其他有影响,适合高并发工作 2、支持事务 3、不仅缓存索引还要缓存真实数据,适合高并发 4、默认安装 5、支持外键 6、…...
GEE计算五种植被指数(NDVI、EVI2、RVI、MTVI2、OSAVI)
目录 计算公式源代码计算公式 源代码 // 定义感兴趣区域(这里以一个简单的矩形区域为例) var region = ee.FeatureCollection("projects/a-flyllf0313/assets/dachang"); // 定义时间范围 var startDate = 2023-04-18; var endDate &...
C/S架构和B/C架构
C/S架构(Client/Server Architecture)和B/C架构(Browser/Client Architecture)是两种不同 的软件架构模型,它们各自有不同的特点和应用场景。 一、C/S架构(Client/Server Architecture) 1. 定…...
音乐曲谱软件Guitar Pro 8.2 for Mac 中文破解版
Guitar Pro 8.2 for Mac 中文破解版是一款功能强大的音乐曲谱软件,非常适合学习如何玩,改进技巧,重现喜爱的歌曲或陪伴自己。 Guitar Pro for Mac 是一款功能强大的音乐曲谱软件,非常适合学习如何玩,改进技巧…...
浅聊Web Storage(localStorage 和 sessionStorage)、cookie的使用场合
Web Storage(localStorage 和 sessionStorage)、cookie 一、Cookie二、Web StoragelocalStoragesessionStorage与 Cookies 的比较 一、Cookie Cookies 主要用于以下几种情况: 会话管理(Session Management): 登录、购…...
C语言输入输出缓冲机制
文章目录 输入输出缓冲机制概述为什么要有缓冲区缓冲区的类型引发缓冲区的刷新 原理实现 输入输出缓冲机制 概述 缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入 或者输出的数…...
javaEE-03-cookie与session
文章目录 Cookie创建Cookie获取Cookie更新CookieCookie 生命控制Cookie 有效路径 Session 会话创建和获取sessionSession 域数据的存取Session 生命周期控制浏览器和 Session 之间关联 Cookie Cookie 是服务器通知客户端保存键值对的一种技术,客户端有了 Cookie 后,…...
EtherNet/IP转Profinet协议网关(经典配置案例)
怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题,作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题,名为JM-PN-EIP,下面是详细介绍。 一,设备主要功能 1、捷米特J…...
华为云依赖引入错误
问题:记录一次项目加在华为云依赖错误,如下: 错误信息:Could not find artifact com.huawei.storage:esdk-obs-java:pom:3.1.2.1 in bintray-qcloud-maven-repo (https://dl.bintray.com/qcloud/maven-repo/) 找到本地仓库&#…...
【Ubuntu】Ubuntu 配置镜像源(ARM)
【Ubuntu】Ubuntu 配置镜像源(ARM) 零、起因 最近在QEMU中安装了个ubuntu-24.04-live-server-arm64,默认是国外的软件源,很慢,故替换到国内。 壹、替换 源地址(清华源) https://mirror.tun…...
Java Web 新冠物资管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
摘要 新冠疫情的爆发对全球公共卫生体系提出了严峻挑战,物资管理成为疫情防控中的关键环节。传统物资管理方式依赖人工操作,效率低下且易出错,难以应对突发公共卫生事件中的大规模物资调配需求。为解决这一问题,新冠物资管理系统应…...
爱毕业aibye精选6大AI论文平台榜单:助力高效写作与智能降重,科研工作者的得力助手!
工具名称 核心功能 特色优势 Aibiye 论文生成降AI率 全学科覆盖、仿写优化、自动图表生成 Aicheck AI检测文献综述辅助 精准查新、3分钟高效成文 GPT学术版 润色/翻译/代码解释 多模型协同、PDF深度解析 摆平论文 大纲生成降重改写 三步出稿、本硕博通用 QuillB…...
StarWind V2V Image Converter实战:轻松将IMG镜像转换为VMware VMDK格式
1. 为什么需要IMG转VMDK? 虚拟机镜像格式转换是IT运维中的常见需求。我遇到过不少这样的情况:手头有一个现成的IMG格式镜像文件,但当前虚拟化环境用的是VMware。这时候就需要把IMG转换成VMware原生支持的VMDK格式。 IMG是一种通用的磁盘镜像格…...
string字符串基础相关知识
课程要求1.string的三种创建方式2.string常用方法空格处理,空值判断,替换操作,字符串截取,字符串拆分,字符索引访问拼接与性能,删除操作3.理解 string 不可变性,能在循环拼接场景中使用 StringB…...
知识图谱项目实战(基础概念以及工具使用)【第一章】
在RAG以及Agent的应用领域中,知识图谱可以增强知识库的检索效果(通过搭建知识图谱数据库(GraphRag)实现).在教育医疗以及金融领域应用广泛.图谱(graph)有节点和边组成一.知识图谱理论1.1知识图谱的整体架构1.2知识图谱架构实现流程1. 文本标注(Doccano标…...
Flutter:从零到APK,手把手教你完成Android应用签名与打包
1. 环境准备与基础概念 在开始Flutter应用打包之前,我们需要确保开发环境已经正确配置。首先确认你的电脑上已经安装了以下工具: Flutter SDK(建议最新稳定版)Android Studio(包含Android SDK)Java JDK&…...
技术突破:抖音下载工具的全流程实战指南
技术突破:抖音下载工具的全流程实战指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代,高效获取和管理短视频资源已成为创作者、研究者和普通用户的核心需求。…...
02.Linux常用文件操作命令
1.mkdir 目录名:创建目录 mkdir 目录名 mkdir -p a/b/c 创建多级目录 2.touch 创建空文件 touch 文件名 touch 文件名 文件名 创建多个文件 3.文件写入内容 echo写入 覆盖写入 echo 文件内容 >文件名 追加写入(日志必用) echo 文件内容 >…...
C++ 内联函数的性能影响
C内联函数的性能影响探析 在追求高效代码的C开发中,内联函数因其消除函数调用开销的特性而备受关注。通过将函数体直接嵌入调用点,内联函数能显著提升程序性能,尤其在频繁调用的场景下。过度或不恰当的内联也可能导致代码膨胀或缓存命中率下…...
在单细胞测序数据分析中,barcodes、features和matrix是三个最核心的基础文件,它们共同构成了所有分析的基石。
在GEO(Gene Expression Omnibus)数据库中下载单细胞数据时,最常见的数据存储和提供形式主要有以下四种类型:10x Genomics 标准格式(最主流)在GEO的数据集中,我们通常会找到一个包含以下三个核心…...
