原文: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 开发板通过温度传感器 DS18B20 获取温度值,Android App 每15秒刷新一次温度值,并且为了更好的展示效果,我实现了手机的语音播报。在后续的步骤4、5、6中将详细描述 Arduino 代码和应用程序。
接下来,我将一步步介绍布线方法,编写一个能够收发命令的 Arduino sketch , 并且编写应用程序。本教程需要你对 Arduino 有基本的了解,熟悉它的 IDE,最好做过一些小项目。这样的话,本教程中的内容将是非常好理解的,你将非常容易实现对 Arduino 的串行通信。
连线方法如上图所示,非常简单。
零件清单:
市面上的蓝牙模块多种多样,你需要查看具体蓝牙模块的数据手册,根据其 Pin 脚图进行正确的连线。
此外,蓝牙模块还根据距离的不同而分为如下两个级别:
如你所想,这两种级别的蓝牙模块是相互兼容的。只有手机和蓝牙模块两者都是1级,才能实现100米的传输。如果只有一个是1级蓝牙,那么最大传输距离将相对减小,无法达到100米。
我的串口蓝牙模块从左至于的 Pin 脚为:地、RX、TX、空、VCC。地和 VCC 分别连接 Arduino 开发板上的地和+5V引脚。我们主要是通过蓝牙模块接收手机发送的数据,然后将数据转发给 Arduino,因此只需将蓝牙模块的 TX 和 Arduino 开发板的 RX 引脚相连。另外将 Arduino 的 PIN2 和 LED相连,实现对LED的驱动。
以下是我编写的 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;
}
}
如果想获取 App 并运行,那么在该地址下载后安装即可。
你需要检查你的手机设置,设置其允许 Android Market、Google Play以外的 App,这样你才能下载。
如果你想修改 App 请点击此处,以了解如何准备计算机并安装 App Inventor 软件。运行成功之后,我建议你学习基本教程做一两个 App 练练手。
点击此处获取我的 App 源码,你可以将之上传到 App Inventor 然后下载到你的手机,随便怎么修改都可以。
本步骤将介绍一个从 Arduino 开发板接收数据的示例。
我决定做一些实用的东西,因此选择了一个 DS18B20 温度传感器。Arduino 开发板使用一根线就可以实现和传感器的通信,它调用Arduino 版的 OneWrite 库来计算温度值,然后每隔 500ms 通过蓝牙模块将温度值发送出去。
手机 App 每 500ms 轮询一次串口,如果有数据则读取并显示在手机屏幕上。此外,手机 App 还可以通过一个选项打开文本到语音的转换功能,这样手机将每隔15秒语音播报一次温度值。
你需要使用 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;
}
此处将提供用于温度读取的 App 链接,包括 apk 文件和源码。你可以随意修改源码并将其上传到 MIT’s app inventor(当你在 ‘My Project’ 中点击 ‘More Action’按钮即可看到 ‘Upload Source’ 选项)。
后续我将添加更加详细的描述,如果你想要创建自己的应用,那么有些须知你是需要了解的:确保你理解术语“分隔符 byte”;了解从 MIT’s app inventor 设置它的方法;因为 byte 所以要小心使用你的数据类型 。另外,在 App Inventor 中似乎没有实现串口的超时功能,因此发送数据比接收数据更频繁可能导致应用程序崩溃(可能是因为没有刷新缓冲区)。