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