毕业设计 STM32自行车智能无线防盗报警器 -物联网 单片机 嵌入式

news2024/12/26 22:00:47

0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于STM32自行车智能无线防盗报警器

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:4分
  • 创新点:4分

1 课题背景

在某些区域,尤其是某些高校,电瓶车自行车偷盗行为猖獗,目前市场上的防盗报警器,一种是价格低廉的侦测到移动就狂叫的“报警器”,布防撤防还需要人为操作,没有有效的实际的慑止盗窃行为的能力;另一种就是价格高昂的使用GMS或GPRS通信的报警器,功能虽然强大,但是用户在购买昂贵硬件的同时还需要维护一张手机流量卡的费用,使用成本太过高昂,而且续航也不长。
在实际生活经验中发现人们普遍不会离开自己的车太远,一般都在5公里以内,且在加了不算太差的锁(某宝30块以上的)的情况下,盗窃行为一般需要一定时间才能成功。因此,产生了研制一款近场智能无线防盗报警器的想法。

2 主要器件

  • STM32L151C8T6
  • SC662K-3.3V
  • MPU605
  • 3.3v有源蜂鸣器
  • RGB三色LED
  • QX2301DCDC升压芯片
  • IntoRobot-L6 Lora通信模块
  • 电阻电容电感若干

3 实现效果

在这里插入图片描述

在这里插入图片描述

选用低功耗处理器STM32L151C8T6及六轴愦性传感器MPU6050,使用具备远距离及低功耗特性的LORA通信手段(sx1276芯片实现),作品分为用户端、车载端、社区公共管理端(可选组成部分),它们共用相同的硬件,仅软件层不同。通过布防状态下车载端监测到移动时发送一个包含自身电量等状态信息的无线数据包,用户端在收到信息后向车载端反馈一个数据包,根据无线信号RSSI值判断执行报警动作还是撤防动作,若停车区域附近物业管理方安装了社区公共管理端,在产生报警动作时,保安处亦能收到报警信息。除了这个主要功能外,作品还具有电池低电量提醒,翻转机身实现人机交互等功能。整个工作流程智能感应,自动撤防布防,实现了用户体验上的无感操作,全周期等效工作电流仅0.7ma左右,实现了长续航的目标,作品体积小,可毫无累赘感地串在钥匙串上。

4 实现原理

硬件组成框图
在这里插入图片描述
硬件部分的描述

PCB原理图
在这里插入图片描述
部分模块简介

STM32L151C8T6A

STM32L151C8T6A是一款超低功耗STM32 L1系列32位微控制器,集成了通用串行总线(USB)的连接能力和高性能ARM Cortex-M3 RISC内核,其工作频率为32MHz(33.3 DMIPS)。它具有存储器保护单元(MPU),高速嵌入式存储器(最大64kB的闪存和最大16KB的RAM)以及连接到两条APB总线的各种增强型I/O和外围设备。这些器件提供一个12位ADC,两个DAC,两个超低功耗比较器,六个通用16位定时器和两个基本定时器,它们可以用作时基。该设备包含标准和高级通信接口-两个I?C,两个SPI,三个USART和一个USB。
在这里插入图片描述

MPU6050

MPU-60x0是全球首例9轴运动处理传感器。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C或SPI接口输出一个9轴的信号(SPI接口仅在MPU-6000可用)。MPU-60x0也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。

在这里插入图片描述

MPU-60x0对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为±2,±4,±8,±16g。一个片上1024字节的FIFO,有助于降低系统功耗。和所有设备寄存器之间的通信采用400kHz的I2C接口或1MHz 的SPI接口(SPI仅MPU-6000可用)。对于需要高速传输的应用,对寄存器的读取和中断可用20MHz的SPI。另外,片上还内嵌了一个温度传感器和在工作环境下仅有±1%变动的振荡器。

系统组成框图

在这里插入图片描述
用户随身携带的用户端与对应的安装在自己车上的车载端形成最小系统,社区公共监控端是可选组成部分,其可接收任意车载端发出的异常报警信息从而提醒物业保安前往相应停车区域查看,当用户将车停在了安装了社区公共监控端的社区时,如若发生防盗报警,不仅用户能收到,社区管理处也能收到报警信息

5 部分核心代码

**主程序源码:**

/**
  ******************************************************************************
  * @file     main.c
  * @author   sheng
  * @date   2017-07-14
  * @version  V1.6.0
  * @brief
  ******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "bsp.h"

#define BUFFER_SIZE    9 // Define the payload size heres

static uint16_t BufferSize = BUFFER_SIZE;           // RF buffer size
static uint8_t Buffer[BUFFER_SIZE];                 // RF buffer

tRadioDriver *Radio = NULL;
uint8_t bike_state=STATUS_CALM;
uint8_t sending_flag=0;
/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/
/*
 * Manages the master operation
 */
void OnMaster( void )
{
    uint8_t i;

    switch( Radio->Process( ) )
    {
    case RF_RX_TIMEOUT:
              sending_flag=0;
            printf("RF_RX_TIMEOUT");
        break;
    case RF_RX_DONE:
        Radio->GetRxPacket( Buffer, ( uint16_t* )&BufferSize );
        if( BufferSize > 0 )
        {
            if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, 4 ) == 0 )
            {
                              if(SX1276LoRaGetPacketRssi()>(-70)){
                                     bike_locked=0;
                                     bike_calm_count=0;
                                     alarm_count=5;
                                     printf("UNCLOCK\r\n");
                                }
                                else{
                                     alarm_count=50;
                                     printf("ALARM\r\n");
                                }
                                sending_flag=0;
                                no_reply_count=0;
                                request_flag=0;

                printf("master get rx packet:");
                for(i = 0; i < 4; i++)
                {
                    printf("%c",Buffer[i]);
                }

                printf("\r\n");
                                printf("Rssi = %.3f \r\n", SX1276LoRaGetPacketRssi());

            }
        }
                Radio->StartRx( );
        break;
    case RF_TX_DONE:
        Radio->StartRx( );
        break;
    default:
        break;
    }
}

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  uint16_t needrun_flag=0,i,j;
  BSP_Init();
  Radio = RadioDriverInit( );

    Radio->Init( );
      idle_GPIO_Config();

    Radio->StartRx( );

    printf("sx1278 Test \r\n");
    uint32_t freqSx1278 = SX1276LoRaGetRFFrequency();
    printf("sx1278 frequency = %d \r\n", freqSx1278);
     SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP );

    while( 1 )
    {
             if(wakeup_fromstop_flag>0){
                  wakeup_fromstop_flag=0;
                  IWDG_Feed();
                    Prepare_Data();
                  prepare_data_flag=0;
                    bike_state=getBikeStateByAcc();
                        if((bike_locked>0)&&(sending_flag==0)){
                            if(bike_state==STATUS_MOVE){
                                if(lora_sleep_flag>0){
                                    SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
                                    lora_sleep_flag=0;
                                }
                                BAT_Value= Bat_Check();
                                for(i=0;i0)&&(no_reply_count==0)){
                                alarm_count=100;
                                sending_flag=0;
                                request_flag=0;
                            }
                        }
                        else if(bike_locked==0){
                            if(bike_state==STATUS_CALM)
                               bike_calm_count++;
                          else
                               bike_calm_count=0;
                            printf("bike_calm_count = %d \r\n", bike_calm_count);
                            if(bike_calm_count>25){
                                bike_locked=1;
                                ACC_move_square_calm=ACC_move_square;
                                alarm_count=5;
                            }
                        }
                if((request_flag==1)||(alarm_count>0))
                     needrun_flag=1;
                else
                     needrun_flag=0;
                if(needrun_flag>0){
                    __disable_irq();
                    OnMaster( );
                    __enable_irq();
                }
                else{
//                  printf("stop from sleep");
                    instopmode_flag=1;
                    beep_Close();
                    LED_CLOSE();
                    if(lora_sleep_flag==0){
                        SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP );
                        lora_sleep_flag=1;
                    }
                    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
                }
            }
            else{
                if(prepare_data_flag>0){
//                  printf("time2msstart:%d",time2ms);
                        Prepare_Data();
                        prepare_data_flag=0;
                        bike_state=getBikeStateByAcc();
                            if((bike_locked>0)&&(sending_flag==0)){
                                if(bike_state==STATUS_MOVE){
                                    if(lora_sleep_flag>0){
                                        SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
                                        lora_sleep_flag=0;
                                    }
                                    BAT_Value= Bat_Check();
                                    for(i=0;i0)&&(no_reply_count==0)){
                                    alarm_count=100;
                                    sending_flag=0;
                                    request_flag=0;
                                }
                            }
                            else if(bike_locked==0){
                                if(bike_state==STATUS_CALM)
                                     bike_calm_count++;
                                else
                                     bike_calm_count=0;
                                if(bike_calm_count>25){
                                    bike_locked=1;
                                    ACC_move_square_calm=ACC_move_square;
                                    alarm_count=5;
                                }
                            }
                    if((request_flag==1)||(alarm_count>0))
                         needrun_flag=1;
                    else
                         needrun_flag=0;
//                  printf("time2msstop:%d",time2ms);
                }
                    if(needrun_flag>0){
                        //__disable_irq();
                        OnMaster( );
                        //__enable_irq();
                    }
                    else{
                        printf("stop from normal");
                        instopmode_flag=1;
                        beep_Close();
                      LED_CLOSE();
                        if(lora_sleep_flag==0){
                            SX1276LoRaSetOpMode( RFLR_OPMODE_SLEEP );
                            lora_sleep_flag=1;
                      }
                        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
                    }
            }
    }
}

6 最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++进阶】C++11新特性下篇(万字详解)

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

京东前端高频vue面试题(边面边更)

Redux 和 Vuex 有什么区别&#xff0c;它们的共同思想 &#xff08;1&#xff09;Redux 和 Vuex区别 Vuex改进了Redux中的Action和Reducer函数&#xff0c;以mutations变化函数取代Reducer&#xff0c;无需switch&#xff0c;只需在对应的mutation函数里改变state值即可Vuex由…

【树莓派】擦灰重启行动

高中时候看大佬各种秀项目&#xff0c;于是乎兴致冲冲买了一块树莓派4B&#xff0c;400r&#xff0c;当时没想到光是开机&#xff0c;就折腾了两个星期~后来不出意外它在房间的角落很安逸地吃灰&#xff0c;但是&#xff0c;后来&#xff0c;我误打误撞学了CS&#xff0c;再误打…

Okhttp源码分析实践(五)【实践环节:Okhttp的基本框架搭建请求实现】

http的基础知识、okhttp的框架基本源码,我们通过之前课程都已学习总结过,接下来,就是关键的实践课程。 各位coder,需要紧跟小编脚步,要开始加速飙车了。 1.基本框架的搭建实现 既然不知道如何入手,我们不妨就以okhttp的基本使用代码为例,作为入手点,去开始编程实现。…

机器学习理论介绍

前言 图灵奖获得者、著名数据库专家James Gray 博士观察并总结人类自古以来&#xff0c;在科学研究上&#xff0c;先后历经了实验、理论、计算和数据四种范式。 科学研究第一种范式&#xff1a;实验 在古代&#xff0c;人们的认知水平较低&#xff0c;对事物的认识很大程度上…

React redux使用

1.redux是什么 redux是一个专门用于状态管理的JS库&#xff08;不是react插件库&#xff09; 它可以用在react,angular,vue等项目中&#xff0c;但基本与react配合使用 作用&#xff1a;集中式管理react应用中多个组件共享的状态 2.为什么要使用redux 某个组件的状态&#…

Windows命令行到底有多强大?

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store DevWeekly收集整理每周优质开发者内容&#xff0c;包括开源项目、资源工具、技术文章等方面。 每周五定期发布&#xff0c;同步更新到 知乎&#xff1a;Jackpop。 欢迎大家投稿&#xff0c;提交issu…

高可用系列文章之三 - NGINX 高可用实施方案

前文链接 高可用系列文章之一 - 概述 - 东风微鸣技术博客 (ewhisper.cn)高可用系列文章之二 - 传统分层架构技术方案 - 东风微鸣技术博客 (ewhisper.cn) 四 NGINX 高可用实施方案 高可用的实施, 主要步骤概述如下: NGINX 的安装及基础配置负载均衡层高可用: NGINX Keepali…

在BSV上运行深度神经网络

我们已经实现了一个用于手写数字分类的深度神经网络。已经训练好的模型完全在链上运行。它使用手写数字的 MNIST 数据集进行离线训练。该模型采用 28x28 灰度像素的图像并输出 0 到 9 的数字。 深度神经网络简介 人工神经网络是受生物神经网络启发而构建的。网络通过接触大量带…

[附源码]计算机毕业设计Python的小说阅读系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

智云通CRM:如何正确的提出报价?(一)

智云通CRM认为完成销售包括三个步骤&#xff1a;提出报价&#xff0c;解决最后问题&#xff0c;讨论下一步方案。 第一步是提出报价&#xff0c;首先我们讨论如何将提出报价。 在与客户讨论费用问题时&#xff0c;我们应当向客户提出两个不同报价&#xff0c;一个销售方案对应…

前缀和与差分算法

目录 一 前缀和 算法定义 算法分类 算法作用 一维前缀和 问题引入 暴力法&#xff1a; 前缀和法&#xff1a; 算法原理 问题解答 算法实践 江山白日梦 题目描述 题目解答 二维前缀和 问题引入 算法原理 问题解答 二 差分 算法定义 算法分类 算法作用 一…

torch.chunk与nn.Conv2d groups

torch.chunk 切分 假如特征x大小为&#xff1a;32x64x224x224 (BxCxHxW) q torch.chunk(x, 8, dim1) x是要切分的特征&#xff0c;8是要切分成几块&#xff0c;dim是指定切分的维度&#xff0c;这里等于1&#xff0c;就是按通道切分 就会将其按照通道&#xff0c;切分为8块&a…

【服务器数据恢复】服务器双循环riad5数据恢复案例

服务器数据恢复环境&#xff1a; 一台使用NTFS文件系统的服务器&#xff1b; 7块硬盘组成了一组raid5磁盘阵列。 服务器故障&初检&#xff1a; raid5磁盘阵列磁盘故障离线导致服务器瘫痪。用户在处理掉线磁盘时只添加新的硬盘rebuild&#xff0c;并没有将掉线的3块硬盘从阵…

CARLA在Windows上的安装与运行

0.写在前面 其实官方文档写的很详细&#xff0c;所有细节都有涉及&#xff0c;不过暂时没有中文版。本文写作目的&#xff0c;一个是作为自己的操作笔记&#xff0c;二个是帮助一些更习惯看中文版本的一些朋友 https://carla.readthedocs.io/en/latest/start_quickstart/ 这是…

Sentinel-1产品定义与产品格式(CSDN_0001_20220904)

&#xff08;文章编号&#xff1a;CSDN_0001_20220904&#xff09; 目录 1. 概述 1.1 地球物理测量 1.2 极化 1.3 干涉 2. 产品级别和产品类型 2.1 Level-0 2.2 Level-1 2.1.1 SLC 2.1.2 GRD 2.2 Level-2 3. 产品文件 3.1 组织结构 3.1.1 Annotation measuremen…

MySQL(十二):阿里巴巴 MySQL binlog 增量订阅消费Canal组件

https://github.com/alibaba/canal 使用 Binlog 实时更新Redis缓存 Mysql 服务器准备Canal 服务器准备Canal Client测试 基于 Binlog实现跨系统实时数据同步 更换数据库实现比对和补偿程序 安全地实现数据备份和恢复 使用 Binlog 实时更新Redis缓存 Mysql 服务器准备 查看当…

毫米波电路的PCB设计和加工(第一部分)

毫米波应用要点——相位精度受许多变量影响 从自动驾驶车辆上使用的防碰雷达系统到第五代&#xff08;5G&#xff09;高数据速率新无线&#xff08;NR&#xff09;网络技术&#xff0c;毫米波&#xff08;mmWave&#xff09;电路的应用领域正在快速增长。许多应用正在促进工作…

锐浪报表 Grid++Report 导出其它格式文件

锐浪报表 GridReport 导出其它格式文件 GridReport控件设计的报表&#xff0c;不仅可以打印&#xff0c;还可以导出8种格式的报表文件。 在GridReport的打印浏览中&#xff0c;有指定导出文件的对话框&#xff1a; 但是&#xff0c;软件的设计中&#xff0c;往往需要设计出&am…

黑*头条_第5章_延迟任务精准发布文章(新版)

黑*头条_第5章_延迟任务精准发布文章(新版) 文章目录黑*头条_第5章_延迟任务精准发布文章(新版)1)文章定时发布2)延迟任务概述2.1)什么是延迟任务2.2)技术对比2.2.1)DelayQueue2.2.2)RabbitMQ实现延迟任务2.2.3)redis实现3)redis实现延迟任务4)延迟任务服务实现4.1)搭建heima-l…