📜  关于HC-05蓝牙模块|与安卓的连接

📅  最后修改于: 2021-09-16 10:45:55             🧑  作者: Mango

曾经想用 Android 手机控制您的机械机器人或使用自定义遥控器设计机器人,在本教程中,我们将了解用于上述和许多其他情况的蓝牙模块 HC-05。在这里,我们将了解 HC-05 模块的连接和工作,以及它与自定义 android 应用程序的接口。
基本
在电子和通信方面,无线通信正在迅速取代有线连接。旨在取代电缆连接 HC-05 使用串行通信与电子设备进行通信。通常,它用于使用短距离无线连接来连接手机等小型设备以交换文件。它使用 2.45GHz 频段。数据传输速率最高可达 1Mbps,范围为 10 米。
HC-05 模块可以在 4-6V 的电源电压范围内工作。它支持 9600、19200、38400、57600 等波特率。最重要的是它可以在主从模式下运行,这意味着它不会从外部来源发送或接收数据。

HC-05模块

引脚说明


  • Enable –此引脚用于设置数据模式或 AT 命令模式(设置为高电平)。
  • VCC –连接到 +5V 电源。
  • 地 –连接到供电系统的地。
  • Tx(发送器)——该引脚串行发送接收到的数据。
  • Rx(接收器)-用于通过蓝牙串行广播数据。
  • 状态 –用于检查蓝牙是否正常工作。

操作模式

HC-05 蓝牙模块可用于两种操作模式:命令模式和数据模式。

命令模式

在命令模式下,您可以通过 AT 命令与蓝牙模块进行通信,用于配置模块的各种设置和参数,如获取固件信息、更改波特率、更改模块名称,可用于将其设置为主或从。

关于 HC-05 模块的一点是它可以配置为通信对中的主站或从站。为了选择其中一种模式,您需要激活命令模式并发送适当的 AT 命令。

数据模式

进入数据模式,在此模式下,模块用于与其他蓝牙设备进行通信,即在此模式下进行数据传输。

用微控制器编程 HC-05

代码技术参数:

  • Arduino-Uno 用作微控制器。
  • 名称: HC-05
  • 密码:1234(或0000)
  • 类型:从
  • 模式:数据
  • 波特率:9600,8 个数据位,无奇偶校验和 1 个停止位
//Define the variable that contains the led
#define ledPin 7
int state = 0;
void setup() {
  //Setting the pin mode and initial LOW 
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600); // Default communication rate
}
void loop() {
  // Checks if the data is coming from the serial port
  if(Serial.available() > 0){ 
    state = Serial.read(); // Read the data from the serial port
 }
 Deciding functions for LED on and off 
 if (state == '0') {
  digitalWrite(ledPin, LOW); // Turn LED OFF
  // Send back, to the phone, the String "LED: ON"
  Serial.println("LED: OFF"); 
  state = 0;
 }
 else if (state == '1') {
  digitalWrite(ledPin, HIGH);
  Serial.println("LED: ON");;
  state = 0;
 } 
}

与 HC-05 交互的 Android 应用程序

现在,我们将开发一个小的android 应用程序来演示蓝牙模块和android 应用程序的连接。为此,我们将使用 Android Studio 和上述微控制器上的 C 代码。

Algorithm:
Create an empty project on Android Studio
Create a ListView containing all the available bluetooth devices. 
Get the name and MAC-address of HC-05 module.
Open connection with HC-05 module.
Instruct the module with data as bytes.

理解代码

1.获取ListView中的所有蓝牙设备

此代码用于 MainActivity 或将显示列表的第一个活动,然后在选择设备时,控制活动将发出命令。

// Initializing the Adapter for bluetooth
private BluetoothAdapter BluetoothAdap = null;
private Set Devices;
// comes in Oncreate method of the activity
BluetoothAdap = BluetoothAdapter.getDefaultAdapter();
  
// Method to fill the listwith devices
private void pairedDevices()
{
    Devices = BluetoothAdap.getBondedDevices();
    ArrayList list = new ArrayList();
  
    if (Devices.size() > 0) {
        for (BluetoothDevice bt : Devices) {
            // Add all the available devices to the list
            list.add(bt.getName() + "\n" + bt.getAddress());
        }
    }
    else {
        // In case no device is found
        Toast.makeText(getApplicationContext(), "No Paired Bluetooth Devices Found.", Toast.LENGTH_LONG).show();
    }
  
    // Adding the devices to the list with ArrayAdapter class
    final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, list);
    devicelist.setAdapter(adapter);
  
    // Method called when the device from the list is clicked
    devicelist.setOnItemClickListener(myListListener);
}

2.获取设备名称和MAC地址

现在我们将为列表创建一个 OnClick 侦听器,以便可以从设备中提取名称和 MAC 地址。

// On click listener for the Listview
private AdapterView.OnItemClickListener myListListener = new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView av, View v, int arg2, long arg3)
    {
        // Get the device MAC address
        String name = ((TextView)v).getText().toString();
        String address = info.substring(info.length() - 17);
  
        // Make an intent to start next activity.
        Intent i = new Intent(MainActivity.this, Control.class);
        // Put the data got from device to the intent
        i.putExtra("add", address); // this will be received at control Activity
        startActivity(i);
    }
};

3.建立两者之间的联系

控件中的 connect()函数。 Java将有助于建立两者之间的联系。

BluetoothAdapter myBluetooth = null;
BluetoothSocket btSocket = null;
// This UUID is unique and fix id for this device
static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
  
// receive the address of the bluetooth device
Intent intent = getIntent();
address = intent.getStringExtra("add");
  
try {
    if (btSocket == null || !isBtConnected) {
        myBluetooth = BluetoothAdapter.getDefaultAdapter();
  
        // This will connect the device with address as passed
        BluetoothDevice hc = myBluetooth.getRemoteDevice(address);
        btSocket = hc.createInsecureRfcommSocketToServiceRecord(myUUID);
        BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
  
        Now you will start the connection
            btSocket.connect();
    }
}
catch (IOException e) {
    e.printStackTrace();
}

4.最后指挥HC-05模块

这里首先我们将检查我们的套接字是否已连接,然后我们将继续避免空指针异常。

// Function for commanding the module
private void turnOffLed()
{
    if (btSocket != null) {
        try { // Converting the string to bytes for transferring
            btSocket.getOutputStream().write("0".toString().getBytes());
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

现在终于,当我们用 HC-05 模块和 Android 编程完成我们的第一个基本项目时,我们可以转向复杂的电子机器人,并使用这个惊人的模块 HC-05 将有线连接到无线,而且我们现在知道如何制作自定义应用程序。

您可以在此处以提交的 Android Studio 项目的形式找到上述代码。