STM32-电动车报警器

STM32-电动车报警器

1.振动传感器点亮LED灯

需求:当振动传感器接收到振动信号时,使用中断方式点亮LED1

c 复制代码
//重写中断服务函数,如果检测到EXTI中断请求,则进入此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    //一根中断线上接有多个中断源,判断中断请求是否来自PA4
    if(GPIO_Pin == GPIO_PIN_4)
    {
        //如果检测到PA4被拉低
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET)
        {
            //则点亮LED1
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
            //延时1秒
            HAL_Delay(1000);
            //关闭LED1
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
        }
        else
        {
            //未检测到PA4被拉低,则关闭LED1
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
        }
    }
}

如果直接在中断服务函数里调用 HAL_Delay 函数,则会造成系统卡死。

原因:程序初始化时默认把滴答定时器的中断优先级设为最低,其它中断源很容易打断它导致卡死。

解决:在 main 函数里使用以下函数提高滴答定时器的中断优先级(提升至0):

c 复制代码
HAL_NVIC_SetPriority(SysTick_IRQn,0,0);

2.振动打开继电器

单片机供电VCC GND接单片机,VCC需要接3.3V,5V不行!

最大负载电路交流250V/10A,直流30V/10A

引脚 IN 接收到低电平时,开关闭合。

c 复制代码
/重写中断服务函数,如果检测到EXTI中断请求,则进入此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    //一根中断线上接有多个中断源,判断中断请求是否来自PA4
    if(GPIO_Pin == GPIO_PIN_4)
    {
        //如果检测到PA4被拉低
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET)
        {
            //则打开继电器
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
            //延时1秒
            HAL_Delay(1000);
            //关闭继电器
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
        }
        else
        {
            //未检测到PA4被拉低,则关闭继电器
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
        }
    }
}

3.433M无线发射接收模块点亮LED灯

单片机供电VCC GND接单片机

接收到信号,接收模块对应针脚输出高电平

有D0 D1 D2 D3,对应遥控器的ABCD

需求:按下遥控器A按键,LED1亮1秒;按下遥控器B按键,LED2亮1秒。

D0 -- PA5

D1 -- PA6

c 复制代码
//重写中断服务函数,如果检测到EXTI中断请求,则进入此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    switch(GPIO_Pin)
    {
            // 如果检测到PA5被拉高(按键A被按下)
        case GPIO_PIN_5:
            if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET)
            {
                //则点亮LED1
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
                HAL_Delay(1000);
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
            }
            else
            {
                //如果未检测到PA5,则关闭LED1
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
            }
            break;
            // 如果检测到PA6被拉高(按键B按下)
        case GPIO_PIN_6:
            if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET)
            {
                //则点亮LED2
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
                HAL_Delay(1000);
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
            }
            else
            {
                //如果未检测到PA4,则关闭LED1
                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
            }
            break;
    }
}

项目实现

项目需求:

点击遥控器 A 按键,系统进入警戒模式,一旦检测到震动(小偷偷车),则喇叭发出声响报警,吓退小偷。

点击遥控器 B 按键,系统退出警戒模式,再怎么摇晃系统都不会报警,否则系统一直发出尖叫,让车主尴尬。

项目框图

硬件清单

  • 振动传感器
  • 继电器
  • 高功率喇叭
  • 433M无线接收发射模块
  • 杜邦线

代码实现

c 复制代码
#define J_ON 1
#define J_OFF 0
//重写中断服务函数,如果检测到EXTI中断请求,则进入此函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static int mark = J_OFF;
switch(GPIO_Pin)
{
case GPIO_PIN_4:
//如果检测到PA4被拉低(小偷偷车),并且警报模式打开
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_RESET && mark ==
J_ON)
{
//则将PB7拉低,继电器通电,喇叭一直响
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
}
break;
// 如果检测到PA5被拉高(按键A按下),设定为开启警报模式
case GPIO_PIN_5:
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET)
{
    // 则将PB7拉低(喇叭响),2秒后恢复电平(喇叭不响),表示进入警报模式
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_Delay(2000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
// 同时将标志位设置为ON
mark = J_ON;
}
break;
// 如果检测到PA6被拉高(按键B按下),设定为关闭警报模式
case GPIO_PIN_6:
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET)
{
// 则将PB7拉低(喇叭响),1秒后恢复电平(喇叭不响),表示关闭警报模式
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
// 同时将标志位设置为OFF
mark = J_OFF;
}
break;
}
}

电平(喇叭不响),表示关闭警报模式

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);

HAL_Delay(1000);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);

// 同时将标志位设置为OFF

mark = J_OFF;

}

break;

}

}

复制代码
相关推荐
小柯博客7 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(十二)
c语言·stm32·单片机·嵌入式硬件·php·嵌入式
Mapleay10 小时前
FMC STM32H7 SDRAM
stm32·单片机·嵌入式硬件
易知嵌入式小菜鸡11 小时前
STM32CubeMX-H7-19-ESP8266通信(中)--单片机控制ESP8266实现TCP地址通信
stm32·单片机·嵌入式硬件
c7_ln13 小时前
STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
stm32·单片机·实时音视频·江协科技
小柯博客14 小时前
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
c语言·stm32·单片机·嵌入式硬件·物联网
wind_one117 小时前
STM32[笔记]--1.前置准备
笔记·stm32·单片机
Camellia031119 小时前
嵌入式学习--江协stm32day5
stm32·嵌入式硬件·学习
江山如画,佳人北望1 天前
stm32-c8t6实现语音识别(LD3320)
stm32·单片机·嵌入式硬件
wangxinwei20001 天前
stm32_LAN8720驱动
stm32·单片机·嵌入式硬件
小胖同学~1 天前
Linux--vsFTP配置篇
stm32·单片机·嵌入式硬件