如何借助蓝牙模块使用 Android 手机控制 Arduino

原文:How to Control Arduino Board Using an Android Phone and a Bluetooth Module
作者:kerimil
翻译:安翔
审校:屠敏,关注物联网、移动开发领域,寻求报道或投稿请发邮件[email protected]

本教程将教你借助一个蓝牙模块和 MIT’s app inventor(App Inventor 官方服务器) 在 Android 手机和 Arduino 开发板之间创建一个无线连接,通过两个示例(手机控制 LED、手机显示环境温度)展示手机和 Arduino 之间的通信。

发送示例

下图展示了Android App发送指令的示例。它通过蓝牙模块控制 LED 开关,可以看到,指令的发送不仅可以通过 App 界面的button,还可以通过语音。具体内容将在1、2、3步中介绍。

如何借助蓝牙模块使用 Android 手机控制 Arduino_第1张图片

图1. Android App 控制 LED

如何借助蓝牙模块使用 Android 手机控制 Arduino_第2张图片

图2. Android App 界面

接收示例

下图是 Android 手机接收数据的示例。Arduino 开发板通过温度传感器 DS18B20 获取温度值,Android App 每15秒刷新一次温度值,并且为了更好的展示效果,我实现了手机的语音播报。在后续的步骤4、5、6中将详细描述 Arduino 代码和应用程序。

如何借助蓝牙模块使用 Android 手机控制 Arduino_第3张图片

图3. Android 手机显示环境温度

接下来,我将一步步介绍布线方法,编写一个能够收发命令的 Arduino sketch , 并且编写应用程序。本教程需要你对 Arduino 有基本的了解,熟悉它的 IDE,最好做过一些小项目。这样的话,本教程中的内容将是非常好理解的,你将非常容易实现对 Arduino 的串行通信。

步骤1:接线和零件清单

如何借助蓝牙模块使用 Android 手机控制 Arduino_第4张图片

图4. 发送示例硬件连线图

连线方法如上图所示,非常简单。

零件清单:

  • Arduino开发板
  • 蓝牙串口模块
  • LED
  • 电阻(100欧)
  • 电线
  • 面包板

市面上的蓝牙模块多种多样,你需要查看具体蓝牙模块的数据手册,根据其 Pin 脚图进行正确的连线。

此外,蓝牙模块还根据距离的不同而分为如下两个级别:

  • 1级,其范围约100米(300英尺)
  • 2级,其范围约10米(30英尺)

如你所想,这两种级别的蓝牙模块是相互兼容的。只有手机和蓝牙模块两者都是1级,才能实现100米的传输。如果只有一个是1级蓝牙,那么最大传输距离将相对减小,无法达到100米。

我的串口蓝牙模块从左至于的 Pin 脚为:地、RX、TX、空、VCC。地和 VCC 分别连接 Arduino 开发板上的地和+5V引脚。我们主要是通过蓝牙模块接收手机发送的数据,然后将数据转发给 Arduino,因此只需将蓝牙模块的 TX 和 Arduino 开发板的 RX 引脚相连。另外将 Arduino 的 PIN2 和 LED相连,实现对LED的驱动。

步骤2:Arduino 代码

以下是我编写的 Arduino 代码,你可以在此基础上随意修改。
需要注意的是波特率,请确保它和你的蓝牙模块匹配,建议你仔细查看数据手册或者 AT 指令表。

const int ledPin = 2;  // the pin that the LED is attached to
byte serialA;
void setup()
{
  // initialize the serial communication:
  Serial.begin(19200); //baud rate - make sure it matches that of the module you got:
  // initialize the ledPin as an output:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {serialA = Serial.read();Serial.println(serialA);}
    switch (serialA) {
    case 1:
      digitalWrite(ledPin, HIGH);
      break;
    case 2:
      digitalWrite(ledPin, LOW);
      break;
    case 3:
      digitalWrite(ledPin, HIGH);
      delay(100);
      digitalWrite(ledPin, LOW);
      delay(100);
     default:
     break;
  }
}

步骤3: App 和 App Inventor

如何借助蓝牙模块使用 Android 手机控制 Arduino_第5张图片

图5. App Inventor 界面

如果想获取 App 并运行,那么在该地址下载后安装即可。

你需要检查你的手机设置,设置其允许 Android Market、Google Play以外的 App,这样你才能下载。
如果你想修改 App 请点击此处,以了解如何准备计算机并安装 App Inventor 软件。运行成功之后,我建议你学习基本教程做一两个 App 练练手。
点击此处获取我的 App 源码,你可以将之上传到 App Inventor 然后下载到你的手机,随便怎么修改都可以。

步骤4:从 Arduino 接收数据

本步骤将介绍一个从 Arduino 开发板接收数据的示例。
我决定做一些实用的东西,因此选择了一个 DS18B20 温度传感器。Arduino 开发板使用一根线就可以实现和传感器的通信,它调用Arduino 版的 OneWrite 库来计算温度值,然后每隔 500ms 通过蓝牙模块将温度值发送出去。

手机 App 每 500ms 轮询一次串口,如果有数据则读取并显示在手机屏幕上。此外,手机 App 还可以通过一个选项打开文本到语音的转换功能,这样手机将每隔15秒语音播报一次温度值。

步骤5:传感器的 Arduino 代码

你需要使用 OneWrite 库来计算温度值,点击此处获取 OneWrite 库的代码。

传感器相关的 Arduino 代码如下:

#include 
int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 2
void setup()
{
  // initialize the serial communication:
  Serial.begin(19200);
  // initialize the ledPin as an output:
}
void loop() {
  float temperature = getTemp();
  Serial.println(temperature); delay (500);
}
float getTemp(){
  //returns the temperature from one DS18S20 in DEG Celsius
  byte data[12];
  byte addr[8];
  if ( !ds.search(addr)) {
    //no more sensors on chain, reset search
    ds.reset_search();
    return -100;
  }
  if ( OneWire::crc8( addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return -1000;
  }
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
    Serial.print("Device is not recognized");
    return -1000;
  }
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); //start conversion, with parasite power on at the end
  byte present = ds.reset();
  ds.select(addr);
  ds.write(0xBE); // Read Scratchpad
  for (int i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
  ds.reset_search();
  byte MSB = data[1];
  byte LSB = data[0];

  float tempRead = ((MSB << 8) | LSB);
  float TemperatureSum = tempRead / 16;

  return TemperatureSum;
}

步骤6:接收数据 - 手机端

此处将提供用于温度读取的 App 链接,包括 apk 文件和源码。你可以随意修改源码并将其上传到 MIT’s app inventor(当你在 ‘My Project’ 中点击 ‘More Action’按钮即可看到 ‘Upload Source’ 选项)。

  • apk文件
  • App源码

后续我将添加更加详细的描述,如果你想要创建自己的应用,那么有些须知你是需要了解的:确保你理解术语“分隔符 byte”;了解从 MIT’s app inventor 设置它的方法;因为 byte 所以要小心使用你的数据类型 。另外,在 App Inventor 中似乎没有实现串口的超时功能,因此发送数据比接收数据更频繁可能导致应用程序崩溃(可能是因为没有刷新缓冲区)。

如何借助蓝牙模块使用 Android 手机控制 Arduino_第6张图片

你可能感兴趣的:(如何借助蓝牙模块使用 Android 手机控制 Arduino)