基于STM32的智能仓储环境监测的Proteus仿真
文章目录
- 一、智能仓储环境监测
- 1.题目要求
- 2.思路
- 3.电路仿真
- 3.1 未仿真时
- 3.2 开始仿真,显示屏显示Init后,正常显示温度湿度光照烟雾数值
- 3.3 切换温度阈值界面,用阈值加减设置温度min和温度max阈值
- 3.4 调整温度数值,触发风扇/加热
- 3.5 切换湿度阈值界面,调整湿度数值,模拟通风打开
- 3.6 切换光照阈值界面,调整光照传感器数值,声光报警
- 3.7 远程终端设置阈值和查询温度湿度光照烟雾数值
- 4.仿真程序
- 4.1 程序说明
- 4.2 主程序
- 4.3 OLED显示函数
- 4.4 串口接收函数
- 二、总结
一、智能仓储环境监测
1.题目要求
1、检测温度、湿度、光照、烟雾浓度
2、设置光照、烟雾浓度阈值,超过阈值进行声光报警
3、设置温度阈值,低于阈值加热,高于阈值开风扇
4、设置湿度阈值,超过阈值通风
5、oled显示温度、湿度、光照、烟雾浓度的数值
6、手机端可以设置温度、湿度、光照、烟雾浓度的阈值、显示温度、湿度、光照、烟雾浓度的数值

2.思路
由上面的功能需求和实物照片,我们可知需要一个单片机STM32F103C8T6,温湿度传感器DHT11,光照传感器BH1750,
烟雾传感器MQ-2,显示屏OLED,有源蜂鸣器报警,风扇,加热棒,舵机,WiFi模块ESP8266以及三个按键。
都是一些常见的模块,简单过一遍。
单片机STM32F103C8T6:

温湿度传感器DHT11:

光照传感器BH1750:

烟雾传感器MQ-2(proteus仿真没有,用滑动变阻器代替模拟)

显示屏OLED:

有源蜂鸣器报警(最近不知道软件怎么了,蜂鸣器用不了,所以我都选择在旁边加个指示灯来看效果)

风扇,加热棒(proteus仿真没有,用一个红色LED点亮表示开启加热)

舵机:

WiFi模块ESP8266(proteus仿真没有,用虚拟终端连接到串口调试助手代替)

三个按键:

3.电路仿真
3.1 未仿真时

3.2 开始仿真,显示屏显示Init后,正常显示温度湿度光照烟雾数值
1.一开始显示屏显示Init(表示正在初始化)

2.正常显示温度湿度光照烟雾数值

3.3 切换温度阈值界面,用阈值加减设置温度min和温度max阈值

3.4 调整温度数值,触发风扇/加热
1.当前温度数值为31°C,高于温度max阈值,打开风扇

2.当前温度数值为20°C,低于温度min阈值,打开加热

3.5 切换湿度阈值界面,调整湿度数值,模拟通风打开
默认关闭的时候,舵机角度为-90°

打开的时候舵机角度调整为+90°

3.6 切换光照阈值界面,调整光照传感器数值,声光报警
烟雾阈值同理不演示。
注:蜂鸣器可能不响,所以用指示灯代替。

3.7 远程终端设置阈值和查询温度湿度光照烟雾数值

4.仿真程序
4.1 程序说明
主控芯片:STM32F103C8
HICK:64MHZ
Systick: 1ms
烟雾传感器:ADC(PA0)
光照传感器:LDR(PA2)
DHT11温湿度传感器:DATA(PA4)
模拟WIFI模块(Uart1):9600(PA9:tx1,PA10:rx1)
声光报警:BUZZER(PA15)
按键:
KEY1(PB2)
KEY2(PB3)
KEY3(PB4)
模拟通风:PWM(PB6)
风扇:RELAY1(PB7)
加热:RELAY2(PB8)
OLED显示屏:SCL(PB14),SDA(PB15)

串口协议
举例如发送*Tmin20,即设置温度低阈值位20度
设置指令:
*TminXX 设置温度低阈值 XX取值为0-99(温度低阈值必须小于温度高阈值)
*TmaxXX 设置温度高阈值 XX取值为0-99(温度高阈值必须大于温度低阈值)
*HumiXX 设置湿度阈值 XX取值为0-99
*ILLuXX 设置光照阈值 XX取值为0-99
*SmogXX 设置烟雾阈值 XX取值为0-99
查询指令:查询温度、湿度、光照、烟雾浓度的数值
*Read
4.2 主程序
/* Includes ------------------------------------------------------------------*/
#include "Drv_UserSystem.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/*** @brief main function.* @param none* @retval none*/
int main(void)
{UserSystemInit();//用户配置初始化 while (1){ if (stSysTime.flg._100ms + TEN_MILLISECOND < Time_millis()) //10ms{stSysTime.flg._10ms = Time_millis(); Key_Scan();//按键扫描 }if (stSysTime.flg._50ms + FIFTY_MILLISECOND < Time_millis()) //50ms{stSysTime.flg._50ms = Time_millis(); ADC_Scan();//光照,土壤湿度检测 DHT11_Collect_data();//DHT11采集温度,湿度 } if(stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms{stSysTime.flg._100ms = Time_millis(); Receive_data_Handel();//数据接收判断 OLED_Handel();//OLED显示 Forewarning_Handel();//预警函数 IWDG_ReloadCounter();//清开门狗 }if (stSysTime.flg._1s + THOUSAND_MILLISECOND < Time_millis()) //1s{stSysTime.flg._1s = Time_millis(); }}
}
4.3 OLED显示函数
/******************************************************************************** 函数名:OLED_Handel* 描述 :OLED显示* 输入 :void* 输出 :void* 调用 :初始化* 备注 :100ms
*******************************************************************************/
void OLED_Handel(void)
{ if(Screen_switching == 1){OLED_Show_Character(1,1,0,16);//温OLED_Show_Character(1,2,1,16);//度 OLED_Show_Character(1,3,2,16);//: OLED_ShowNum(1,7,DHT11_temp_high,2); OLED_Show_Character(1,5,3,16);//° OLED_ShowString(1, 11, "C"); OLED_Show_Character(2,1,4,16);//湿OLED_Show_Character(2,2,5,16);//度 OLED_Show_Character(2,3,2,16);//: OLED_ShowNum(2,7,DHT11_humi,2);OLED_ShowString(2, 9, "%"); OLED_Show_Character(3,1,8,16);//光OLED_Show_Character(3,2,9,16);//照 OLED_Show_Character(3,3,2,16);//: OLED_ShowNum(3,7,ADC2_Value,2);OLED_ShowString(3, 9, "%"); OLED_Show_Character(4,1,6,16);//烟OLED_Show_Character(4,2,7,16);//雾 OLED_Show_Character(4,3,2,16);//: OLED_ShowNum(4,7,ADC1_Value,2);OLED_ShowString(4, 9, "%"); }else if((Screen_switching == 2) || (Screen_switching == 3)){ OLED_Show_Character(1,3,10,16);//设OLED_Show_Character(1,4,11,16);//置 OLED_Show_Character(1,5,0,16);//温OLED_Show_Character(1,6,1,16);//度 OLED_ShowString(2, 3, "min"); OLED_Show_Character(2,4,2,16);//:OLED_ShowNum(2,9,Temp_minThreshold,2); OLED_Show_Character(2,6,3,16);//° OLED_ShowString(2, 13, "C"); OLED_ShowString(3, 3, "max"); OLED_Show_Character(3,4,2,16);//:OLED_ShowNum(3,9,Temp_maxThreshold,2); OLED_Show_Character(3,6,3,16);//° OLED_ShowString(3, 13, "C"); }else if(Screen_switching == 4) {OLED_Show_Character(1,3,10,16);//设OLED_Show_Character(1,4,11,16);//置 OLED_Show_Character(1,5,4,16);//湿OLED_Show_Character(1,6,5,16);//度 OLED_ShowNum(3,7,Humi_Threshold,2);OLED_ShowString(3, 9, "%"); }else if(Screen_switching == 5) {OLED_Show_Character(1,3,10,16);//设OLED_Show_Character(1,4,11,16);//置 OLED_Show_Character(1,5,8,16);//光OLED_Show_Character(1,6,9,16);//照 OLED_ShowNum(3,7,ADC2_Threshold,2);OLED_ShowString(3, 9, "%"); } else if(Screen_switching == 6) {OLED_Show_Character(1,3,10,16);//设OLED_Show_Character(1,4,11,16);//置 OLED_Show_Character(1,5,6,16);//烟OLED_Show_Character(1,6,7,16);//雾 OLED_ShowNum(3,7,ADC1_Threshold,2);OLED_ShowString(3, 9, "%"); }
}
4.4 串口接收函数
/******************************************************************************** 函数名:Send_Cmd1* 描述 :设置温度阈值* 输入 :void* 输出 :void* 调用 :需要时调用* 备注 :举例如发送*Tmin20,即设置温度低阈值位20度*******************************************************************************/
void Send_Cmd1(void)
{uint8_t i = 0;if(uart1_rx_buf[i+3] == 'i'){variable1 = (AsciiToHex(uart1_rx_buf[i+5])*10+AsciiToHex(uart1_rx_buf[i+6]));if((variable1 > 0) && (variable1 < 100)){if(variable1 < Temp_maxThreshold) { Temp_minThreshold = variable1;printf("手机设置的温度低阈值 = %d\r\n",Temp_minThreshold);}else{printf("温度低阈值大于温度高阈值,设置失败"); } } else{printf("手机设置的温度低阈值超出设置范围 \r\n"); } }else if(uart1_rx_buf[i+3] == 'a'){variable2 = (AsciiToHex(uart1_rx_buf[i+5])*10+AsciiToHex(uart1_rx_buf[i+6]));if((variable2 > 0) && (variable2 < 100)){if(variable2 > Temp_minThreshold) { Temp_maxThreshold = variable2;printf("手机设置的温度高阈值 = %d\r\n",Temp_maxThreshold);}else{printf("温度高阈值小于温度低阈值,设置失败"); } } else{printf("手机设置的温度高阈值超出设置范围 \r\n"); } }
}/******************************************************************************** 函数名:Send_Cmd2* 描述 :设置湿度阈值* 输入 :void* 输出 :void* 调用 :需要时调用* 备注 :*******************************************************************************/
void Send_Cmd2(void)
{uint8_t i = 0;variable3 = (AsciiToHex(uart1_rx_buf[i+5])*10+AsciiToHex(uart1_rx_buf[i+6]));if((variable3 > 0) && (variable3 < 100)){Humi_Threshold = variable3;printf("手机设置的湿度阈值 = %d\r\n",Humi_Threshold); } else{printf("手机设置的湿度阈值超出设置范围 \r\n"); }
}/******************************************************************************** 函数名:Send_Cmd3* 描述 :设置光照阈值* 输入 :void* 输出 :void* 调用 :需要时调用* 备注 :*******************************************************************************/
void Send_Cmd3(void)
{uint8_t i = 0;variable4 = (AsciiToHex(uart1_rx_buf[i+5])*10+AsciiToHex(uart1_rx_buf[i+6]));if((variable4 > 0) && (variable4 < 100)){ADC2_Threshold = variable4;printf("手机设置的光照雾阈值 = %d\r\n",ADC2_Threshold); } else{printf("手机设置的光照阈值超出设置范围 \r\n"); }
}/******************************************************************************** 函数名:Send_Cmd4* 描述 :设置烟雾阈值* 输入 :void* 输出 :void* 调用 :需要时调用* 备注 :*******************************************************************************/
void Send_Cmd4(void)
{uint8_t i = 0;variable5 = (AsciiToHex(uart1_rx_buf[i+5])*10+AsciiToHex(uart1_rx_buf[i+6]));if((variable5 > 0) && (variable5 < 100)){ADC1_Threshold = variable5;printf("手机设置的烟雾阈值 = %d\r\n",ADC1_Threshold); } else{printf("手机设置的烟雾阈值超出设置范围 \r\n"); }
}/******************************************************************************** 函数名:Send_Cmd5* 描述 :查询温度、湿度、光照、烟雾浓度的数值* 输入 :void* 输出 :void* 调用 :需要时调用* 备注 :*******************************************************************************/
void Send_Cmd5(void)
{if(ADC_Flag){ printf("温度=%d 湿度=%d 光照= %d 烟雾=%d\r\n",DHT11_temp_high,DHT11_humi,ADC2_Value,ADC1_Value); }
}/******************************************************************************** Function : Receive_data_Handel* Description : 数据接收判断* Input : 无* Return : 无* Call : 100ms* Others :*******************************************************************************/
void Receive_data_Handel(void)
{uint8_t i = 0;if(uart1_rx_finsh){ for(i = 0;i< 20; i++){if(uart1_rx_buf[i] == '*') {switch(uart1_rx_buf[i+1]){case 'T':Send_Cmd1();break;//*TempXX case 'H':Send_Cmd2();break;//*HumiXXcase 'I':Send_Cmd3();break;//*IlluXX case 'S':Send_Cmd4();break;//*SmogXX case 'R':Send_Cmd5();break;//*Read default:break; } }}uart1_rx_finsh = 0; uart1_rx_count = 0;memset(uart1_rx_buf,0,RX_MAX_NUM); }
}
二、总结
今天主要讲了基于STM32的智能仓储环境监测的Proteus仿真。
感谢你的观看!

相关文章:
基于STM32的智能仓储环境监测的Proteus仿真
文章目录 一、智能仓储环境监测1.题目要求2.思路3.电路仿真3.1 未仿真时3.2 开始仿真,显示屏显示Init后,正常显示温度湿度光照烟雾数值3.3 切换温度阈值界面,用阈值加减设置温度min和温度max阈值3.4 调整温度数值,触发风扇/加热3.…...
logback日志控制台打印与写入文件
1.创建logback-spring.xml文件放入resource下 <?xml version"1.0" encoding"UTF-8"?> <configuration><property name"LOG_CONTEXT_NAME" value"log"/><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用…...
成方金融科技后端部分笔试题 - 解析
单选题 1.以下关于JAVA自动类型转换,描述错误的是哪一项?(B) A.byte->short B.char->short C.char->int D.float->double 2.请选择运行以下代码后,系统显示的内容什么?(B) public class Test {static {int x1;}static int x,y;publ…...
WatchAlert - 开源多数据源告警引擎
概述 在现代 IT 环境中,监控和告警是确保系统稳定性和可靠性的关键环节。然而,随着业务规模的扩大和数据源的多样化,传统的单一数据源告警系统已经无法满足复杂的需求。为了解决这一问题,我开发了一个开源的多数据源告警引擎——…...
Linux procps-ng 包详解
简介 procps-ng 包是用于监视和管理 Linux 上的进程和系统性能的实用程序集合。它与 /proc 文件系统交互以检索实时系统信息。procps-ng 中的实用程序包括 ps、top、free、uptime 等命令。 安装 procps-ng 使用包管理工具安装 Debian/Ubuntu sudo apt update sudo apt ins…...
[react] <NavLink>自带激活属性
NavLink v6.28.0 | React Router 点谁谁就带上类名 当然类名也是可以自定义 <NavLinkto{item.link}className{({ isActive }) > (isActive ? 测试 : )}>{item.title}</NavLink> 有什么用?他会监听你的路由,刷新的话也会带上激活效果...
智能语音识别模块与声音传感器模块对比分析:原理、优缺点、性价比与应用领域
随着物联网(IoT)和智能家居的发展,智能设备的控制方式越来越多样化,尤其是语音控制和声音感应控制。智能语音识别模块和声音传感器模块作为两种常见的音频输入设备,它们在不同的应用场景中发挥着重要作用。本文将深入分…...
大模型+安全实践之春天何时到来?
引子:距《在大模型实践旅途中摸了下上帝的脚指头》一文发布近一年,2024年笔者继续全情投入在大模型+安全上,深度参与了一些应用实践,包括安全大模型首次大规模应用在国家级攻防演习、部分项目的POC直到项目落地,也推动了一些场景安全大模型应用从0到3的孵化上市。这一年也…...
贪心算法【Lecode_HOT100】
文章目录 1.买卖股票的最佳时机No.1212.跳跃游戏No.553.跳跃游戏IINo.454.划分字母区间No.763 1.买卖股票的最佳时机No.121 class Solution {public int maxProfit(int[] prices) {if (prices null || prices.length 0) {return 0;}// 初始化买入价格为最大值,最大…...
cmd初使用windows-docker时的一些小小问题
跟着大神文章做的,原文地址为【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南_win11 docker-CSDN博客 1.用户名或密码错误 报错原文:Error response from daemon: Head "https://registry-1.docker.io/v2/library…...
使用qemu搭建armv7嵌入式开发环境
目录 目录 1 概述 2 环境准备 2.1 vexpress系列开发板介绍 2.2 安装工具 2.2.1 安装交叉工具链 2.2.2 安装qemu 2.2.3 安装其他工具 3 启动uboot 3.1 uboot下载与编译 3.1.1 下载 3.1.2 编译 3.2 使用qemu启动uboot 4 启动kernel 4.1 下载和编译kernel 4.1.1 下…...
火山引擎FORCE:智算能力全面升级
火山引擎智算专场 : 有幸参加 2024年 12月18日 在 上海国际博览中心 15:00~17:00的 智算专场。 这里 火山引擎智算专场图片 : 火山引擎智算专场内容 : 火山引擎图片 智算专场:乘云之势,智启未…...
ARM 处理器平台 Ethernet Compliance 测试流程示例
By Toradex秦海 1). 简介 为了保证基于IEEE 802.3 协议设计的以太网设备接口可以互相兼容互联互通,需要进行 Ethernet Compliance 一致性测试,相关的技术原理说明请参考如下文章,本文就不赘述,主要展示基于 NXP i.MX8M Mini ARM…...
基于HAL库的stm32的can收发实验
十六、CAN 1.CAN简介 CAN协议,全称为Controller Area Network(控制器局域网络),是一种广泛应用的串行通信协议,最初由 德国BOSCH公司开发,并已成为国际标准。 低速CAN(ISO11519)通…...
重构(二)
继续"提高代码质量" 接着上文提高代码质量, 需要从这几个特点入手 1、代码重用性。2、可读性。3、可扩展性。4、可靠性。5、高内聚,低耦合。 仅仅就"可读性"去分析一下吧, 毕竟例子实在是太多了 递归的"可读性"不如while循环 递归…...
centos7下制作DockerFile 镜像
文章目录 介绍DockerFile 常用命令示例1.创建Dockerfile文件2.构建Dockerfile镜像3.验证结果 小结 介绍 Dockerfile 是一个文本文件,包含了用于构建 Docker 镜像的所有命令和指令。它定义了镜像的构建过程,包括基础镜像、安装软件、设置环境变量、复制文…...
GFPS扩展技术原理(七)-音频切换消息流
音频切换消息流 Seeker和Provider通过消息流来同步音频切换能力,触发连接做切换,获取或设置音频切换偏好,通知连接状态等等。为此专门定义了音频切换消息流Message Group 为0x07,Message codes如下: MAC of Audio s…...
压缩qcow2镜像带来的性能损失简单分析
本文拟对压缩qcow2镜像所带来的虚拟机性能损失进行简单分析 背景 生产中发现使用压缩镜像启动的虚拟机开机总是会慢一些。 qcow2镜像的压缩方式为:qemu-img convert -p -c -O qcow2 zero_disk.qcow2 compress_disk.qcow2 分析 qemu代码:https://down…...
Kali操作系统简单介绍
Kali是一个集成了各种安全工具的操作系统 安全问题的根源 1.分层思想:网络和软件开发的分层方法 2.安全问题:分层思想导致的片面认识和系统脆弱性 3.人的因素:安全问题的最终根源是人的错误 传统安全建设 1.防护型安全建设:关闭不…...
LabVIEW物联网开发实战:专栏总述
本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系统的快速开发与原型设计,助你从基础到实战࿰…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
