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);
}
}
}
}