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、工作状态:

我要赚赏金
