基于STM32的汽车防窒息系统

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

禁止转载!!!

  • 44
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

释博文

您的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值