这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 过程贴控制继电器、蜂鸣器动作

共5条 1/1 1 跳转至

过程贴控制继电器、蜂鸣器动作

工程师
2024-07-08 20:12:33     打赏

DIY手势翻页笔:手势控制继电器、蜂鸣器动作

利用手势模块检测到特定的手势,实现蜂鸣器、继电器的开启与关闭。

1、硬件准备STM32H5 开发板:作为主控板,用于处理手势信号并控制其他组件。蜂鸣器模块:用于发出声音提示。双路机电元件继电器:用于控制高电压或高电流设备的开启与关闭。

硬件接线


根据给出的接线信息,以下是具体的接线方案:PB0:接蜂鸣器模块,高电平使能。这意味着当STM32H5的PB0引脚输出高电平时,蜂鸣器将发声。PC4:接双路机电元件继电器1,高电平使能。表示当STM32H5的PC4引脚输出高电平时,继电器1将闭合,从而可能控制某个电路的通断。

PB8:接双路机电元件继电器2,高电平使能。当STM32H5的PB8引脚输出高电平时,继电器2将闭合。


2、软件实现初始化:STM32的GPIO(通用输入输出)初始化是一个关键步骤,配置STM32微控制器的GPIO引脚以执行各种功能,输出高低电平。控制逻辑:当检测有输入操作时,将对应的GPIO引脚(PB0)设置为高电平,使蜂鸣器发声。根据需要控制其他GPIO引脚(PC4、PB8)的电平状态,以开启或关闭继电器。声音和继电器反馈:蜂鸣器在接收到高电平信号后发出声音,作为手势被检测到的提示。继电器在接收到高电平信号后闭合,可以根据实际需求控制外部设备的开启与关闭。


3、代码:

#include "stm32Hxxx_hal.h" // 请确保包含正确的HAL库头文件,这里使用stm32fxxx_hal.h作为示例  
  
/**  
  * @brief GPIO 初始化函数  
  * @param 无  
  * @retval 无  
  */  
void MX_GPIO_Init(void)  
{  
    GPIO_InitTypeDef GPIO_InitStruct = {0}; // 初始化GPIO结构体  
  
    /* 使能GPIO端口的时钟 */  
    __HAL_RCC_GPIOH_CLK_ENABLE(); // 根据需要使能GPIOH,如果未使用则可以去掉  
    __HAL_RCC_GPIOC_CLK_ENABLE(); // 使能GPIOC时钟  
    __HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟  
    __HAL_RCC_GPIOB_CLK_ENABLE(); // 使能GPIOB时钟  
  
    /* 配置GPIO引脚初始电平为低电平 */  
    // 对于GPIOC的PIN1和PIN4  
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1 | GPIO_PIN_4, GPIO_PIN_RESET);  
    // 对于GPIOA的PIN5  
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);  
    // 对于GPIOB的PIN8  
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);  
  
    /* 配置GPIOC的PIN1和PIN4为输出推挽模式,上拉,高速 */  
    GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_4;  
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 输出推挽模式  
    GPIO_InitStruct.Pull = GPIO_PULLUP;         // 启用内部上拉电阻  
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 设置GPIO速度为高速  
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);  
  
    /* 配置GPIOA的PIN5为输出推挽模式,无上拉/下拉,低速 */  
    GPIO_InitStruct.Pin = GPIO_PIN_5;  
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 输出推挽模式  
    GPIO_InitStruct.Pull = GPIO_NOPULL;         // 不启用内部上拉或下拉电阻  
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 设置GPIO速度为低速  
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  
  
    /* 配置GPIOB的PIN8为输出推挽模式,上拉,高速 */  
    GPIO_InitStruct.Pin = GPIO_PIN_8;  
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 输出推挽模式  
    GPIO_InitStruct.Pull = GPIO_PULLUP;         // 启用内部上拉电阻  
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 设置GPIO速度为高速  
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);  
}
#include <stdio.h> // 假设您在一个可以打印的环境中,如嵌入式系统的串口输出  
  
// 假设的手势枚举(这里只是示例,您需要根据实际情况定义)  
typedef enum {  
    PAJ_UP,  
    PAJ_DOWN,  
    PAJ_LEFT,  
    PAJ_RIGHT,  
    PAJ_FORWARD,  
    PAJ_BACKWARD,  
    PAJ_CLOCKWISE,  
    PAJ_COUNT_CLOCKWISE,  
    PAJ_WAVE,  
    PAJ_UNKNOWN // 可以添加一个未知手势的枚举值  
} PajGesture;  
  
// 假设的手势检测函数,这里只是模拟  
PajGesture detectGesture(void) {  
    // 这里应该是实际的手势检测逻辑,但在这里我们只是模拟返回一个手势  
    // 返回的手势应基于实际检测到的手势  
    return PAJ_UP; // 假设每次都检测到向上的手势  
}  
  
// 手势处理函数  
void handleGesture(void) {  
    PajGesture gesture = detectGesture(); // 调用手势检测函数  
  
    switch (gesture) {  
        case PAJ_UP:  
            BEEPON;         // 向上时蜂鸣器工作  
            printf("Up\r\n");  
            break;  
        case PAJ_DOWN:  
            BEEPOFF;        // 向下时蜂鸣器熄灭(这里可能不需要,因为默认就是OFF)  
            printf("Down\r\n");  
            break;  
        case PAJ_LEFT:  
            JDQ1ON;         // 向左时继电器1吸合  
            // 注意:这里没有提到板载指示灯,如果需要控制,请添加相应代码  
            printf("Left\r\n");  
            break;  
        case PAJ_RIGHT:  
            JDQ1OFF;        // 向右时继电器1断开  
            // 同样,如果需要控制板载指示灯,请添加相应代码  
            printf("Right\r\n");  
            break;  
        case PAJ_FORWARD:  
            JDQ2ON;         // 向前时继电器2吸合  
            // 控制板载指示灯的代码(如果有的话)  
            printf("Forward\r\n");  
            break;  
        case PAJ_BACKWARD:  
            JDQ2OFF;        // 向后时继电器2断开  
            // 控制板载指示灯的代码(如果有的话)  
            printf("Backward\r\n");  
            break;  
        // 其他手势的处理...  
        case PAJ_UNKNOWN:  
            // 处理未知手势  
            break;  
        default:  
            // 默认处理  
            break;  
    }  
}  
  
// 在您的主函数或某个循环中调用handleGesture()

4、CUBE MX配置:

GPIO配置:

image.png

时钟配置:

image.png

5、硬件连接:

image.png

6、工作状态:

image.png







专家
2024-07-09 06:36:31     打赏
2楼

这不错


院士
2024-07-09 06:48:04     打赏
3楼

谢谢楼主的无私分享~!


专家
2024-07-15 02:28:33     打赏
4楼

谢谢分享


工程师
2024-07-15 08:25:29     打赏
5楼

谢谢分享。


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]