DIY手势翻页笔:手势控制继电器、蜂鸣器动作
利用手势模块检测到特定的手势,实现蜂鸣器、继电器的开启与关闭。
硬件接线
PB8:接双路机电元件继电器2,高电平使能。当STM32H5的PB8引脚输出高电平时,继电器2将闭合。
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配置:
时钟配置:
5、硬件连接:
6、工作状态: