通过Android studio编写app,实现通过手机蓝牙控制arduino上的LED的亮灭

通过Android studio编写app,实现通过手机蓝牙控制arduino上的LED的亮灭

(一)Android studio代码部分
(1)MainActivity代码
package com.example.lx.lanya;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.UUID;

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
private BluetoothAdapter mBluetoothAdapter;
private OutputStream mOutputStream;
private ArrayList mDevices = new ArrayList<>();

private BroadcastReceiver mBluetoothReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            mDevices.add(device);
            mAdapter.notifyDataSetChanged();
            System.out.println("device name" + device.getName());
        } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
            Toast.makeText(getApplicationContext(), "开始扫描", Toast.LENGTH_SHORT).show();
        } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            Toast.makeText(getApplicationContext(), "扫描结束", Toast.LENGTH_SHORT).show();
        }
    }
};
private DeviceAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ListView mListView;
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mListView = findViewById(R.id.lv);
    mAdapter = new DeviceAdapter(getApplicationContext(), mDevices);
    mListView.setAdapter(mAdapter);
    mListView.setOnItemClickListener(this);
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

    IntentFilter filter = new IntentFilter();
    filter.addAction(BluetoothDevice.ACTION_FOUND);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    registerReceiver(mBluetoothReceiver, filter);
}

public void clickBtn(View v) {
    switch (v.getId()) {
        case R.id.button1:

            if (!mBluetoothAdapter.isEnabled()) {

                mBluetoothAdapter.enable();
            }
            break;
        case R.id.button2:

            if (mBluetoothAdapter.isEnabled()) {
                mBluetoothAdapter.disable();
            }
            break;
        case R.id.button3:
            mDevices.clear();
            mAdapter.notifyDataSetChanged();
            mBluetoothAdapter.startDiscovery();
            break;
        case R.id.button4:
            mBluetoothAdapter.cancelDiscovery();
            break;
        case R.id.button5:
            sendCtrl(0);
            break;
        case R.id.button6:
            sendCtrl(1);
            break;

        default:
            break;
    }
}

private void sendCtrl(int i) {
    String str = "0xaaaaaa";
    String stc = "0xbbbbbb";
    try {
        byte[] bs;
        if (i == 0) {
            bs = hexString2Bytes(str);
        } else {
            bs = hexString2Bytes(stc);
        }
        mOutputStream.write(bs);
        System.out.print(bs);
    } catch (Exception e) {
        e.printStackTrace();
    }
}


@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(mBluetoothReceiver);
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    BluetoothDevice device = mDevices.get(position);
    conn(device);
}

private void conn(final BluetoothDevice device) {
    //建立蓝牙连接是耗时操作,类似TCP Socket,需要放在子线程里面
    new Thread() {
        public void run() {
            try {
                //获取BluetoothSocket,UUID需要和蓝牙服务端保持一致
                BluetoothSocket bluetoothSocket = device.createRfcommSocketToServiceRecord(UUID
                        .fromString("00001101-0000-1000-8000-00805F9B34FB"));
                // 和蓝牙服务端建立连接
                bluetoothSocket.connect();
                // 获取输出流,往蓝牙服务端写指令信息
                mOutputStream = bluetoothSocket.getOutputStream();
                // 提示用户
                runOnUiThread(new Runnable() {
                    public void run() {
                        System.out.println("连接成功");
                        Toast.makeText(getApplicationContext(), "连接成功", Toast.LENGTH_SHORT)
                                .show();
                    }
                });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }.start();
}

public static byte[] hexString2Bytes(String hex) {

    if ((hex == null) || (hex.equals(""))) {
        return null;
    } else if (hex.length() % 2 != 0) {
        return null;
    } else {
        hex = hex.toUpperCase();
        //int len = hex.length()/2;
        byte[] b = new byte[]{};
        char[] hc = hex.toCharArray();
        b=getBytes(hc);
    }

}


    public static byte[] getBytes(char[] chars) {
        Charset cs = Charset.forName("UTF-8");
        CharBuffer cb = CharBuffer.allocate(chars.length);
        cb.put(chars);
        cb.flip();
        ByteBuffer bb = cs.encode(cb);
        return bb.array();
}

}
(2)DeviceAdapter部分
package com.example.lx.lanya;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;

public class DeviceAdapter extends BaseAdapter {
private ArrayList mDevices;
private Context mContext;

 DeviceAdapter(Context context, ArrayList<BluetoothDevice> devices) {
    mDevices = devices;
    mContext = context;
}

@Override
public int getCount() {
    return mDevices.size();
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if(convertView == null) {
        convertView = View.inflate(mContext, R.layout.item, null);
        holder = new ViewHolder();
        holder.mTvName = convertView.findViewById(R.id.tv_name);
        holder.mTvAddress =  convertView.findViewById(R.id.tv_address);
        convertView.setTag(holder);
    }else {
        holder = (ViewHolder) convertView.getTag();
    }
    BluetoothDevice device = mDevices.get(position);
    holder.mTvName.setText(device.getName());
    holder.mTvAddress.setText(device.getAddress());
    return convertView;
}

class ViewHolder {
    TextView mTvName;
    TextView mTvAddress;
}

}
(3)Activity_main部分

                                                                                                                                            <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.lx.lanya.MainActivity">
<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:layout_marginTop="24dp"
    android:onClick="clickBtn"
    android:text="@string/app_open" />

<Button
    android:onClick="clickBtn"
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/button1"
    android:layout_alignBottom="@+id/button1"
    android:layout_marginLeft="19dp"
    android:layout_marginStart="19dp"
    android:layout_toEndOf="@+id/button1"
    android:layout_toRightOf="@+id/button1"
    android:text="@string/app_close" />

<Button
    android:onClick="clickBtn"
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/button1"
    android:layout_marginTop="12dp"
    android:layout_toLeftOf="@+id/button2"
    android:layout_toStartOf="@+id/button2"
    android:text="@string/app_start" />

<Button
    android:onClick="clickBtn"
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/button2"
    android:layout_alignStart="@+id/button2"
    android:layout_alignTop="@+id/button3"
    android:text="@string/app_end" />

<Button
    android:onClick="clickBtn"
    android:id="@+id/button6"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/button4"
    android:layout_alignBottom="@+id/button4"
    android:layout_alignLeft="@+id/button5"
    android:layout_alignStart="@+id/button5"
    android:text="@string/app_close_led" />

<Button
    android:onClick="clickBtn"
    android:id="@+id/button5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/button2"
    android:layout_alignBottom="@+id/button2"
    android:layout_marginLeft="21dp"
    android:layout_marginStart="21dp"
    android:layout_toEndOf="@+id/button2"
    android:layout_toRightOf="@+id/button2"
    android:text="@string/app_open_led" />


<ListView
    android:id="@+id/lv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignLeft="@+id/button3"
    android:layout_alignStart="@+id/button3"
    android:layout_below="@+id/button3"
    android:layout_marginTop="22dp" />

`
(4)item.xml部分

                                                                                                                                <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
    android:id="@+id/tv_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="name"
    android:textColor="#000"
    android:textSize="18sp" />

<TextView
    android:id="@+id/tv_address"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="address"
    android:textColor="#000"
    android:textSize="18sp" />


(5)string.xml部分

蓝牙
打开蓝牙
关闭蓝牙
开始扫描
结束扫描
开灯
关灯

(6)AndroidMainfirst部分

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lx.lanya">
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>


(二)Arduino部分
使用hc05蓝牙模块,以及MEGA2560
(1)使用下载器与hc05连接设置蓝牙名字和密码,以及工作方式
参考连接https://blog.csdn.net/weixin_37272286/article/details/78016497?locationNum=10&fps=1
(2)arduino与蓝牙以及LED连接方法
RX接TX1
TX接RX1
VCC接5V
GAD接GND
13脚接LED正极
LE负极接GND
(3)arduino程序
byte val;
void setup() {
// put your setup code here, to run once:
Serial.begin(38400);
Serial1.begin(38400);
pinMode(13,OUTPUT);
}

void loop() {
// put your main code here, to run repeatedly:
while(Serial1.available()>0)
{
int i;
val=Serial1.read();
Serial.println(val);
if(val==65){
digitalWrite(13,HIGH);
Serial.println(val);
}
if(val==66){
digitalWrite(13,LOW);
Serial.println(val);
}
}
}
然后即可实现LED的亮灭

  • 12
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值