基于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;
    else
        LED1 = 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、按键等方便扩展和进行其他功能的添加。

禁止转载!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

骨传导耳机哪个品牌最好?精选五大热销产品深度测评!

作为一个经验丰富的数码测评师&#xff0c;我经常在生活中使用各类数码产品&#xff0c;骨传导耳机就是其中之一&#xff0c;但在之前&#xff0c;选购骨传导耳机的时候也踩到过不少的坑&#xff0c;因为随着骨传导耳机逐渐热门&#xff0c;一些劣质品牌逐渐进入市场中&#xf…

京东云4核16G服务器优惠价格26元1个月、658元1年、三年3098元

京东云4核16G服务器优惠价格26元1个月、80元3个月、658元1年、3098元三年&#xff0c;配置为&#xff1a;轻量云主机4C16G-220G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云优惠活动 atengyun.com/go/jd 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如下…

代码随想录训练营Day37:● 738.单调递增的数字 ● 968.监控二叉树 ● 总结

738.单调递增的数字 题目链接 https://leetcode.cn/problems/monotone-increasing-digits/description/ 题目描述 思路 从后往前遍历数字的每一位&#xff0c;如果前一位大于后一位&#xff0c;则将其减一&#xff0c;后边的一位取 i-9 中最大的 解答的两点疑惑&#xff1a;…

【Java多线程】5——Lock底层原理

5 Lock底层原理 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&…

错误:ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+

错误现象 解决方法&#xff1a; 将urllib3 降级 pip install urllib31.25.11

震惊!AI生成真人视频毫无瑕疵,台词随意变!HeyGen硬核升级数字人

2024年3月21日&#xff0c;HeyGen 5.0 正式发布&#xff01;这款革命性的AIGC产品将AI数字人的魔力融入视频创作&#xff0c;以其简洁易用的特性&#xff0c;让视频制作变得轻而易举。 只需几次点击&#xff0c;即可打造出令人惊叹的高品质视频作品&#xff01; 不仅如此&…

HarmonyOS入门--页面和自定义组件生命周期

文章目录 页面和自定义组件生命周期页面生命周期组件生命周期生命周期的调用时机 页面和自定义组件生命周期 生命周期流程如下图所示&#xff0c;下图展示的是被Entry装饰的组件&#xff08;首页&#xff09;生命周期。 自定义组件和页面的关系&#xff1a; 自定义组件&…

学习【Redis实战篇】这一篇就够了

目录 1. 短信登录1-1. 技术点redis存储token拦截器刷新token有效期 1-2. 业务登录注册 2. 商户查询缓存1-1. 技术点缓存更新策略缓存穿透缓存雪崩缓存击穿 1-2. 业务查询缓存的商铺信息 3. 优惠卷秒杀3-1. 技术点全局唯一ID乐观锁基于Redis实现分布式锁基于Redisson实现分布式锁…

2024年智能版控费系统方案卓健易控

2024年智能版控费系统方案卓健易控 详细可咨询&#xff1a;19138173009 设备智能卓健易控ZJ-V8.0控费方案在科学和技术不断发展的背景下&#xff0c;逐渐实现了更新和迭代。现如今&#xff0c;感应技术、生物识别技术、智能图像识别技术、过程记录技术、监管控制技术等方面的…

halcon例程学习——ball.hdev

dev_update_window (off) dev_close_window () dev_open_window (0, 0, 728, 512, black, WindowID) read_image (Bond, die/die_03) dev_display (Bond) set_display_font (WindowID, 14, mono, true, false) *自带的 提示继续 disp_continue_message (WindowID, black, true)…

多个微信这样高效管理

随着微信成为企业商务沟通的主要平台&#xff0c;一些业务咨询量较大的行业&#xff0c;如教育培训、旅游、美容及医疗等&#xff0c;通过微信开展营销活动和客户服务过程中&#xff0c;经常面临多微信管理难题。 在这种情况下&#xff0c;采用微信线上业务模式&#xff0c;需…

Spring-IoC-属性注入的注解实现

1、创建对象的注解 Component 用于声明Bean对象的注解&#xff0c;在类上添加该注解后&#xff0c;表示将该类创建对象的权限交给Spring容器。可以直接将这些类直接创建&#xff0c;使用的时候可以直接用。 注解的value属性用于指定bean的id值&#xff0c;value可以省略&…

牛客JZ21-调整数组顺序使奇数位于偶数前面

目录 问题描述示例具体思路思路一 代码实现 问题描述 输入一个长度为 n 整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有的奇数位于数组的前面部分&#xff0c;所有的偶数位于数组的后面部分&#xff0c;并保证奇数和奇数&#xff0c;偶数和偶数…

12.Java语言的发展

JAVA语言的诞生是具有一定戏剧性的&#xff0c;可以说是命运多舛&#xff0c;差点凉凉&#xff0c;差点GG&#xff0c;差点嗝屁。 在1990年的时候Sun&#xff08;Stanford University Network&#xff1a;斯坦福大学网络&#xff09;公司成立了一个由 James Gosling 领导的Gree…

【unity】unity安装及路线图

学习路线图 二、有关unity的下载 由于unity公司是在国外&#xff0c;所以.com版&#xff08;https://developer.unity.cn/&#xff09;不一定稳定&#xff0c;学习时推荐从.cn国内版&#xff08;https://developer.unity.cn/&#xff09;前往下载&#xff0c;但是后期仍需回…

通过dockerfile制作代码编译maven3.8.8+jdk17 基础镜像

一、背景&#xff1a; paas平台维护过程中有一个流水线的工作需要支持运维&#xff0c;最近有研发提出新的需求要制作一个代码编译的基础镜像出来&#xff0c;代码编译的基础镜像需求如下&#xff1a; maven版本&#xff1a;3.8.8版本 jdk版本&#xff1a;17版本&#xff0c;小…

C++中的STL简介与string类

目录 STL简介 STL的版本 STL的六大组件 string类 标准库中的string类 string类的常用接口 string类对象对容量的操作 size()函数与length()函数 capacity()函数 capacity的扩容方式 reserve()函数 resize()函数 string类对象的操作 push_back()函数 append()函数 operator()函数…

Redis与数据库的一致性

Redis与数据库的数据一致性 在使用Redis作为应用缓存来提高数据的读性能时&#xff0c;经常会遇到Redis与数据库的数据一致性问题。简单来说&#xff0c;就是同一份数据同时存在于Redis和数据库&#xff0c;如何在数据更新的时候&#xff0c;保证两边数据的一致性。首先&#…

用Blender给MetaHuman不同胖瘦身体模型做插值,计算过度模型

用Blender给MetaHuman不同胖瘦身体模型做插值&#xff0c;计算过度模型 本篇文章所有想法和代码均为ChatGPT所写 需求&#xff1a;MetaHuman的身体有瘦、标准、胖三个体型&#xff0c;想要通过三个体型插值计算出符合用户体型的更多模型 建议&#xff1a;chatGPT建议用Blender&…

Mysql数据库:主从复制与读写分离

目录 前言 一、Mysql主从复制概述 1、Mysql主从复制概念 2、Mysql主从复制功能和使用场景 2.1 功能&#xff08;为何使用主从复制&#xff09; 2.2 适用场景&#xff08;何时使用主从复制&#xff09; 3、Mysql复制的类型 3.1 基于SQL语句的复制&#xff08;Statement默…