功能:
0.本项目采用STM32F103C8T6作为单片机系统的控制MCU
1.本项目采用倾角传感器adxl345模块,实时检测老人的状态角度。
2.采用GSM模块实现短信的发送,只要老人跌倒了(且没有按下解除误报警操作按钮),设备将会向设定的手机号码发送求救短信。
3.板子正常情况下是竖直装在口袋里的(adxl345模块在下角竖直立着),一旦倾角传感器检测到老人摔倒,蜂鸣器将会鸣叫报警,且摔倒的时间超过约15秒短信上报(延迟15秒是为了确定老人已经跌倒且15秒钟都没有自行爬起来,设备认为老人跌倒伤的过重,需要报警提醒周围的人帮忙)。如果老人没有跌倒,而是弯腰等等,这属于误报警,则老人可以自己用按键取消键取消警报。
4.采用DC002作为电源接口可直接输入5V给整个系统供电
注意:该GSM模块的瞬时功耗大,因此大家在供电的时候需要具备电源2A的供电能力
原理图:
PCB :
主程序:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include <math.h>
#include "adxl345.h"
#include "gsm_at.h"
#include "data_unit.h"
#include "internal_flash.h"
unsigned char i;
unsigned char ReadAdxl345; // 定时读取adxl345数据
unsigned char ErrorNum = 0; // 记录错误次数
unsigned char CheckNum = 0; // 检测次数
unsigned long reportLater = 0; // 上报延时
unsigned long keyLater = 3; // 按键延时计数
unsigned char err_num = 0;
char Crtl_Z[1] = {0x1a}; // 短信发出标志
int main(void)
{
delay_init(); // 延时函数初始化
NVIC_Configuration(); // 设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init(); // 初始化与LED连接的硬件接
KEY_Init();
UART_Init(115200);
TIM3_Int_Init(499, 7199); // 10Khz的计数频率,计数到500为50ms
Init_ADXL345(); // 初始化 adxl345
if (Single_Read_ADXL345(0X00) == 0xe5) // 读取寄存器值 看是否初始化成功
{
delay_ms(5);
}
else
{
delay_ms(3);
}
delay_ms(1000); // 延时
delay_ms(1000); // 延时
delay_ms(1000); // 延时
err_num = GSM_Init(); // GSM初始化
delay_ms(10);
if (gsm_init_flag) // 初始化完成
{
err_num = GSM_Text_Mode(); // GSM 设置Text模式
}
delay_ms(10);
if (gsm_config_flag)
{
err_num = GSM_Delete_All_Sms(); // 删除所有短信
}
if (!(gsm_init_flag || gsm_config_flag || gsm_delete_flag)) // AT命令报错,蜂鸣器响5声
{
unsigned char i = 0;
for (i = 0; i < 5; i++)
{
BUZZER_ON;
LED_GSM_ON;
delay_ms(250);
BUZZER_OFF;
LED_GSM_OFF;
delay_ms(250);
}
}
else // GSM初始化完成蜂鸣器响一声
{
BUZZER_ON;
LED_GSM_ON;
delay_ms(1000);
BUZZER_OFF;
LED_GSM_OFF;
}
if (!KEY) //开机过程中按键,初始化电话号码为xxxxxxxxxxx
{
delay_ms(20);
if (!KEY)
{
unsigned char i = 0;
for (i = 1; i < 12; i++)
{
phone1[i] = 'x';
}
WriteIntFlash();//写入接收短信电话号码
BUZZER_ON;
LED_GSM_ON;
delay_ms(1000);
BUZZER_OFF;
LED_GSM_OFF;
UART_Send_Str(phone1, 15);
}
}
ReadIntFlash(); //读取接收短信电话号码
UART_Send_Str(phone1, 15);
LED_GSM_OFF;
BUZZER_OFF;
while (1)
{
gsm_receive_process(); //gsm接收处理
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) // 角度出现错误
{
BUZZER_ON; // 打开蜂鸣器
}
else
{
BUZZER_OFF; // 关闭蜂鸣器
reportLater = 0; // 上报延时计数
}
}
ErrorNum = 0; // 清空滤波计数
CheckNum = 0;
}
}
if (gsm_send_failed_flag == 0)
{
if (reportLater >= 30) // 30s
{
if (GSM_Send_Sms(phone1, "Help me!!") != 0)
{ // 发送失败则报警,可能没有设定初始号码
gsm_send_failed_flag = 1;
for (i = 0; i < 5; i++)
{
BUZZER_ON;
LED_GSM_ON;
delay_ms(250);
BUZZER_OFF;
LED_GSM_OFF;
delay_ms(250);
}
}
if (gsm_send_flag == 1) // 发送成功,蜂鸣器响一声
{
gsm_send_flag = 0;
BUZZER_ON;
LED_GSM_ON;
delay_ms(1000);
BUZZER_OFF;
LED_GSM_OFF;
}
reportLater = 0; // 上报标志清空
keyLater = 0; // 按键清零延时处理
}
}
if (KEY == 0) // 按键处理
{
delay_ms(3); // 按键消抖动
if (KEY == 0) // 按键处理
{
reportLater = 0; // 按键延时上报
BUZZER_OFF; // 关闭蜂鸣器
keyLater = 0; // 按键延时处理
}
}
}
}