基于蓝牙4.0的LED灯

学校有门课叫工程设计,顾名思义,大概就是做个科技作品交上去,类似四路抢答器,烟雾报警器等。我属于装逼型的,去年的10月份报了一个基于CC2540的蓝牙LED灯,还要写个适配的安卓APP。这事情一直拖,拖到这学期才开始动手做。CC2540资料基本都是英文的,对于安卓又一窍不通,硬着头皮做,东搬西抄,历时一月,终于算是给做出来了。

先来看看效果。

手机软件界面:

软件界面
软件界面

灯的效果:

灯的效果
灯的效果

功能挺简单的,只是实现了手机控制灯的颜色跟定时开启,跟市面上那些高大上的智能LED产品比起来简直弱爆了…下面简单的说说实现过程。

基本实现框图

LED颜色是通过改变PWM的占空比来实现的。CC2540输出3路PWM信号,控制LED驱动板上的LED电源驱动。

系统框图
系统框图

LED驱动

本人硬件很烂,LED驱动部分只用了一个简单的恒压加开关管。用CC2540输出的PWM信号去控制开关管的通断,进而控制LED的颜色。小功率的三极管开关管有9013和8050等。

BLE协议栈

这部分得到了高人相助,具体就不讲了,讲不完也讲不清楚,这里说说关键的几个点。CC2540一共有四个Timer:timer1、timer2、timer3、timer4,其中1和2是16位的,并且timer2是rf射频电路专用的timer,我们不能使用,用户可以变成是1、3、4,其中3和4是8位timer,并且只能输出2路PWM,由于我们需要3路PWM,所以只能使用Timer1。具体可参考CC2540 user’s guide计数器部分。

安卓的蓝牙4.0 谷歌于13年7月25日正式发布Android 4.3 操作系统,支持Bluetooth 4.0,搭载Bluetooth Low Energy/BLE技术。根据谷歌官方最新SDK提供的demo开发,一共有一下几个步骤:

1、初始化BLE 2、搜索BLE设备 3、连接支持通用属性协议的设备 4、读取BLE属性 5、接收设备数据 6、关闭

下面具体说明一下每一步操作:

Step1:初始化BLE

得到一个本地适配器:BluetoothAdapter

启动蓝牙:

if (!mBluetoothAdapter.isEnabled()) { 
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); }

Step2:搜索BLE设备

通过调用BluetoothAdapter的startLeScan()搜索BLE设备。调用此方法时需要传入 BluetoothAdapter.LeScanCallback参数。因此你需要实现 BluetoothAdapter.LeScanCallback接口,BLE设备的搜索结果将通过这个callback返回。当找到对应的设备后,立即停止扫描。

如果想扫描已知的具体目标,可以使用startLeScan(UUID[], BluetoothAdapter.LeScanCallback) 直接给出一组uuid去扫描。

Step3:连接支持GATT的设备(GATT Server) 实例化一个BluetoothGatt 对象,如(mBluetoothGatt),

BluetoothGatt mBluetoothGatt = device.connectGatt(this, false, mGattCallback); 

它有三个参数(对象,布尔变量,mGattcallback),mGattcallback是BluetoothGattcallback的一个引用,该对象用来指导手机端APP的操作(GATTclient)

BluetoothGattCallback用于传递一些连接状态及结果。

Step4:读取BLE修改属性特征值

public void write(UUID uuid, String data) {
    if (mBluetoothGatt == null) {
        return;
    }
    BluetoothGattCharacteristic characteristic = mBluetoothGatt.getService(SERVICE).getCharacteristic(uuid);
    if (characteristic != null) {
        characteristic.setValue(data.getBytes());
        mBluetoothGatt.writeCharacteristic(characteristic);
    }
}

Step5:接收GATT通知

setCharacteristicNotification() 通知APP,设备端的产生变化

public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic) {} 

具体的代码先不放了,上面说的直接套用Android SDK给的例子就行。

comments powered by Disqus