Android Things 教程:使用 UART 与 Arduino 通信,读取 DHT22 传感器值

已经有很多的外设驱动程序,可以安装在 Android Things 应用程序上。这份驱动程序的名单一直在变长,这些驱动程序都是如何由社区成员开发的,这真是太神奇了。使用 Android Things 的时候,如果你碰巧有一个不被平台支持的传感器,你可以写一个驱动程序。甚至有一些关于这个主题的好文章。

建设物联网设备的一个非常普遍的任务是:采取环境测量,如湿度和室温。因为它提供了这些东西,所以想到的一个传感器就是 DHT22,因为它价格低廉,可用性广泛。我已经有一个温度传感器,我认为我找到一个驱动程序。

问题

我很快意识到没有相关的驱动,并决定建立一个。然而也很快就清楚了,在这一点上这是不可能实现的。虽然 contrib 库中的大多数驱动程序都使用已知的协议,例如UARTI2CSPI,但 DHT22 以非常高的速度使用自定义通信协议。以下是数据表中的一些必要的速度(一些中文信息):

DTH22 数据表

请注意,某些突出显示的值正在讨论的单位 μs(微秒),即 0.001 毫秒。这个讨论帖 描述了在 Native SDK 中,GPIO 的速度从 0.23ms 增加到了 0.15ms,它仍然只是 150μs,远不及传感器要求的 20-40μs。

同一个帖子描述了来自 Android Things 中的安全模型延迟,以及使用 Linux 的事实,该 Linux 不是实时操作系统。与 Android Things 团队成员的对话建议如下:

您不可能在应用程序层获得一致的 sub-1ms 时序。如果线上的数据与 UART 时间相同,则可以使用自定义波特率(即 ~25K 波特)进行写入、读取。 否则,你可能不得不在 MCU 上实现它。

那个 MCU 可以是 Arduino,而且我知道 DHT22 可以很好地工作。所以我把一个小库 放在 GitHub 上,使得 Android Things 与 Arduino 接口更容易,并通过 UART 进行通信。

Arduino

我使用了 Arduino Nano 来连接我的传感器,但是您可以使用任何 Arduino。我有一个理论认为还有其他的 MCU 也可以使用,如 ATTiny85,但还没有测试过。

我用下面的代码编码了我的 Arduino Nano:

#include <DHT.h>;
#define DHTPIN 2 // Arduino Pin
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

//Variables
float hum;  //Stores humidity value
float temp; //Stores temperature value

void setup() {                
  // Turn the Serial Protocol ON
  Serial.begin(115200);

  // Initialize device.
  dht.begin();
}

void loop() {
    int inByte = Serial.read();
    switch (inByte) {
    case 'T':
      // Return the current (T)emperature
      getTemperature();
      break;
    case 'H':
      // Return the current (H)umidity
      getHumidity();
      break;
  }
}

void getTemperature(){
  temp = dht.readTemperature();
  String value = "$";
  value += temp;
  value += "#";

  char charBuf[value.length()+1];
  value.toCharArray(charBuf, value.length()+1);

  Serial.write(charBuf);
}

void getHumidity(){
  hum = dht.readHumidity();
  String value = "$";
  value += hum;
  value += "#";

  char charBuf[value.length()+1];
  value.toCharArray(charBuf, value.length()+1);

  Serial.write(charBuf);
}

你也可以通过打开这个链接,直接把这个烧录到你的 Arduino 上。

一旦你把它烧录到你的 Arduino 上时,是时候把它连接起来,并与 Raspberry Pi 连接。下面的电路图展示了如何连接,但基本思路是,当你通过 UART 通信时,你需要连接 TX(发送端)到 RX(接收端),反之亦然。

ArduWrap

如果电源不同,我们还需要将 Raspberry Pi 上的 GND 引脚连接到 Arduino 上的 GND,因为它们需要共地。

Android Things 项目

现在,我们已经将 Arduino 连接到了 Raspberry Pi,让我们将库添加到我们的项目中。如果你还没有一个项目,你可以看看Get started with Android Things today!,或者克隆这个资源库。

打开项目级的 build.gradle,并添加 Jitpack 作为其中的一个源。你的 allprojects 部分应该看起来像这样:

allprojects {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

转到应用程序级别的 build.gradle 并添加一个依赖到库和同步。

dependencies {
    ...
    compile 'com.github.mplacona:arduwrap:v0.21'
}

打开 MainActivity.java 并在 onCreate 方法的底部,创建一个新的 Arduino 实例。它将告诉我们的库关于我们的 MCU 的信息。您可以指定速度,我们正在使用的设备,开始和停止位。您可以在这里 阅读更多关于这些信息,或者如果您拥有与上面显示的完全相同的设备,请使用默认设置。

Arduino mArduino = new Arduino.ArduinoBuilder()
        //.uartDeviceName(UART_DEVICE_NAME)
        //.baudRate(BAUD_RATE)
        //.dataBits(DATA_BITS)
        //.stopBits(STOP_BITS)
        .build();

我们将在这个例子中使用 DHT22 驱动程序,以便创建一个传递 Arduino 对象的新实例

dht22Driver = new Dht22Driver(mArduino);
        dht22Driver.startup();

现在你可以向这个类的方法提出请求,这个方法在我写之篇文章的时候是 getTemperaturegetHumidity

Log.d(TAG, "Temperature:" + dht22Driver.getTemperature());
Log.d(TAG, "Humidity:" + dht22Driver.getHumidity());

如果你运行该应用程序,你应该在日志中看到以下内容:

Arduwap 日志

限制?

在这里并没有太多限制,因为除非你的传感器以非常快的速度发回很多信息,否则 UART 将能够毫无问题地处理它。

您可以继续添加额外的传感器,并使用已经为 Arduino 构建的库。如果你这样做的话,请确保你使用包装器和 Arduino 代码来贡献给 Arduwrap 库。Happy hacking!

原文链接:How to use Arduino libraries with Android Things

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.