基于STM32的汽车防窒息系统

文章目录

  • 基于STM32的汽车防窒息系统
    • 系统简介
    • 材料
    • 展示视频
    • 制作
      • 硬件连接
      • 原理图
      • PCB
      • 实物图
      • GSM模块使用
        • GSM模块代码
      • SGP30模块
        • SGP30模块代码
      • 步进电机驱动
        • 步进电机代码
      • 其他模块
      • 主逻辑代码
    • 总结

基于STM32的汽车防窒息系统


系统简介

        随着社会的发展目前汽车的流行,汽车大量普及,小朋友也享受到了便利,但是由于粗心等原因将儿童遗留在车里,随着夏天到来,温度的升高,存在窒息等情况,本系统通过车内空气质量、二氧化碳浓度等来检测车内空气是否有害,通过人体红外传感器检测是否存在人,如果存在人再通过GSM模块通知其父母来解救儿童。

材料

  • STM32F103C8T6系统主控;
  • SGP30甲醛、二氧化碳浓度传感器;
  • MQ-5有害气体检测模块;
  • 人体红外传感器;
  • 二项四线步进电机;
  • SIM900A GSM模块 (需要用移动手机卡)
  • 0.96寸OLED屏幕;
  • DHT11温湿度模块。

使用Keil 5编程

展示视频

基于Stm32的防窒息系统

制作

硬件连接

  • SGP30采用IIC连接在PB0、PB1;
  • DHT11连接在PB11;
  • SIM900A连接在串口2-PA2、PA3;
  • MQ-5连接在PB12;
  • 人体红外连接在PA1;
  • 蜂鸣器连接在PA5;
  • OLED采用IIC连接在PB6、PB7;
  • 两个警报的LED灯连接在PA6、PA7;

原理图

在这里插入图片描述

PCB

在这里插入图片描述

实物图

在这里插入图片描述

GSM模块使用

GSM模块采用串口通信,通过AT指令来操控,具体操控办法可参考之前博客。https://blog.csdn.net/weixin_42320020/article/details/116004960

GSM模块代码
void sim800c_test(void)
{	OLED_CLS();sim800c_send_cmd((u8*)0X1A,"+CMGS:",10);sim800c_send_cmd("ATE0","OK",200);//2?????IWDG_ReloadCounter();while(sim800c_send_cmd("AT","OK",100))//检测是否应答AT指令 {OLED_ShowStr1(0,0,(char*)"SBLJZ   ",1);	//连接成功sim800c_send_cmd((u8*)0X1A,"+CMGS:",10);} while(sim800c_send_cmd("AT","OK",100))//检测是否应答AT指令 {OLED_ShowStr1(0,0,(char*)"SBLJZ   ",1);	//连接成功sim800c_send_cmd((u8*)0X1A,"+CMGS:",10);} OLED_ShowStr1(0,0,"LJCG   ",1);	//连接成功delay_ms(10); while(sim800c_send_cmd("AT+CMGF=1","OK",200)){}			//设置文本模式 OLED_ShowStr1(0,1,"WBMS   ",1);//文本模式while(sim800c_send_cmd("AT+CSCS=\"UCS2\"","OK",200)){}		//设置TE字符集为UCS2 while(sim800c_send_cmd("AT+CSMP=17,167,2,25","OK",200)){}	//设置编码方式 OLED_ShowStr1(0,2,"ZFMS   ",1);//字符模式//发送短信测试OLED_ShowStr1(0,3,"ZZSZ    ",1);	//正在发送if(sim800c_send_cmd("AT+CMGS=\"00310035003500350035003500350035003000350035\"",">",800) == 0);//短信对象手机号u2_printf("53D1751F7A92606F62166E295EA68FC79AD8FF0165516211FF01 ");	//发送短信内容			IWDG_ReloadCounter();if(sim800c_send_cmd((u8*)0X1A,"+CMGS:",800)==0){OLED_ShowStr1(0,4," FSCG   ",16);Index_sim800c = 600;return;}OLED_ShowStr1(0,4," FSSB   ",1);IWDG_ReloadCounter();delay_ms(2000); 
}

        需要注意的是,如果要发送中文短信,需要设置相应字符集以及编码方式,同时发送的手机号和短信内容都要转换为对应的UNICODE码。 执行代码后会向目标手机发送需要求助的短信。

SGP30模块

模块使用IIC方式进行通信

SGP30模块代码
u32 SGP30_Read(void)
{u32 dat;u8 crc;SGP30_IIC_Start();SGP30_IIC_Send_Byte(SGP30_read); //发送器件地址+读指令SGP30_IIC_Wait_Ack();dat = SGP30_IIC_Read_Byte(1);dat <<= 8;dat += SGP30_IIC_Read_Byte(1);crc = SGP30_IIC_Read_Byte(1); //crc数据,舍去crc = crc;  //为了不让出现编译警告dat <<= 8;dat += SGP30_IIC_Read_Byte(1);dat <<= 8;dat += SGP30_IIC_Read_Byte(0);SGP30_IIC_Stop();return(dat);
}void CO2_Read(void)
{SGP30_Write(0x20, 0x08);sgp30_dat = SGP30_Read();//读取SGP30的值CO2Data = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值TVOCData = sgp30_dat & 0x0000ffff;       //取出TVOC值
}

步进电机驱动

二相四线步进电机只有两个线圈A、B,两线圈正极A+、B+挨着,负极A-、B-挨着,由于要带动窗户玻璃下落,我们采用一二相励磁法(此励磁发扭矩大,输出稳定),只需要按照顺序驱动去驱动即可。
励磁顺序为:

A+A+、B+B+B+、A-A-A-、B-B-B-、A+
步进电机代码
void Motor(uint8_t State)
{static uint8_t Index = 0;if(State == 1){Index++;}else if(State == 2){Index--;}else{}switch(Index % 8){case 0:A1 = 1;B1 = 0;A2 = 0;B2 = 0;break;case 1:A1 = 1;B1 = 1;A2 = 0;B2 = 0;break;case 2:A1 = 0;B1 = 1;A2 = 0;B2 = 0;break;case 3:A1 = 0;B1 = 1;A2 = 1;B2 = 0;break;case 4:A1 = 0;B1 = 0;A2 = 1;B2 = 0;break;case 5:A1 = 0;B1 = 0;A2 = 1;B2 = 1;break;case 6:A1 = 0;B1 = 0;A2 = 0;B2 = 1;break;case 7:A1 = 1;B1 = 0;A2 = 0;B2 = 1;break;}
}

其他模块

其他模块比较常见就不一一赘述了。

主逻辑代码

void main(void)
{if(((CO2Data > 600)||(!MQ_5)||(temperature > 40))&&(ADC_x > 30)){BuzzerShortBi();if(!Index_sim800c)sim800c_test();//发送短信}DHT11_Data();ADC_x = Get_Adc(1) >> 5;sprintf((char*)Show, "D:%3d", (u16)(ADC_x));OLED_Show(80, 6, (u8*)Show);if((CO2Data > 600)||(!MQ_5))LED1 = !LED1;elseLED1 = 1;if(ADC_x > 30){LED0 = !LED0;}else{LED0 = 1;}SGP30_Write(0x20, 0x08);sgp30_dat = SGP30_Read();//读取SGP30的值CO2Data = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值TVOCData = sgp30_dat & 0x0000ffff;       //取出TVOC值sprintf((char *)Show,"CO2:%dppm  ",CO2Data);OLED_Show(0, 0, (u8*)Show);if(((CO2Data > 600)||(!MQ_5)||(temperature > 40))&&(ADC_x > 30)){if(Frne){Frne--;Motor(2);}}else{Motor(0);Frne = 100;}
}

总结

项目本身还是比较好的,还预留了ESP8266到串口2、按键等方便扩展和进行其他功能的添加。

禁止转载!!!

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

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

相关文章

GPT带我学-设计模式11-组合模式

设计模式类型 结构型设计模式 使用场景 将对象组合成树状结构来表现"部分-整体"的层次结构。这种模式能够使得客户端对单个对象和组合对象的使用具有一致性。这句话太抽象了&#xff0c;拿一个实际的网站菜单树例子来说。 例子&#xff1a;网页菜单树 一个网站的…

C++经典面试题目(十八)

1、请解释虚函数表的概念&#xff0c;并说明其在多态中的应用。 虚函数表&#xff08;Vtable&#xff09;是用于实现多态的一种机制&#xff0c;它是一个存储虚函数地址的表。每个含有虚函数的类都会有一个对应的虚函数表&#xff0c;其中存放着该类的虚函数的地址。当对象被创…

【CSS】伪元素

伪元素 常见的伪元素 ::first-line::first-letter::before 在元素第一个子元素前增加内容::after 在元素最后一个子元素后增加内容 为了区分伪类和伪元素&#xff0c;建议伪元素都使用2个冒号::first-line可以针对首行文本设置属性::first-letter可以针首字母设置属性::before…

【技巧】如何解除Excel“打开密码”?

给Excel表格设置“打开密码”&#xff0c;可以保护表格不被他人随意打开&#xff0c;那如果后续不需要保护了&#xff0c;不想每次打开Excel都需要输密码&#xff0c;要怎么去除“打开密码”呢&#xff1f; 今天分享3个方法&#xff0c;最后一个方法记得收藏起来&#xff0c;以…

基于51单片机的智能报警系统Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/10dhkyV5O629UpFHHV67LpQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectroni…

源码|并发一枝花之CopyOnWriteArrayList

CopyOnWriteArrayList的设计思想非常简单&#xff0c;但在设计层面有一些小问题需要注意。 JDK版本&#xff1a;oracle java 1.8.0_102 本来不想写的&#xff0c;但是github上CopyOnWriteArrayList的code results也有165k&#xff0c;为了流量还是写一写吧。 实现 看两个方法你…

LVS、HAProxy

集群&#xff1a;将很多个机器组织到一起&#xff0c;作为一个整体对外提供服务。集群在扩展性、性能方面都可以做到很灵活。集群的分类&#xff1a;负载均衡集群&#xff1a;Load Balance。高可用集群&#xff1a;High Available。高性能集群&#xff1a;High Performance Com…

Python学习从0到1 day20 第二阶段 面向对象 ② 封装

缘分 朝生暮死犹如露水 —— 24.4.1 学习目标&#xff1a; 1.理解封装的概念 2.掌握私有成员的使用 一、面向对象三大特性&#xff1a; 面向对象编程&#xff0c;是许多编程语言都支持的一种编程思想 简单理解是&#xff1a;基于模板&#xff08;类&#xff09;去创建实体&…

请解释一下Velocity模板引擎的基本工作原理是什么?在Velocity中,如何定义和使用变量?

请解释一下Velocity模板引擎的基本工作原理是什么&#xff1f; Velocity模板引擎的基本工作原理可以概括为将数据模型与模板文件相结合&#xff0c;通过解析模板中的指令和占位符&#xff0c;将数据模型的内容填充到模板中&#xff0c;最终生成所需的文本输出。 具体来说&…

一个基于大数据的派单管理系统

通常需要处理大量的订单数据&#xff0c;并确保这些数据能够在各个相关部门之间高效、准确地传递。这样的系统不仅有助于提高派单效率&#xff0c;还能优化资源配置&#xff0c;减少不必要的浪费。以下是一个包含所需元素的系统设计方案概述&#xff1a; 数据结构 订单号&…

枚举---算法

1、定义 枚举算法&#xff1a;也称之为穷举算法&#xff0c;这种算法就是在解决问题的时候去使用所有的方式去解决这个问题&#xff0c;会通过推理去考虑事件发生的每一种可能&#xff0c;最后推导出结果。优点&#xff1a;简单粗暴&#xff0c;它暴力的枚举所有可能&#xff…

Mysql故障和优化

一、MySQL故障 二、MySQL优化 1.硬件优化&#xff1a; 2.数据库设计与规划 1.提前估计数据量&#xff0c;使用什么存储引擎 2.数据库服务器专机专用&#xff0c;避免额外的服务可能导致的性能下降和不稳定性 3.增加多台服务器&#xff0c;以达到稳定、高效的效果。主从同步、…

Flask Response生成流式数据api;iter_lines,iter_content遍历区别

1、Flask Response生成流式数据api 注意return与def generate():是同级的 from flask import Flask, Responseapp Flask(__name__)app.route(/stream) def stream_data():def generate():for i in range(5):time.sleep(1)yield f"Data chunk {i}\0" # 在每个数据…

风控系统:通过净值及盈亏开启和关闭自动交易

一、风控对交易员的好处 帮助交易员执行交易纪律并保护他们的交易资金。 纪律风控&#xff1a;对不符合交易纪律的交易执行风控&#xff0c;对交易纪律性差的交易员执行约束操作。净值风控&#xff1a;对满足条件的净值执行风控&#xff0c;防止交易员的账户净值过度下降。手数…

Mysql的库函数

MySQL是一个流行的开源关系型数据库管理系统&#xff0c;它提供了大量的内置库函数&#xff0c;用于在查询时执行各种操作。这些函数可以帮助开发者在数据检索、转换和处理过程中实现更复杂的逻辑。 1 字符串函数 函数描述ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。CHA…

Memory Analyzer Tool使用教程

下载地址&#xff1a;https://eclipse.dev/mat/previousReleases.php 下载JDK8对应的MAT版本 使用jps查看pid jps 使用jmap生成heap dump文件 jmap -dump:formatb,live,filexxx.bin <pid> 使用MAT打开heap dump文件 查看GC Roots

【Linux入门】Linux简史

Linux 是什么&#xff1f;Linux 是一款叫做操作系统的软件。 操作系统这款软件有什么样的意义呢&#xff1f;简单来说&#xff0c;比如有顾客买了一台笔记本电脑&#xff0c;这台笔记本电脑由电脑硬件组成&#xff0c;在这堆硬件上一定搭载了一款操作系统。正因为操作系统存在&…

ssm013小型企业办公自动化系统的设计和开发+vue

小型企业办公自动化系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对小型企业办公信息管理混乱&am…

git删除某次commit的代码

这里写目录标题 1.问题背景2.问题拆解尝试&#xff1a;a.使用git reset --hard HEAD &#xff08;不行&#xff0c;局限性太大&#xff09;尝试&#xff1a;b.使用git rebase -i HEAD &#xff08;可以&#xff0c;但push -f不太友好&#xff09;尝试&#xff1a;c.使用git rev…

C语言中,`while` 和 `for` 的区别

在C语言中&#xff0c;while 和 for 是两种循环结构&#xff0c;它们的作用是执行一段代码多次&#xff0c;直到满足某个条件为止。虽然它们可以互相替代&#xff0c;但通常根据具体的情况选择使用其中之一。 **区别&#xff1a;** 1. **语法结构&#xff1a;** - while 循…