本设计:
基于STM32老人防跌倒报警GSM短信GPS定位设计(程序+原理图+PCB)
编号C0025
下载链接
C0025 网盘链接
功能描述:
本系统由基于STM32单片机的核心板、ADXL345加速度传感器、GSM、GPS模块、指示灯、按键电率+蜂鸣器报警及电源组成。
1、板子正常情况下是竖直装在口袋里的(adxl345模块在下角竖直立着),一旦倾角传感器检测到平放即摔倒,蜂鸣器报警,且摔倒的时间持续超过15秒短信报警(15秒是为了确定老人已经跌倒且15秒钟都没有自行爬起来,需要报警提醒周围的人帮忙)。如果老人没有跌倒,而是弯腰等等,这属于误报警,则老人可以自己用按键取消键取消警报。
2、触发GSM模块实现短信的发送, 设备将会向人员发送信息,包括所在位置经纬度信息。
3、短信处理及初始化有状态指示灯指示。
注:GSM上电有几秒初始化,系统供电电源至少要支持5V/2A,GPS天线必须放到漏天位置。
原理图:
PCB:
源程序:
#include “led.h”
#include “delay.h”
#include “sys.h”
#include “timer.h”
#include “key.h”
#include “usart.h”
#include <string.h>
#include “adxl345.h”
unsigned char BufTab[10]; //wifi数据暂存
unsigned char Count; //串口数据计数
unsigned char UartBusy=0; //盘忙
unsigned char ReadFlag=0;//读取标志
unsigned char sendDataFlag=0;//发送短信标志
unsigned char i ;
unsigned char ReadAdxl345; //定时读取adxl345数据
unsigned char ErrorNum=0; //记录错误次数
unsigned char CheckNum=0; //检测次数
unsigned long ReportLater=0; //上报延时
unsigned long KeyLater=3; //按键延时计数
unsigned long Mid_Du; //经纬度处理 度
unsigned long Mid_Fen; //经纬度处理 分
unsigned long Mid_Vale; //经纬度处理 中间变量
char Lin0_No[16]=“N:000.000000”;//存储纬度
char Lin1_Ea[16]=“E:000.000000”;//存储经度
char Crtl_Z[1]={0x1a}; //发送短信标志
void dealGps(void) ;//gps数据处理
int main(void)
{
delay_init(); //延时函数初始化
NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init(); //初始化与LED连接的硬件接?
KEY_Init();
uart_init(9600);
uart2_init(9600) ;
1
2
3
4
5
6TIM3_Int_Init(499,7199);//10Khz的计数频率,计数到500为50ms BUZZER = 1;delay_ms(100);BUZZER = 0; //初始化 GSM_LED = 0; i=5; while(i--) delay_ms(100);//延时
Init_ADXL345();
if(Single_Read_ADXL345(0X00)==0xe5)
{
delay_ms(5);
}
else
{
delay_ms(3);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57UART_SendStr(USART1 ,"AT+CMGF=1rn",11); //设置字符集 i=10; while(i--) delay_ms(100);//延时 UART_SendStr(USART1 ,"AT+CSCS="GSM"rn",15);//设置文本? i=10; while(i--) delay_ms(100);//延时 GSM_LED =1; //关闭LED指示 while(1) { if(ReadAdxl345== 1) //定时读取adxl345数据 { ReadAdxl345= 0; ReadData_x(); //三轴检测函数 CheckNum++; if((temp_X<550)||(temp_X>10000)) //方位值判断 查看正常次数 { ErrorNum++; } if(CheckNum>=5) //进行5次处理 { if(KeyLater>=3) //非按键下 { if(ErrorNum>=1) //角度出现错误 5次出息1次情况 { BUZZER = 1; //打开蜂鸣器 } else { BUZZER = 0; //关闭蜂鸣器 ReportLater=0; //上报延时计数 } } ErrorNum=0; //清空滤波计数 CheckNum=0; } } if(ReportLater>=15) //15s { GSM_LED = 0; UART_SendStr(USART1 ,"AT+CMGF=1rn",11); //设置字符集 i=3; while(i--) delay_ms(100);//延时 UART_SendStr(USART1 ,"AT+CSCS="GSM"rn",15);//设置文本 i=3; while(i--) delay_ms(100);//延时 UART_SendStr(USART1 ,"AT+CMGSM="+8615555183057"rn",26); //测试号//**All notes can be deleted and modified**//
// UART_SendStr(USART1 ,“AT+CMGS=”+8615542546521"rn",26); //测试号
i=2;
while(i–) delay_ms(100);//延时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42UART_SendStr(USART1 ,"help me!",8); //发送经度 if(sysmode_GPS==1) //gps有效 { sysmode_GPS=0; dealGps(); UART_SendStr(USART1 ,Lin0_No,12); //发送纬度 UART_SendStr(USART1 ,Lin1_Ea,12); //发送经度 } else { UART_SendStr(USART1 ,"gps linking...",14); //gps无信号 } delay_ms(200);//延时 UART_SendStr(USART1 ,( char *)Crtl_Z, 1); //发送 i=40; while(i--) delay_ms(100);//延时 GSM_LED =1; //led关闭 ReportLater=0; //上报标志清空 KeyLater=0; //按键清零延时处理 } if(key==0) //按键处理 { delay_ms(3); //按键消抖动 if(key ==0) //按键处理 { ReportLater=0; //按键延时上报 BUZZER = 0; //关闭蜂鸣器 KeyLater=0; //按键延时处理 } } }
}
void dealGps(void)
{
Mid_Du=(gps_infor_weijing[0]-0x30)*10000000+(gps_infor_weijing[1]-0x30)*1000000; //处理经度扩大10000000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42Mid_Fen=(gps_infor_weijing[2]-0x30)*10000000+(gps_infor_weijing[3]-0x30)*1000000+ (gps_infor_weijing[4]-0x30)*100000+(gps_infor_weijing[5]-0x30)*10000+ (gps_infor_weijing[6]-0x30)*1000+(gps_infor_weijing[7]-0x30)*100; Mid_Fen=Mid_Fen/60; //分秒换算为小数位 Mid_Vale=Mid_Du+Mid_Fen; //最终为度格式000.00000000 非度分秒格式 Lin0_No[0]='N'; Lin0_No[1]=':'; Lin0_No[2]='0'; Lin0_No[3]=Mid_Vale/10000000+0x30; //转化为字符 Lin0_No[4]=(Mid_Vale/1000000)%10+0x30; Lin0_No[5]='.'; Lin0_No[6]=(Mid_Vale/100000)%10+0x30; Lin0_No[7]=(Mid_Vale/10000)%10+0x30; Lin0_No[8]=(Mid_Vale/1000)%10+0x30; Lin0_No[9]=(Mid_Vale/100)%10+0x30; Lin0_No[10]=(Mid_Vale/10)%10+0x30; Lin0_No[11]=Mid_Vale%10+0x30; Mid_Du=(gps_infor_weijing[8]-0x30)*100000000+(gps_infor_weijing[9]-0x30)*10000000+(gps_infor_weijing[10]-0x30)*1000000; //处理经度扩大10000000 Mid_Fen=(gps_infor_weijing[11]-0x30)*10000000+(gps_infor_weijing[12]-0x30)*1000000+ (gps_infor_weijing[13]-0x30)*100000+(gps_infor_weijing[14]-0x30)*10000+ (gps_infor_weijing[15]-0x30)*1000+(gps_infor_weijing[16]-0x30)*100; Mid_Fen=Mid_Fen/60; //分秒换算为小数位 Mid_Vale=Mid_Du+Mid_Fen; //最终为度格式000.00000000 非度分秒格式 Lin1_Ea[0]='E'; Lin1_Ea[1]=':'; Lin1_Ea[2]=Mid_Vale/100000000+0x30; //转化为字符 Lin1_Ea[3]=(Mid_Vale/10000000)%10+0x30; Lin1_Ea[4]=(Mid_Vale/1000000)%10+0x30; Lin1_Ea[5]='.'; Lin1_Ea[6]=(Mid_Vale/100000)%10+0x30; Lin1_Ea[7]=(Mid_Vale/10000)%10+0x30; Lin1_Ea[8]=(Mid_Vale/1000)%10+0x30; Lin1_Ea[9]=(Mid_Vale/100)%10+0x30; Lin1_Ea[10]=(Mid_Vale/10)%10+0x30; Lin1_Ea[11]=Mid_Vale%10+0x30;
}
下载方式关注 下方中间的微信公众号,任意回复
最后
以上就是可爱奇异果最近收集整理的关于STM32老人防跌倒报警GSM短信GPS定位设计(程序+原理图+PCB)的全部内容,更多相关STM32老人防跌倒报警GSM短信GPS定位设计(程序+原理图+PCB)内容请搜索靠谱客的其他文章。
发表评论 取消回复