所有关于电路
项目

通过蓝牙控制Arduino

2015年11月26日通过Hariharan Mathavan

本文将向您展示如何使用蓝牙在Arduino和Android智能手机之间设置双向通信。

利用蓝牙的力量与您的Arduino通信!

这是第二部分一个系列它将专注于使用蓝牙与Arduino通信。蓝牙是一种流行的无线通信技术,因为它具有低功耗、低成本和轻堆栈,但补偿范围。

需求

  • 一个Arduino
    Arduino的任何模型都可以使用,但本文中的所有代码和示意图都将用于Uno
  • 带有蓝牙的安卓智能手机
    在设置中选择“无线和网络”,检查你的手机是否有蓝牙。

  • HC-05蓝牙模块
    这个模块是目前最流行的蓝牙模块。基本版相当便宜。在模块和Arduino之间连接电线的麻烦可以通过使用a蓝牙屏蔽或者是蜜蜂形状的BTBee和一个蜜蜂的盾牌

  • Android工作室

  • Arduino的USB连接线

设置硬件

要使用HC05模块,只需将VCC连接到Arduino上的5V输出,GND到地,RX到Arduino的TX引脚,反之亦然。[编者注:RX引脚没有官方的5v容忍度;它是为3.3 V信号设计的。Arduino产生一个5v信号,所以应该使用分压器或逻辑级转换器来确保Arduino信号不会损坏HC05。]如果使用带屏蔽的BTBee模块,需要设置板上跳线,使DOUT引脚和D0引脚短路,DIN引脚和D1引脚短路。这样做是因为Arduino上的RX引脚是引脚0,TX引脚是引脚1。您可以自由使用任何其他引脚作为RX和TX引脚,但您必须使用Arduino的SoftwareSerial库来实现这一点。记得在上传代码时删除跳线吗如果您选择了引脚0和1作为串行引脚,则可以将其连接到Arduino。

连接HC05模块

连接HC05模块

跳线连接到BTBee屏蔽上的引脚0和1

跳线连接到BTBee屏蔽上的引脚0和1

如果是第一次使用模块,您将需要更改名称、密码等。为此,应该将模块设置为命令模式。将键脚连接到Arduino上的任何脚,并将其设置为高,以允许对模块进行编程。如果你用的是BTBee,那就有点棘手了。虽然官方维基说,必须按住Mode按钮才能将其更改为命令模式,而释放它又会将其更改为数据模式,但事实并非如此:相反,按住Mode按钮,然后快速按下并释放Reset按钮。你会注意到指示灯的闪烁速度比平时慢。

为模块编程,使用一组称为AT命令的命令。以下是其中一些:

检查连接状态。
在+名字=“ModuleName” 设置设备名称
在+ ADDR 检查MAC地址
在+ UART 检查波特率
在+ UART = " 9600 " “波特率”设置为“9600”
在+ PSWD 检查默认密码
在+ PSWD = " 1234 " 设置密码为1234

所有set命令在成功执行时返回“OK”。

下面是一些更改名称的代码。跳线连接到4和5,因为模块的响应将在串行监视器上打印出来。在本文末尾的“下载代码”按钮中可以找到完整的代码。

//如果你不使用BTBee连接设置引脚连接到关键引脚高#include <SoftwareSerial。h > SoftwareSerial BTSerial(4、5);void setup() {String setName = String("AT+NAME=MyBTBee\r\n");//设置名称为MyBTBee serialbegin (9600);BTSerial.begin (38400);BTSerial.print(“\ r \ n”);/ /检查状态延迟(500);while (BTSerial.available()) {Serial.write(BTSerial.read());} BTSerial.print (setName);//Send命令更改名称delay(500);while (BTSerial.available()) {Serial.write(BTSerial.read()); }} void loop() {}

编程Arduino

没有额外的库用于连接蓝牙模块,因为Arduino的RX和TX引脚与模块的引脚短路了。所有的数据——传出的和传入的——都必须通过这个模块。接口模块就这么简单。
为了了解它是如何工作的,让我们将DHT-11温度传感器连接到Arduino上。当收到字母“t”时,温度、湿度和热指数就会传回来。要使用DHT-11,请使用DHT图书馆使用Adafruit。

使用DHT-11

屏蔽和连接的DHT传感器

屏蔽和连接的DHT传感器

下面是用于从DHT传感器读取数据、处理数据并通过蓝牙发送数据的代码。

#包括双氢睾酮”。h" #define DHTPIN 2 #define DHTTYPE DHT11 DHT DHT (DHTPIN, DHTTYPE);void setup() {Serial.begin(9600);} void loop() {char c;if(Serial.available()) {c = Serial.read();如果(c = = t) readSensor ();}} void readSensor() {float h = dht. read湿度();float t = dht.readTemperature();if (isnan(h) || isnan(t)) {Serial。println("Failed to read from DHT sensor!"); return; } float hic = dht.computeHeatIndex(t, h, false); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print("Heat index: "); Serial.print(hic); Serial.print(" *C "); }

安卓应用程序

看一下previous文章来快速介绍一下Android应用程序以及这个应用程序的布局。

Android应用程序的布局

程序流程将如上所示。

编辑AndroidManifest.xml

由于该应用程序将使用的额外硬件是板载蓝牙适配器,它将不得不在清单中提到。

uses-permission android: name = " android.permission。蓝牙" / >

连接设备

首先检查是否存在蓝牙适配器。

BluetoothAdapter BluetoothAdapter = BluetoothAdapter.getDefaultAdapter ();if (bluetoothAdapter == null) {Toast.makeText(getApplicationContext(),“设备不支持蓝牙”,Toast.LENGTH_SHORT).show();}

如果它存在,检查它是否被启用。如果未启用,请请求用户权限启用。

if(!bluetoothAdapter.isEnabled()) {Intent enableAdapter =新的Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);startActivityForResult (enableAdapter 0);}

设备必须配对后,应用才能使用它。请参见下面的章节了解如何将BT模块与话机配对。既然适配器已经启用,那么就检查配对/绑定的设备。使用上一节中的AT命令,给设备一个合适的名称。同时找出它的MAC地址。这里比较MAC地址是否匹配,因为名称可能经常更改。

Set bondedDevices = bluetoothAdapter.getBondedDevices();if(bondedDevices.isEmpty()) {Toast.makeText(getApplicationContext(),"请配对设备首先",Toast.LENGTH_SHORT).show();} else {for (BluetoothDevice iterator: bondedDevices) {if(iterator. getaddress ().equals(DEVICE_ADDRESS)) //如果比较设备名,使用iterator. getname()替换。{设备=迭代器;//device是BluetoothDevice found类型的对象=true;打破;}}}

在获得蓝牙设备之后,必须创建一个套接字来处理传出连接。这里使用了RFCOMM套接字。RFCOMM——也称为串行端口配置文件——本质上是一种模拟RS232电缆的蓝牙协议。

套接字= device.createRfcommSocketToServiceRecord (PORT_UUID);socket.connect ();

然后获取套接字的输入和输出流。

outputStream = socket.getOutputStream ();inputStream = socket.getInputStream ();

读取输入数据

因为数据可以在任何时候接收,所以运行一个线程来监听数据是最好的选择。首先,查询输入流以获取可用数据。然后,将字节转换为人类可读的UTF-8格式,并将文本发送给处理程序,以便发布到UI上。这样做是因为UI不能从后台线程更新。

int byteCount = inputStream.available();if(byteCount > 0) {byte[] rawBytes = new byte[byteCount];read (rawBytes);final String String =new String(rawBytes,"UTF-8");处理程序。post(new Runnable() { public void run() {  textView.append(string); } }); }

传输数据

要发送数据,请将字符串传递给OutputStream。

outputStream.write (string.getBytes ());

下载该应用程序的源代码

ArduinoBluetooth(源). zip

测试应用程序

首先,通过在系统设置的蓝牙选项卡中扫描新设备,将手机和模块配对。应该出现前面设置的名称。输入设置密码(默认是0000或1234)。

蓝牙配对请求

打开Arduino后,您可能会注意到BTBee的状态LED定期闪烁。现在打开应用程序,点击开始。状态LED必须关闭,控制面板LED将发光。这表明已经建立了连接。

BTBee状态指示灯周期性闪烁

当“t”被发送到Arduino时,它会回应温度、湿度和热指数。

使用

这是一个使用蓝牙进行数据传输的简单展示。注意,如果你不想使用这里提供的应用,你也可以使用Arduino蓝牙串行终端应用。蓝牙可以用来控制很多日常事情的自动化,比如打开一个灯泡,这可以通过使用一个继电器Arduino。本文结束了关于Arduino与Android手机接口的两部分系列文章。可以找到关于使用串行电缆的第一部分在这里

自己尝试一下这个项目吧!BOM。

26日的评论
  • B
    briantee 2016年3月7日

    当我尝试编译应用程序时,它的gradle说:

    Error:(1,0) Plugin with id ' com.android. .应用程序没有找到。
    打开的文件

    喜欢的。 回复
    • Đạt Tiến Nguyễn 2016年10月29日
      升级到appcombat, gradle到最新版本。它的工作好buildscript {repositories {jcenter() //或mavenCentral()}依赖{classpath 'com.android.tools.build:gradle:2.2.1'}依赖{compile fileTree(dir: 'lib ', include: ['*.jar'])编译'com.android.support:appcompat-v7:25.0.0'}
      喜欢的。 回复