不知道这个功能?你的Android手机白用了

传感器技术Focus 2017-07-11 11:10:33
用手机看
扫描到手机,新闻随时看

扫一扫,用手机看文章
更加方便分享给朋友

来源:CSDN物联网开发        图1.AndroidApp控制LED    图2.AndroidApp界面  接收示例  下图是Android手机接收数据的示例。Arduino开发板通过温度传

来源:CSDN物联网开发

  

  

  

  图1. Android App 控制 LED

  

  图2. Android App 界面

  接收示例

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

  

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

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

  步骤1 接线和零件清单

  

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

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

  零件清单:

  Arduino开发板

  蓝牙串口模块

  

  步骤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;

  }

  }

  

  图5. 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;

  }

  

声明:本文由入驻焦点开放平台的作者撰写,除焦点官方账号外,观点仅代表作者本人,不代表焦点立场。