当前位置: 首页 > news >正文

STM32-笔记37-吸烟室管控系统项目

一、项目需求

1. 使用 mq-2 获取环境烟雾值,并显示在 LCD1602 上;

2. 按键修改阈值,并显示在 LCD1602 上;

3. 烟雾值超过阈值时,蜂鸣器长响,风扇打开;烟雾值小于阈值时,蜂鸣器不响,风扇关闭;

二、项目框图

三、介绍烟雾传感器(MQ-2)

四、项目实现

复制项目文件夹19-串口打印功能

重命名为46-烟雾报警系统项目

打开项目工程,加载文件

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "adc.h"
#include "key.h"
#include "LCD1602.h"
#include "fan.h"
#include "beep.h"uint16_t adc_result = 0;int main(void)
{float smoke_value = 0;float limit_value = 1.0;uint8_t key_num = 0;HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);//adcadc_dma_init();key_init();lcd1602_init();beep_init();fan_init();printf("hello world!\r\n");lcd1602_show_line(1,1,"Smoke:   0.0 V");lcd1602_show_line(2,1,"Limit: - 1.0 +");while(1){ key_num = key_scan();if(key_num == 1)limit_value +=0.1;else if(key_num == 2)limit_value -=0.1;//通过按键更改阈值lcd1602_display_limit(limit_value);smoke_value = adc_get_smoke();lcd1602_display_smoke(smoke_value);//判断smoke_value的值是不是大于limit_value//判断烟雾的值是不是大于我们限定的值if(smoke_value > limit_value){beep_ON();fan_ON();}else{beep_OFF();fan_OFF();}}
}

LCD1602.c

adc.c

#include "adc.h"DMA_HandleTypeDef dma_handle = {0};//DMA的句柄
ADC_HandleTypeDef adc_handle = {0};//ADC的句柄uint16_t adc_value = 0;//初始化ADC函数
void adc_config(void)
{adc_handle.Instance = ADC1;//基地址adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;//数据右对齐adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE;//要不要扫描?不需要扫描adc_handle.Init.ContinuousConvMode = ENABLE;//连续模式?连续转换模式adc_handle.Init.NbrOfConversion = 1;//转换个数?1个adc_handle.Init.DiscontinuousConvMode = DISABLE;//间断模式?不间断模式adc_handle.Init.NbrOfDiscConversion = 0;//间断个数0adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;//触发方式:软件触发HAL_ADC_Init(&adc_handle);HAL_ADCEx_Calibration_Start(&adc_handle);//ADC校准
}
//初始化msp函数
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{if(hadc->Instance == ADC1)//判断是不是ADC1{RCC_PeriphCLKInitTypeDef adc_clk_init = {0};//ADC时钟句柄GPIO_InitTypeDef gpio_init_struct = {0};//GPIO的句柄__HAL_RCC_ADC1_CLK_ENABLE();//打开ADC1的时钟__HAL_RCC_GPIOB_CLK_ENABLE();//打开GPIO口的时钟gpio_init_struct.Pin = GPIO_PIN_0;//引脚gpio_init_struct.Mode = GPIO_MODE_ANALOG;//模式:虚拟量的输入HAL_GPIO_Init(GPIOB, &gpio_init_struct);adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC;//外设的时钟选择:ADCadc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6;//分频?6分频HAL_RCCEx_PeriphCLKConfig(&adc_clk_init);//ADC时钟初始化函数}
}
void dma_config(void)
{__HAL_RCC_DMA1_CLK_ENABLE();dma_handle.Instance = DMA1_Channel1;//通道1dma_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;//外设到内存//内存相关配置dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;//半字对齐dma_handle.Init.MemInc = DMA_MINC_ENABLE;//内存增量失能模式//外设相关配置dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;//半字对其dma_handle.Init.PeriphInc = DMA_PINC_DISABLE;//内存增量失能模式dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;//DMA优先级dma_handle.Init.Mode = DMA_CIRCULAR;//模式:循环搬运模式HAL_DMA_Init(&dma_handle);//这行代码的作用是将ADC的句柄(adc_handle)与DMA的句柄(dma_handle)关联起来__HAL_LINKDMA(&adc_handle, DMA_Handle, dma_handle);//当ADC完成数据采集时,数据可以直接通过DMA传输到指定的内存地址,而不需要CPU的干预。
}
//通道配置的函数
void adc_channel_config(ADC_HandleTypeDef* hadc, uint32_t ch, uint32_t rank, uint32_t stime)
{//ADC_ChannelConfTypeDef adc_ch_config = {0};adc_ch_config.Channel = ch;//指定通道-外界传进来adc_ch_config.Rank = rank;//序列-外界传进来adc_ch_config.SamplingTime = stime;//取样时间-外界传进来HAL_ADC_ConfigChannel(hadc, &adc_ch_config);//通道配置
}
//adc dma 初始化函数
void adc_dma_init(void)
{adc_config();//adc句柄,通道,序列号,ADC采样的时间adc_channel_config(&adc_handle, ADC_CHANNEL_8, ADC_REGULAR_RANK_1, ADC_SAMPLETIME_239CYCLES_5);dma_config();//启动adc,ADC转化完的数据通过DMA搬运出来,从ADC外设传输到存储器的长度HAL_ADC_Start_DMA(&adc_handle, (uint32_t *)&adc_value, 1);//mar是目标缓冲区的地址
}
//定义一个函数:把获取电压的值给返回出来
float adc_get_smoke(void)
{return (float)adc_value / 4096 * 3.3;
}

相关文章:

STM32-笔记37-吸烟室管控系统项目

一、项目需求 1. 使用 mq-2 获取环境烟雾值,并显示在 LCD1602 上; 2. 按键修改阈值,并显示在 LCD1602 上; 3. 烟雾值超过阈值时,蜂鸣器长响,风扇打开;烟雾值小于阈值时,蜂鸣器不响…...

VisionPro软件Image Stitch拼接算法

2D图像拼接的3种情景 1.一只相机取像位置固定,或者多只相机固定位置拍图,硬拷贝拼图,采用CopyRegion工具实现 2.一只或多只相机在多个位置拍照,相机视野互相重叠,基于Patmax特征定位后,无缝 拼图&#xff…...

【从零开始入门unity游戏开发之——unity篇09】unity6基础入门——Unity游戏对象和组件的本质、Unity中的反射机制

文章目录 一、Unity游戏对象和组件的本质1、开发游戏的本质2、万物之根本——空对象2.1 什么是空对象?2.2 创建空对象 3、Unity游戏对象的本质4、 transform组件4.1 transform组件的重要性4.2 修改transform的值4.4 **Transform的作用**4.3 重置transform的值 5、总…...

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 📌补充: 📌通常网络中用高低电平,磁盘中用磁化方向来表示。以下是具体说明: 📌如果有一块磁盘要进行销毁该怎么办? 1-2 磁盘存储结构 ​编辑…...

MoEs and Transformers 笔记

ref:https://huggingface.co/blog/zh/moe#%E7%94%A8router-z-loss%E7%A8%B3%E5%AE%9A%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83 MoEs and Transformers Transformer 类模型明确表明,增加参数数量可以提高性能,因此谷歌使用 GShard 尝试将 Transformer 模型…...

在Linux中,如何禁用root用户直接SSH登录?

在Linux中禁用root用户的直接SSH登录是为了增强系统的安全性,因为允许root用户通过SSH远程登录会增加服务器被暴力破解的风险。以下是在Linux系统中禁止root用户直接SSH登录的步骤: 编辑SSH配置文件: 打开/etc/ssh/sshd_config文件&#xff…...

用Python实现简单的任务自动化

目录 1. 自动发送邮件提醒 2. 自动备份文件 3. 自动下载网页内容 总结 在现代工作和生活中,任务自动化可以极大地提高效率和准确性。Python,作为一种功能强大且易于学习的编程语言,是实现任务自动化的理想选择。本文将通过几个简单而实用的案例,展示如何用Python实现任…...

为AI聊天工具添加一个知识系统 之26 资源存储库和资源管理器

本文要点 资源存储库 为了能完成本项目(“为AI聊天工具增加一个知识系统”,其核心能力是“语言处理” ,该能力的最大挑战 当仁不让的应该是自然语言处理)的设计,我们考虑一个问题:在自然语言处理中&#…...

Windows10环境下安装RabbitMq折腾记

最近有个老项目需要迁移到windows10环境,用的是比较老的rabbitmq安装包,如下所示。经过一番折腾,死活服务起不来,最终果断放弃老版本启用新版本。现在把折腾过程记录下: 一、安装erlang 安装完成后的目录结构&#xff…...

对快速由表及里说拜拜/如何正确运用由表及里

你是不是还:看到一男子拖走一女子就以为小情侣吵架而已(可能人贩子);看到男友对你好个几次就从此死心塌地(可能有手就行,细节装装而已)结果耽误终身;看到女同事对你微笑不排斥就以为…...

spring mvc源码学习笔记之八

本文说点儿简单的。 如果你想研究基于 XML 配置的 spring mvc 的话,可以简单扫一眼本文。 在基于 XML 配置的 spring mvc 开发中,我们主要就是通过 spring 提供的各种标签来配置。 但是,大家是不是都有个疑问,spring 到底给我们提…...

探秘5网口IIOT网关

在当今这个科技飞速发展的时代,工业领域正经历着一场深刻的变革,而工业物联网网关在其中扮演着至关重要的角色。 什么是IIOT网关 工业物联网网关,简单来说,就是连接工业现场设备与云端或者上层管理系统的关键桥梁。 而明达技术研…...

左神算法基础巩固--5

文章目录 前缀树生成前缀树查询前缀树查询字符串加入过几次查询所有加入的字符串中,有几个是以pre这个字符串作为前缀 删除前缀树中的某个字符串 贪心算法解题 前缀树 生成前缀树 要想生成一棵前缀树,需要先创建一个根节点,这个根节点有26条…...

Python的Matplotlib库应用(超详细教程)

目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线(直线)可视化 2.2 曲线(虚线)可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…...

负载均衡服务器要怎么配置?

目录 一、概述: 二、硬件配置: 三、操作系统配置: 四、负载均衡软件: 五、网络配置: 六、软件安装步骤: 6.1 安装 Nginx 6.2 安装 LVS 6.3 安装 HAProxy 6.4 安装 Keepalived 一、概述&#xff1…...

CANopen转EtherCAT网关连接伺服驱动

在现代工业自动化领域,CANopen和EtherCAT是两种常见的通信协议,各自在不同的应用场景中发挥着重要作用。然而,随着工业自动化系统的日益复杂化,不同设备间的通信需求也变得多样化。因此,如何实现不同协议设备之间的无缝…...

自动化测试脚本实践:基于 Bash 的模块化测试框架

前言 在现代软件开发中,测试自动化是确保软件质量和稳定性的核心手段之一。随着开发周期的缩短和功能模块的增多,手动测试逐渐无法满足高效性和准确性的需求。因此,测试人员需要依赖自动化工具来提升测试效率,减少人为干预和错误。…...

WebSocket 测试入门篇

Websocket 是一种用于 H5 浏览器的实时通讯协议,可以做到数据的实时推送,可适用于广泛的工作环境,例如客服系统、物联网数据传输系统, 基础介绍 我们平常接触最多的是 http 协议的接口,http 协议是请求与响应的模式&…...

Apache Traffic存在SQL注入漏洞(CVE-2024-45387)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

Centos7使用yum工具出现 Could not resolve host: mirrorlist.centos.org

在 CentOS 7 中使用 yum 工具时,出现 "Could not resolve host: mirrorlist.centos.org" 的错误,一般情况是因为默认的镜像源无法访问。 以下是一些常用的解决方法: 检查网络连接:首先使用 ping 命令测试网络连接是否…...

LeetCode 3655. 区间乘法查询后的异或2 解题报告(Python)

LeetCode 3655. 区间乘法查询后的异或2 解题报告(Python) 前言 本题是 LeetCode 第 3655 号问题,属于一道结合了根号分治、差分思想与模运算的综合应用题。题目要求在一个数组上执行大量区间“跳跃式”乘法操作,并最终返回所有元素…...

设置echarts 图例为长方形

在 ECharts 中,要将图例(legend)的 标记(icon) 设置为 长方形(矩形),可以通过 legend 配置项中的 icon 属性来实现。✅ 方法:使用 icon: rect ECharts 内置了多种图例标记…...

TwiLiquidCrystal库:HD44780 LCD的I²C裸机级驱动解析

1. TwiLiquidCrystal 库概述:面向嵌入式工程师的 HD44780 LCD IC 驱动深度解析TwiLiquidCrystal 是由开发者 Arnakazim 维护的一个轻量级、高兼容性的 Arduino 兼容库,专为通过 IC(在 AVR 平台常称 TWI)总线驱动 HD44780 及其兼容…...

Spire实现Wod与Pdf相互转换

在 Java 中使用 Spire 库进行 Word 和 PDF 的转换,你需要用到两个不同的库:Word 转 PDF:使用 Spire.Doc for Java (免费版)PDF 转 Word:使用 Spire.PDF for Java (免费版)重要提示: 免费版(Free Spire&…...

如何用Tweepy构建强大的Twitter数据分析报告:5个高级搜索聚合技巧

如何用Tweepy构建强大的Twitter数据分析报告:5个高级搜索聚合技巧 【免费下载链接】tweepy Twitter for Python! 项目地址: https://gitcode.com/gh_mirrors/tw/tweepy Tweepy是Python中最流行的Twitter API客户端库,让开发者能够轻松访问Twitter…...

EF Core 10向量搜索扩展架构设计图泄露事件(内部PPT第7页已证实):这3个设计决策将重写.NET AI应用开发范式

第一章:EF Core 10向量搜索扩展的演进背景与战略定位随着AI应用在企业级系统中加速落地,传统关系型数据库的标量查询能力已难以满足语义检索、相似性匹配等新兴场景需求。EF Core 10首次将向量搜索能力深度融入ORM层,标志着微软在数据访问技术…...

SimpleFOC源码学习03(v2.3.2) - 时间工具模块time_utils.cpp与time_utils.h

前言github源码:https://github.com/simplefoc/Arduino-FOC/tree/master/src/common 为什么需要time_utils.cpp与time_util.h? 在电机控制中,时间非常重要: PID 控制器需要知道"距上次运行过了多久"(dt&…...

镜像孪生系统总体技术方案白皮书——基于三维空间计算的全域视频智能感知与决策平台

镜像孪生系统总体技术方案白皮书——基于三维空间计算的全域视频智能感知与决策平台发布单位:镜像视界(浙江)科技有限公司 版本:V1.0 日期:2026年📌 摘要随着智慧城市、公共安全与数字政府建设的不断推进&a…...

阿里云盘Refresh Token获取工具使用指南:轻松实现云盘授权与自动化管理

阿里云盘Refresh Token获取工具使用指南:轻松实现云盘授权与自动化管理 【免费下载链接】aliyundriver-refresh-token QR Code扫码获取阿里云盘refresh token For Web 项目地址: https://gitcode.com/gh_mirrors/al/aliyundriver-refresh-token 在云存储管理…...

ARM 架构 JuiceFS 性能优化:基于 MLPerf 的实践与调优阑

Qt是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本笔记将重点介绍QSpinBox数值微调组件的常用方法及灵活应用。…...