基于STM32单片机老人防跌倒报警系统GSM短信上报原理图PCB

功能:
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;    // 按键延时处理
            }
        }
    }
}

实物演示视频:
https://www.bilibili.com/video/BV1oR4y1k72M/

  • 4
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值