yd云顶集团官网以为:基于STM32自行车智能无线防盗报警器
- 难度系数:3分
- 工作量:4分
- 创新点:4分
在某些区域,尤其是某些高校,电瓶车自行车偷盗行为猖獗,目前市场上的防盗报警器,一种是价格低廉的侦测到移动就狂叫的“报警器”,布防撤防还需要人为操作,没有有效的实际的慑止盗窃行为的能力;另一种就是价格高昂的使用GMS或GPRS通信的报警器,功能虽然强大,但是用户在购买昂贵硬件的同时还需要维护一张手机流量卡的费用,使用成本太过高昂,而且续航也不长。
在实际生活经验中发现人们普遍不会离开自己的车太远,一般都在5公里以内,且在加了不算太差的锁(某宝30块以上的)的情况下,盗窃行为一般需要一定时间才能成功。因此,产生了研制一款近场智能无线防盗报警器的想法。
- STM32L151C8T6
- SC662K-3.3V
- MPU605
- 3.3v有源蜂鸣器
- RGB三色LED
- QX2301DCDC升压芯片
- IntoRobot-L6 Lora通信模块
- 电阻电容电感若干

硬件组成框图
硬件部分的描述
PCB原理图
部分模块简介
STM32L151C8T6A
STM32L151C8T6A是一款超低功耗STM32 L1系列32位微控制器,集成了通用串行总线(USB)的连接能力和高性能ARM Cortex-M3 RISC内核,其工作频率为32MHz(33.3 DMIPS)。欢迎光临welcome云顶集团yd云顶集团官网以为:它具有存储器保护单元(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可用)。yd12300云顶线路yd云顶集团官网说:MPU-60x0也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。
MPU-60x0对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。yd2333云顶电子游戏yd云顶集团官网以为:为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±500,±1000,±2000°/秒(dps),加速度计可测范围为±2,±4,±8,±16g。一个片上1024字节的FIFO,有助于降低系统功耗。单片机yd云顶集团官网说:和所有设备寄存器之间的通信采用400kHz的I2C接口或1MHz 的SPI接口(SPI仅MPU-6000可用)。对于需要高速传输的应用,对寄存器的读取和中断可用20MHz的SPI。另外,片上还内嵌了一个温度传感器和在工作环境下仅有±1%变动的振荡器。
系统组成框图
用户随身携带的用户端与对应的安装在自己车上的车载端形成最小系统,社区公共监控端是可选组成部分,其可接收任意车载端发出的异常报警信息从而提醒物业保安前往相应停车区域查看,当用户将车停在了安装了社区公共监控端的社区时,如若发生防盗报警,不仅用户能收到,社区管理处也能收到报警信息
**主程序源码:**
/**
******************************************************************************
* @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);
}
}
}
}
完整代码可进群免费领取。
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!
点击这里找小助理0元领取:扫码进群领资料