在前面一章中我们已经详细介绍了我们基于MM32W系列开发的智能灯控方案,在本章节我们将介绍一款大家生活中很常见的一个蓝牙产品的应用方案,基于MM32W系列开发的蓝牙自拍杆应用。
基于蓝牙技术的蓝牙自拍杆可以进行远距离拍照,不用担心因为线材等因素的约束,且本方案无需专门的手机APP,可直接使用系统内的蓝牙连接。该方案在开发、测试、使用操作阶段都比较简单,且操作迅速,能够适用大部分的场景、方便人们的生活。
硬件资源:
本方案基于MM32 BLE\_Test Board进行测试验证,蓝牙自拍杆应用在硬件上只需要一个功能按键即可,蓝牙部分使用蓝牙控制的最小系统,我们将这个按键接到MCU的PA0引脚,既可以用做唤醒引脚使用,又可以用做自拍的功能引脚。
图1 测试开发板
软件资源:
将PA0配置为下拉输入模式,复用中断线到PA0并配置外部中断线中断,最后使能PWR时钟与WakeUp引脚。详细代码如下:
do {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能GPIOA
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0; //PA.0
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;//下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO
} while(0);
do {
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能复用功能时钟
//使用外部中断方式
SYSCFG_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //中断线0连接GPIOA.0
EXTI_InitStructure.EXTI_Line = EXTI_Line0; //设置按键所有的外部线路
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设外外部中断模式:EXTI线路为中断请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); // 初始化外部中断
} while(0);
do {
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn; //使能按键所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPriority = 2; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
} while(0);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR外设时钟
PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚功能
我们在gatt\_user\_send\_notify\_data\_callback函数中给手机发送数据,该函数属于回调函数,协议栈会在系统允许的时候(异步)回调本函数,该函数可用于蓝牙模块端主动发送数据之用,函数内部不得增加阻塞代码。在蓝牙自拍杆应用中我们在该函数中判断PA0的电平状态,若按键按下则给手机发送按键按下信息。详细实现代码如下:
void gatt_user_send_notify_data_callback(void)
{
if (GPIO_ReadInputData(GPIOA) & 0x01)//press
{
NotifyKey(0x28);
NotifyApplePhoto();
}
}
u8 NotifyApplePhoto(void)//apple photo hid photo capture, hard code
{
u8 Keyarray[5] = {2,0,8,0,0}; //VolUp,hard code
sconn_notifydata(Keyarray,5);
Keyarray[2] = 0;
sconn_notifydata(Keyarray,5);
return 1;
}
u8 NotifyKey(u8 KeyIdx)//hid standard keyboard key, hard code
{
u8 Keyarray[9] = {1,0,0,0,0,0,0,0,0};//0xa1
Keyarray[3] = KeyIdx;
sconn_notifydata(Keyarray,9);
Keyarray[3] = 0;
sconn_notifydata(Keyarray,9);
return 1;
}
我们直接使用手机自带的蓝牙功能进行测试,操作流程如下:
- 打开手机蓝牙并进入蓝牙控制界面,搜索自拍杆蓝牙设备。
- 选择对应名称(MindMotion-Shutter)的蓝牙设备并进行配对。
- 配对成功后打开手机相机界面,这个时候点击按键K1就可以进行拍照了。
图2 手机界面