大连海洋大学信息工程学院 梅子帆 马占军
本文是以智能家居为出发点,旨在研究一款基于蓝牙通信的可调节智能灯具,在满足用户照明需求的同时,采用Bluetooth SPP和HID协议,并且通过不同节点的相应配置,设置配置端、服务端和客户端,开发相应的操作APP,实现手机等移动终端的远程遥控,灯的亮度和颜色的调节和挑选,具有非常广泛的前景和推广价值。
随着科技的进步和人们对智能生活的渴望,智能家居便在此种呼唤中应用而生,特别是对智能灯的设计研究,也进行的如火如荼,但是大多数智能灯具的设计重点在多数情况下侧重于智能控制,对于绿色节能方面考虑较少,因此开发出一种节能减排,又可以智能化控制的灯具是当前市场号召所需。
本设计是手机等移动终端为出发点,设计一款APP,实现对台灯的智能控制。在要实现对灯的控制时,秩序打开APP,与此同时打开蓝牙,实现与灯的配对连接,而后通过进行操作手机APP的相关功能设计,将指令传输给单片机,单片机在通过接受到的指令对做出相应的动作,从而实现对等的远程遥控。
本设计主要包含四部分硬件:CC2541蓝牙模块,STC89C52RC单片机模块,LED智能驱动照明模块和电源管理模块。总体框图如图1所示。
图1 系统硬件结构图
Android端
MainAty:
获取蓝牙适配器,蓝牙适配器通过搜索获取适配蓝牙信息
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
如果手机没打开蓝牙,则界面跳转至打开蓝牙界面。
@Override
protected void onStart() {
super.onStart();
if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intent);
}
在蓝牙匹配阶段,一般是蓝牙获取适配前期曾匹配过得蓝牙设备。
if (devices != null && devices.size() > 0) {
data.clear();
for (BluetoothDevice device : devices) {
HashMap
map.put(“lv_left_icon”, R.drawable.lv_left_icon);
map.put(“lv_address”, device.getAddress());
map.put(“lv_right_icon”, R.drawable.lv_right_white);
data.add(map);
}
} else {
HashMap
map.put(“lv_left_icon”, R.drawable.lv_left_icon);
map.put(“lv_address”, “没有已经匹配的设备”);
map.put(“lv_right_icon”, R.drawable.lv_right_white);
data.add(map);
mTextView.append(“没有已经匹配的设备” + “ ”);
}
simpleAdapter.notifyDataSetChanged();
连接指定的蓝牙:通过调用BluetoothTool连接蓝牙,我们传入了设备的地址"(String) data.get(0).get(“lv_address”)"以及连接类型BluetoothTool.ServiceOrClient.CLIENT。
builder.setPositiveButton(“连接”, new DialogInterface.OnClick-Listener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mBluetoothTool = new BluetoothTool((String) data.get(0).get(“lv_address”),
BluetoothTool.ServiceOrClient.CLIENT);
mBluetoothTool.SetOnIUpdateUI(new IUpdateUI() {
@Override
public void updateListViewDevices() {
for (int i = 0; i < data.size(); i++) {
if (i == index) {
data.get(i).put(“lv_right_icon”, R.drawable.checked);
continue;
}
data.get(i).put(“lv_right_icon”, R.drawable.lv_right_white);
}
客户端线程:
private class ClientThread extends Thread {
@Override
public void run() {
super.run();
try {
mClientSocket = mDevice.createRfcommSocketToServiceRecord(
UUID.fromString(“00001101-0000-1000-8000-00805F9B34FB”));
Message msg = Message.obtain(null, MSG_UPDATE_LOG);
msg.obj = “正在连接。。。”;
mHandler.sendMessage(msg);
mClientSocket.connect();
msg = Message.obtain(null, MSG_UPDATE_LOG);
msg.obj = “连接成功”;
mHandler.sendMessage(msg);
msg = Message.obtain(null, MSG_UPDATE_LISTVIEW);
mHandler.sendMessage(msg);
/** 接收数据*/
mReadThread = new ReadThread();
mReadThread.start();
} catch (IOException e) {
e.printStackTrace();
Message msg = Message.obtain(null, MSG_UPDATE_LOG);
msg.obj = “连接失败”;
mHandler.sendMessage(msg);
可以看到线程一直在查看有没有数据,如果有的话就接受,并根据接收到的数据进行相应的显示。
(1)本设计能够实现手机对LED灯的远程控制,通过将灯置于蓝牙接收范围内,通过手机等移动设备对灯发出指令,调节灯亮度以及开关状态。
(2)本设计能够实现多种光色和光照强度的调节,用户可以根据工作所需和自然光照情况。
(1)由于蓝牙连接的距离限制,不能实现更远距离的控制。
(2)本设计并没有考虑LED灯启动的问题。