文章目录
- 基于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、按键等方便扩展和进行其他功能的添加。
禁止转载!!!