雷竞技注册
项目

如何给吊扇添加蓝牙

2015年9月25日通过特拉维斯Fagerness

如何通过在遥控器中加入nRF51来为无线吊扇添加BLE功能。这是我们nRF51系列的一部分。

如何通过在遥控器中加入nRF51来为无线吊扇添加BLE功能。

概述

这是一系列文章的一部分nRF51。nRF51是一个Cortex M0和BLE无线芯片一体的系统芯片。本文概述了我使用自定义外围服务为无线吊扇添加BLE功能的经验。

前面的文章:
BLE使用nRF51: ARM-GCC构建环境

需求

  • 具有nRF51的设备
  • 基于教程的移动应用程序。
    • 本文使用:Android v5.1.1
  • 无线吊扇遥控器
  • NMOS晶体管
  • 小的测量线
  • 工具链的设置前一篇文章

BLE在吊扇

本文的前提是给吊扇添加BLE,这样它就可以被移动设备控制。有几种方法可以做到这一点:

  1. 将能够的控制器添加到出口框的内部。这只允许您打开和关闭风扇。它需要与电源电力合作。
  2. 在风扇内部添加一个BLE控制器,并插入风扇的电路板。这将需要大量的工作来降低风扇和修改电路。电压也可能很高。
  3. 修改一个已经具备无线功能的吊扇。通常,这些风扇都有一些远程开关,并与瞬时开关一起工作。你可以用连接到单独的微控制器上的晶体管来模拟这些瞬间开关。

本文将重点介绍第三种选择。

远程逆向工程

我的吊扇使用的遥控器是艾默生制造的。我不知道它是从哪里来的,因为它是和房子一起来的。我可以从标签上看出它在300MHz频段上运行,所以我根本不用担心它会干扰BLE。它还能以6V左右的4-AAA电池供电,我也可以用它为nRF51供电。

我打开设备,发现一个收音机,一些按钮和某种微控制器或编码器。

看来入侵电路最简单的方法就是通过按钮。我可以用nRF51模拟按键。这种方法的优点是我仍然可以使用正常的按钮。研究电路的目的是弄清楚按下按钮是如何转化为通过空气传输的指令的。通常情况下,按钮只是拉高或拉低电压。我顺着地面的痕迹,发现所有的按钮都与地面相连。这是一个很好的指示,按钮拉低电压按下。我用万用表来测量输入微控制器的按钮轨迹上的电压。它被连接到正电源电压,大约6V。我不能把它直接连接到nRF51,否则会损坏它。 I have to use NMOS transistors to pull the voltage low. The transistors need to have a VGS on threshold that is lower than 1.8V, a VDSmax that is higher than 6V, and that the current flowing through the button circuit is less than IDmax.

修改远程

我焊接了晶体管和一些电线到电路,使漏极连接到MCU线,源到地,栅极到电线。然后我将电线焊接到nRF51 GPIO引脚上。为了给nRF51供电,我需要降低一点电压,因为板载调节器只能处理5.5V。我使用两个普通二极管串联,这给了我大约1V的降。这个1V的下降不会在所有情况下是一样的,但它提供了足够的保证金低于5.5V是合理的。你也可以在板上焊接一些其他的调节器,如果你有一个躺在周围。二极管还为nRF51提供反向极性保护,以防有人把电池放反了。

编程和测试后,我拍摄了NRF51以防止短裤并将其放入案例内。它恰好适合收音机。

修改BLE外围代码

代码与以前几乎相同,只是这次对数据做了一些处理。我还在不使用的时候让MCU休眠,降低广告率,节省电池寿命。我使用SDK中的gpio库来控制这些行。我发现,将按钮引脚按低100毫秒可以很好地模拟人按按钮的情况。

ble_nordic_ceiling_fan_app.zip.zip.

#include“nrf_gpio.h”#define button_dh_pin 16 #define button_down_pin 17 #define button_pig_pin 18 #define button_low_pin 19 #define button_flow_pin 20 #define button_press_time_ms 100 #define device_name“den fan”/ ** <设备名称。将包含在广告数据中。* / #define app_adv_interval 1600 / ** <广告间隔(以0.625毫秒为单位)* / #define app_addimeout_in_seconds 0 / ** <广告超时以秒为单位。* /

立即接通电源,我设置引脚输出,并保持低。通常你会把下拉电阻在NMOS门,以防止不必要的激活,但我不想焊接6个小电阻在板上。对我来说,第一次装电池时按下按钮没什么大不了的。

静态void gpio_init(void){nrf_gpio_cfg_output(button_up_pin);nrf_gpio_cfg_output(button_down_pin);nrf_gpio_cfg_output(button_high_pin);nrf_gpio_cfg_output(button_med_pin);nrf_gpio_cfg_output(button_low_pin);nrf_gpio_cfg_output(button_off_pin);nrf_gpio_pin_clear(button_up_pin);nrf_gpio_pin_clear(button_down_pin);nrf_gpio_pin_clear(button_high_pin);nrf_gpio_pin_clear(button_med_pin); nrf_gpio_pin_clear(BUTTON_LOW_PIN); nrf_gpio_pin_clear(BUTTON_OFF_PIN); }

我修改了写入事件,仅为Charcteristic匹配自定义BLE外围设备,仅切换引脚。

案例BLE_GATTS_EVT_WRITE: DEBUG_PRINTF(“BLE_GATTS_EVT_WRITE”);DEBUG_PRINTF("Data %d: 0x%x",i,p_ble_evt->evt.gatts_evt. pars .write. Data [i]);如果(p_ble_evt - > evt.gatts_evt.params.write。Handle == peri_handles .char1_handles.value_handle) {on_custom_ble_write(p_ble_evt);}

然后,我必须在发生BLE写入事件时编写一个新函数来切换PIN。我将其设置为通用,因此可以在Android应用程序上修改按钮编号。

static void on_custom_ble_write(ble_evt_t * p_ble_evt) {DEBUG_PRINTF("on_custom_ble_write");如果(p_ble_evt - > evt.gatts_evt.params.write.len > 0){如果(p_ble_evt - > evt.gatts_evt.params.write。数据[0]>=0 && p_ble_evt->evt.gatts_evt.param .write。{DEBUG_PRINTF("Toggle pin %d for %d ms",p_ble_evt->evt.gatts_evt.param .write.data[0],BUTTON_PRESS_TIME_MS);nrf_gpio_pin_set (p_ble_evt - > evt.gatts_evt.params.write.data [0]);nrf_delay_ms (BUTTON_PRESS_TIME_MS);nrf_gpio_pin_clear (p_ble_evt - > evt.gatts_evt.params.write.data [0]);}}}

安卓应用

Android应用程序的基础前一篇文章。我为每个吊扇按钮添加了几个按钮。

我没有足够的输出来完成REV按钮,所以我省略了这个。然后我必须为每个按钮添加功能。它们与之前的char_write函数相同,除了这次它们为所需的按钮按下写入pin值。

公共void onclickuight(View V){if(mbluettoothleservice!= null){mbluettoothleservice.writeCustom scharactery(15);public void onclicklowlowlowlowlowlow(视图v){if(mbluettoothleservice!= null){mbluettoothleservice.writecustom scharactery(16);public void onclickhi(视图v){if(mbluettoothleservice!= null){mbluettoothleservice.writeCustom scharactery(17);public void onclickmed(查看v){if(mbluettoothleservice!= null){mbluettoothleservice.writeCustom scharactery(18);public void onclicklow(查看v){if(mbluettoothleservice!= null){mbluettoothleservice.writeCustomcharacternatigation(19);public void onclickoff(视图v){if(mbluettoothleservice!= null){mbluettoothleservice.writecustom scharactery(20);}}

bluetoothlegatt_1.zip.

尝试

还有什么?

nRF51可以以多种方式与其他设备连接。例如,您可以使用它作为ADC的传感器,或通过I2C控制另一个设备。您还可以用GPIO控制许多设备,如本文中的设备!出去尝试在你的房子里添加BLE吧!

为自己提供这个项目!BOM。

3评论
  • 古玩 2015年10月04

    哇蓝牙风扇真棒!!!!!!!!!

    喜欢的。 回复
  • jean - marc Beaujour 2016年8月3日,

    伟大的东西!
    是否为双向通信,即是否可以在手机上显示风扇的状态(亮/灭,风扇转速低/Med/Hi?)

    喜欢的。 回复
  • D
    Doktor琼斯 2017年1月13日

    @Jean-Marc我很怀疑,因为遥控器无法知道风扇的状态。你可以试着猜一下,但如果有人直接使用遥控器而不是应用程序(或风扇本身的控制),应用程序将无法知道,并会显示错误的状态。

    喜欢的。 回复