功能:
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为50msInit_ADXL345(); // 初始化 adxl345if (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; // 按键延时处理}}}}
实物演示视频:
/video/BV1oR4y1k72M/