大連海洋大學(xué)信息工程學(xué)院 梅子帆 馬占軍
本文是以智能家居為出發(fā)點,旨在研究一款基于藍牙通信的可調(diào)節(jié)智能燈具,在滿足用戶照明需求的同時,采用Bluetooth SPP和HID協(xié)議,并且通過不同節(jié)點的相應(yīng)配置,設(shè)置配置端、服務(wù)端和客戶端,開發(fā)相應(yīng)的操作APP,實現(xiàn)手機等移動終端的遠程遙控,燈的亮度和顏色的調(diào)節(jié)和挑選,具有非常廣泛的前景和推廣價值。
隨著科技的進步和人們對智能生活的渴望,智能家居便在此種呼喚中應(yīng)用而生,特別是對智能燈的設(shè)計研究,也進行的如火如荼,但是大多數(shù)智能燈具的設(shè)計重點在多數(shù)情況下側(cè)重于智能控制,對于綠色節(jié)能方面考慮較少,因此開發(fā)出一種節(jié)能減排,又可以智能化控制的燈具是當(dāng)前市場號召所需。
本設(shè)計是手機等移動終端為出發(fā)點,設(shè)計一款A(yù)PP,實現(xiàn)對臺燈的智能控制。在要實現(xiàn)對燈的控制時,秩序打開APP,與此同時打開藍牙,實現(xiàn)與燈的配對連接,而后通過進行操作手機APP的相關(guān)功能設(shè)計,將指令傳輸給單片機,單片機在通過接受到的指令對做出相應(yīng)的動作,從而實現(xiàn)對等的遠程遙控。
本設(shè)計主要包含四部分硬件:CC2541藍牙模塊,STC89C52RC單片機模塊,LED智能驅(qū)動照明模塊和電源管理模塊??傮w框圖如圖1所示。
圖1 系統(tǒng)硬件結(jié)構(gòu)圖
Android端
MainAty:
獲取藍牙適配器,藍牙適配器通過搜索獲取適配藍牙信息
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
如果手機沒打開藍牙,則界面跳轉(zhuǎn)至打開藍牙界面。
@Override
protected void onStart() {
super.onStart();
if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intent);
}
在藍牙匹配階段,一般是藍牙獲取適配前期曾匹配過得藍牙設(shè)備。
if (devices != null && devices.size() > 0) {
data.clear();
for (BluetoothDevice device : devices) {
HashMap
map.put(“l(fā)v_left_icon”, R.drawable.lv_left_icon);
map.put(“l(fā)v_address”, device.getAddress());
map.put(“l(fā)v_right_icon”, R.drawable.lv_right_white);
data.add(map);
}
} else {
HashMap
map.put(“l(fā)v_left_icon”, R.drawable.lv_left_icon);
map.put(“l(fā)v_address”, “沒有已經(jīng)匹配的設(shè)備”);
map.put(“l(fā)v_right_icon”, R.drawable.lv_right_white);
data.add(map);
mTextView.append(“沒有已經(jīng)匹配的設(shè)備” + “ ”);
}
simpleAdapter.notifyDataSetChanged();
連接指定的藍牙:通過調(diào)用BluetoothTool連接藍牙,我們傳入了設(shè)備的地址"(String) data.get(0).get(“l(fā)v_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(“l(fā)v_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(“l(fā)v_right_icon”, R.drawable.checked);
continue;
}
data.get(i).put(“l(fā)v_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);
/** 接收數(shù)據(jù)*/
mReadThread = new ReadThread();
mReadThread.start();
} catch (IOException e) {
e.printStackTrace();
Message msg = Message.obtain(null, MSG_UPDATE_LOG);
msg.obj = “連接失敗”;
mHandler.sendMessage(msg);
可以看到線程一直在查看有沒有數(shù)據(jù),如果有的話就接受,并根據(jù)接收到的數(shù)據(jù)進行相應(yīng)的顯示。
(1)本設(shè)計能夠?qū)崿F(xiàn)手機對LED燈的遠程控制,通過將燈置于藍牙接收范圍內(nèi),通過手機等移動設(shè)備對燈發(fā)出指令,調(diào)節(jié)燈亮度以及開關(guān)狀態(tài)。
(2)本設(shè)計能夠?qū)崿F(xiàn)多種光色和光照強度的調(diào)節(jié),用戶可以根據(jù)工作所需和自然光照情況。
(1)由于藍牙連接的距離限制,不能實現(xiàn)更遠距離的控制。
(2)本設(shè)計并沒有考慮LED燈啟動的問題。