基于STM32设计的酒精检测仪

news2024/9/29 3:34:35

一、需求分析

随着社会的发展和生活水平的提高,人们对于行车安全、家庭安全的要求越来越高,而酒驾等问题也日渐突出,为此,开发一款基于STM32的酒精检测仪,通过检测酒精浓度,实时显示结果并进行报警,可以有效避免因酒后驾车带来的安全隐患。

image-20230618121603795

二、设计思路

2.1 硬件设计

1、主控芯片采用STM32F103RCT6,该芯片具有较高的性能和稳定性,能够满足本设计的各项需求。

2、酒精传感器采用MQ-3模块,该模块具有高精度、响应速度快等特点,能够准确检测酒精浓度。

3、OLED显示屏,用于实时显示酒精浓度等信息。

4、蜂鸣器,用于进行声音报警。

5、按键,用于设定报警阈值。

2.2 软件设计

1、IO口配置:将相应的IO口配置为输入输出,并使能对应的时钟。

2、ADC配置:将ADC采样通道、采样时间、采样频率等参数进行配置。

3、OLED配置:初始化OLED。

4、中断初始化:对按键进行中断初始化,并在中断服务函数中实现相应的操作。

5、主程序:定时读取酒精传感器的浓度值并将其转换为电压值,然后通过ADC进行采样,最后通过OLED显示屏进行实时显示。同时也需要根据设定的阈值进行判断,并触发相应的报警。

2.3 程序设计思路

main()
{
    初始化IO口
    初始化ADC
    初始化OLED
    配置中断
    while(1)
    {
        读取浓度值并转换为电压
        进行ADC采样
        计算实际浓度值
        显示实时浓度值
        判断是否超过设定阈值
        触发相应的报警
    }
}

void EXTIx_IRQHandler()
{
    检测按键状态
    根据按键状态进行相应的操作
}

三、代码设计

//头文件引用
#include "stm32f10x.h"
#include "OLED.h"
#include "ADC.h"
#include "MQ3.h"

//定义相关参数
#define THRESHOLD1 100
#define THRESHOLD2 200
#define THRESHOLD3 300

//定义中断服务函数
void EXTI0_IRQHandler(){
  if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0){
    threshold++;
    if(threshold == 4) threshold = 1;
    OLED_Clear();
    OLED_ShowString(0,0,"Threshold:");
    switch(threshold){
      case 1:{
        OLED_ShowString(70,0,"100");
        break;
      }
      case 2:{
        OLED_ShowString(70,0,"200");
        break;
      }
      case 3:{
        OLED_ShowString(70,0,"300");
        break;
      }
      default:{
        break;
      }
    }
  }
  EXTI_ClearITPendingBit(EXTI_Line0);
}

int main(void)
{
    //初始化IO口
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);   //使能端口时钟
    GPIO_InitTypeDef GPIO_InitStructure;                                           //定义GPIO结构体
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                               //输出模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                              //速度50MHz
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                                     //LED所在引脚
    GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //初始化GPIOC13
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                          //浮空输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                      //按键所在引脚
    GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //初始化GPIOA0

    //初始化ADC
    ADC_Configuration();

    //初始化OLED
    OLED_Init();
    OLED_Clear();

    //配置中断
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    //定义相关变量
    uint16_t adc_value = 0;
    float voltage = 0.0;
    float concentration = 0.0;
    uint8_t threshold = 1;

    while(1)
    {
        //读取酒精传感器的浓度值并转换为电压值
        adc_value = Get_ADC1_ConvertedValue(ADC_Channel_6);
        voltage = (adc_value * 3.3) / 4096;

        //计算实际浓度值
        concentration = Get_MQ3_Concentration(voltage);

        //显示实时浓度值
        OLED_ShowString(0, 0, "Concentration:");
        OLED_ShowNum(100, 0, concentration, 1, 2);

        //判断是否超过设定阈值
        if(concentration > THRESHOLD3){
            GPIO_SetBits(GPIOC, GPIO_Pin_13);      //LED灯亮
            BEEP_ON;                                //蜂鸣器报警
        }
        else if(concentration > THRESHOLD2){
            GPIO_ResetBits(GPIOC, GPIO_Pin_13);    //LED灯灭
            BEEP_OFF;                               //蜂鸣器关闭
        }
        else if(concentration > THRESHOLD1){
            GPIO_SetBits(GPIOC, GPIO_Pin_13);      //LED灯亮
            BEEP_ON;                                //蜂鸣器报警
        }
        else{
            GPIO_ResetBits(GPIOC, GPIO_Pin_13);    //LED灯灭
            BEEP_OFF;                               //蜂鸣器关闭
        }
    }
}

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

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

相关文章

openGauss学习笔记-05 openGauss gsql连接与使用方法

文章目录 openGauss学习笔记-05 openGauss gsql连接与使用方法5.1 以操作系统用户omm登录数据库主节点5.2 连接数据库5.3 数据库简单操作5.4 退出数据库 openGauss学习笔记-05 openGauss gsql连接与使用方法 openGauss提供了在命令行下运行的数据库连接工具gsql。此工具除了具…

【AI】在NVIDIA Jetson Orin Nano上使用tensorrtx部署yolov8

1、下载 1.1 权重文件下载 https://github.com/ultralytics/assets/releases本人下载的yolov8n.pt yolov8n-cls.pt:用于分类 yolov8n-pose.pt:用于姿势识别 yolov8n-seg.pt:用于对象分割 yolov8n-v8loader.pt:专用于人员检测器??? yolov8n.pt:用于对象检测 1.2 源码…

【Go|第7期】浅谈Lorca库中的Chromium命令行参数

日期:2023年7月9日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xff…

你想知道个人博客和企业博客具体区别吗?点进来看看吧

在互联网时代,越来越多人开始会去使用博客来记录生活中的点滴。博客已经成为了人们分享信息、表达观点的重要平台。无论是个人还是企业,都可以通过博客来传播自己的声音和观点。这篇文章looklook会聚焦于企业博客,从分析个人与企业博客的区别…

【峟思科普】水库监测点位布设原则

水库监测一般有常规监测、变形监测、应力监测和地质灾害监测等,其中变形监测是水库安全的重要保障,是通过安装在水库坝体或大坝周边的变形监测仪来测量坝体或坝基表面的变形情况,如位移、沉降、裂缝、倾斜等。下面给大家介绍下水库监测点位布…

Android复杂UI的性能优化实践 - PTQBookPageView 性能优化记录

作者:彭泰强 1 评价指标&优化成果 要做性能优化,首先得知道性能怎么度量、怎么表示。因为性能是一个很抽象的词,我们必须把它量化、可视化。那么,因为是UI组件优化,我首先选用了GPU呈现模式分析这一工具。 在手机…

高斯双边滤波

note 原理:从空间维度和灰度维度生成两个高斯滤波器,再合成一个高斯滤波器 空间域高斯滤波器:GaussSpace(x,y) exp(-1 * (x*x y*y) / 2 / sigma / sigma) / 2 / PI / sigma / sigma; 灰度域(颜色域)高斯滤波器:GaussColor(x,y) exp(-1 * (f(x,y) -…

Android性能优化

Android性能优化 一、卡顿优化 前言:说到卡顿我们可能正常能想到是FPS刷新率,这是一个平均值,FPS高并不代表页面流畅,比如一个页面某一贞耗时了160毫秒,但是其他都是16毫秒,那么这个页面通过FPS的数据来看…

Java去重的终极指南:性能对比与高效实现

文章目录 前言一、使用Set接口下面是对几种Set实现类的简单介绍及代码示例:1.HashSet:2.LinkedHashSet:3.TreeSet: 二、使用Stream API三、其他方式1.使用Collectors.toSet()方法:配合Stream API的collect()方法&#…

vue3+cesium项目搭建

前言 最近需要在一个Vue3的项目中使用到cesium,对于一个cesium没有太多了解的人来说,还是比较麻烦的,本篇博文就将自己在这个过程踩的坑记录下来,有需要的可以看一下 1、vuecesium框架搭建 2、项目运行起来后,球体不…

展会邀请|虹科诚邀您参加7月11-13日上海慕尼黑光博会

2023年上海慕尼黑光博会与机器视觉展将于7月11-13日在上海国家会展中心隆重召开! 慕尼黑上海光博会自2006年举办以来,已成为中国激光、光学、光电行业一年一度的聚会。慕尼黑上海光博会助力行业发展趋势, 集中展示涵盖激光器与光电子、光学与…

科技云报道:当云厂商主动拥抱生成式AI,会碰撞出什么样的火花?

科技云报道原创。 如果说这是AI大模型的时代,不如说是生成式AI的时代。 在AI大模型、生成式AI、ChatGPT这三者中,生成式AI是最广泛的概念,涵盖了所有使用AI生成新内容的应用。 大模型是实现生成式AI的一种方式,而ChatGPT则是大…

精选了20个Python实战项目(附源码),拿走就用!零基础练手不二项目!

Python是目前最好的编程语言之一。由于其可读性和对初学者的友好性,已被广泛使用。 那么要想学会并掌握Python,可以实战的练习项目是必不可少的。 接下来,我将给大家介绍20个非常实用的Python项目,帮助大家更好的学习Python。 …

电表是怎么计算度数的

电表是一种用来测量电能的仪表,也称为电度表、火表、电能表、千瓦小时表等。电表可以通过测量电流、电压、功率等因素来计算用户消耗的电能,从而确定用户应缴纳的电费。在本文中,我们将详细介绍电表的计算方式以及如何读取电表的度数。 一、电…

自学网络安全(黑客)

一、为什么选择网络安全? 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 未来3-5年,是安全行业的黄金发展期,提前踏入…

Android之WebView加载PDF链接预览PDF文件

文章目录 前言一、效果图二、实现步骤1.在项目main目录下新建一个assets2.新建一个js为index.js3.新建一个HTML为index.html4.xml布局4.Activity类(kotlin)5.Activity类(Java) 总结 前言 Android的webview压根就不支持加载pdf&am…

深度卷积网络的实际应用

1、三种经典的深度卷积网络 1.1、LeNet-5 使用 sigmoid 函数和 tanh 函数,而不是ReLu 函数,这篇论文中使用的正是 sigmoid 函数和 tanh 函数LeNet-5 是针对灰度图片训练的,所以图片的大小只有 32321 6 个 55 的过滤器,步幅为 …

【如何在深度学习的道路上越走越远?】

作为近几年人工智能领域的主要研究方向之一,深度学习主要通过构建深度卷积神经网络和采用大量样本数据作为输入,最终得到-一个具有强大分析能力和识别能力的模型。深度学习可以是有监督的、半监督的或无监督的。深度学习架构(例如深度神经网络、深度信念…

el-input输入框type=“number“时,禁止鼠标上下滑动改变数值

el-input输入框type"number"时,禁止鼠标上下滑动改变数值 解决方法:在el-input中添加属性设置 mousewheel.native.prevent

【达哥讲网络——只讲你不知道的】第1集:网络体系结构中的功能模块

大家好,经过公司缜密的思考和策划,【达哥讲网络——只讲你不知道的】系列连载今天正式与大家见面了。经过深入考虑,本系列只对一些重要的网络技术原理、网络功能实现原理及配置进行连载,其中会穿插一些实战案例,以帮助…