irobot 发表于 2016-6-1 08:44:58

Arduino + Xbee + Bluemix = 将设备连接到云


Arduino + Xbee + Bluemix = 将设备连接到云
dW@大冰

本教程将建立一种无线通信,以便远程控制设备的打开/关闭,或者为您提供一个传感器而不是按钮,在每次邮件到达您邮箱时发出信号,让您知道有邮件到达。本项目包含三个主要部分:§Arduino + Xbee + 按钮 + LED 灯§Arduino + Xbee + 蜂鸣器§Arduino + 以太网 + Bluemix查阅 GitHub 上的 hovig / xbee-ethernet-arduino-nodered,了解有关的更多信息。在第 1 部分中,当按下按钮时,LED 灯会打开并从 Xbee1 向 Xbee2 发送一个信号;在第 2 部分中,蜂鸣器会发出声音。与此同时,该信号会被以太网 Arduino 读取,并通过 MQTT 通信发送到 Bluemix 的MongoDB。Node-RED 将处理以太网 Arduino 的读取,并将它发送到 MongoDB,它还会在您在 Bluemix 应用程序链接上使用 /status 时检索数据库中的内容。备注:本项目可在插入 Arduino 中的外部电池上运行。硬件设置可能有所不同,您可能会使用更少量的 Arduino。您可以选择构建自己的项目,本教程将为您提供基本的入门知识或参考。所以要执行这个项目,我们首先需要:§Arduino(3 个)
[*]以太网盾板 (Ethernet shield)
§Xbee Series 1(2 个)
[*]Xbee 盾板 (Xbee Shield)(2 个)
§按钮§蜂鸣器§LED§针对 5V 电压的 330 欧姆电阻(2 个)Xbee 模块 1 和模块 2 需要能够在同一个通道上无干扰地彼此通信。对于 Windows,可以使用 Putty 或 X-CTU;对于 Mac,可以使用 CoolTerm。请查阅 xbee to xbee setup.txt来了解设置步骤。您将需要 Arduino Sketch IDE(从 Arduino.cc 下载)来实现对 Arduino 的编码。第 1 部分 – Xbee 1、Arduino、LED 灯和一个按钮查阅 xbee1-arduino-setup,了解设置 Xbee1 模块的更多信息。/**
* @author - hovig ohannessian
* @date   - 25-Mar-15
* xbee module #1
*/


int buttonInput = 2;
int buttonState = 0;
int ledOutput = 13;
char readChar;




void setup() {
Serial.begin(9600);
pinMode(ledOutput, OUTPUT);
pinMode(buttonInput, INPUT);
digitalWrite(buttonInput, HIGH);
}


void loop() {
buttonState = digitalRead(buttonInput);
if (buttonState == HIGH) {
    digitalWrite(ledOutput, LOW);
} else {
    Serial.print('H');
    digitalWrite(ledOutput, HIGH);
    delay(1000);
}
}
第 2 部分 – Xbee 2、Arduino、蜂鸣器
查阅 xbee2-arduino-setup,了解设置 Xbee2 模块的更多信息。
/**
* @author - Hovig Ohannessian
* @date   - 25-Mar-15
* xbee module #2
*/
int buzzer = 11;


void setup() {
pinMode(buzzer, OUTPUT);
Serial.begin(9600);
}


void loop() {
while(Serial.available() == 0);
    if(Serial.read() == 'H') {
      digitalWrite(buzzer, HIGH);
      delay(3000);
      digitalWrite(buzzer, LOW);
      delay(1000);
    }
}

第 3 部分 – 以太网、Arduino 和 Bluemix在 Arduino Uno — 秘诀上,确保 Arduino 以太网设备已连接到 Bluemix 的物联网。一定要按照此链接中的步骤,将该设备添加到 IBM Internet of Things Foundation。查阅 ethernet-arduino-setup,了解设置以太网和Arduino 的更多信息。
我使用了 IBM Bluemix 的物联网所提供的快速入门示例代码。将最后一个方法从 getTemp() 更改为 getValue()。您需要更改下面代码中的 mac[ ] 中的 MAC 地址和 MQTT_CLIENTID。如果您的设备背面没有 MAC 地址,那么可以想出一个。#include <SPI.h>
#include <Ethernet.h>
#include <IPStack.h>
#include <Countdown.h>
#include <MQTTClient.h>
#define MS_PROXY "quickstart.messaging.internetofthings.ibmcloud.com"
#define MQTT_PORT 1883
#define MQTT_MAX_PACKET_SIZE 100
byte mac[] = { 0x12, 0xFF, 0xBB, 0xCC, 0xDE, 0x11 };
#define MQTT_CLIENTID "d:quickstart:iotsample-arduino:12ffbbccde11"
#define MQTT_TOPIC "iot-2/evt/status/fmt/json"
EthernetClient c;
IPStack ipstack(c);
MQTT::Client<IPStack, Countdown, 100, 1> client = MQTT::Client<IPStack, Countdown, 100, 1>(ipstack);
int incomingByte = 11;
String deviceEvent;
int pin;


void setup() {
Serial.begin(9600);
Ethernet.begin(mac);
pinMode(2, INPUT);
delay(2000);
}


void loop() {
int rc = -1;
if (!client.isConnected()) {
    Serial.println("Connecting to IoT Foundation");
    while (rc != 0) {
      rc = ipstack.connect(MS_PROXY, MQTT_PORT);
    }
   
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.MQTTVersion = 3;
    data.clientID.cstring = MQTT_CLIENTID;
    rc = -1;
    while ((rc = client.connect(data)) != 0)
    ;
    Serial.println("Connected successfully\n");
    Serial.println("Value\tDevice Event (JSON)");
    Serial.println("____________________________________________________________________________");
}


MQTT::Message message;
message.qos = MQTT::QOS0;
message.retained = false;
deviceEvent = String("{\"d\":{\"myName\":\"Arduino Uno\",\"value\":");
char buffer;
//   if(Serial.available()>0) {
      //incomingByte = Serial.read();
// }
dtostrf(getValue(),1,2, buffer);
deviceEvent += buffer;
deviceEvent += "}}";
Serial.print("\t");
Serial.print(buffer);
Serial.print("\t\t");
deviceEvent.toCharArray(buffer, 60);
Serial.println(buffer);
message.payload = buffer;
message.payloadlen = strlen(buffer);
rc = client.publish(MQTT_TOPIC, message);

if (rc != 0) {
    Serial.print("return code from publish was ");
    Serial.println(rc);
}
client.yield(1000);
}


double getValue(void) {
pin = digitalRead(2);
return (pin);
}
有关 Bluemix Node-RED 和 MongoDB 设置和代码,请查阅 Node RED Bluemix。

结果将按以下方式传输到 Mongo 数据库中和 YOUR_APP_NAME.mybluemix.net 网页上:{
    "_id": {
      "$oid": "XXXXXXXXXXXXXXXXXXXXXXXX"
    },
    "d": {
      "myName": "Arduino Uno",
      "value": 0
    }
}
值为 0,在从 Xbee1 向 Xbee2 发送一个信号时,该值将转换为 1,而且以太网将读取它并通过 IBM 的物联网MQTT 将它发送到 MongoDB。然后,每次有针对 Bluemix 的 Node Red 的 HTTP 请求时,Bluemix 的 Node Red 就会从数据库查询数据:YOUR_APP_NAME.mybluemix.net/status。
可向此项目添加的功能是,您可以解析来自数据库的输出,当值为 1 时,可向您的手机发送一个推送通知。参考资料§代码:hovig/xbee-ethernet-arduino-nodered§IBM Bluemix IoT Foundation:Arduino Uno — Recipe


页: [1]
查看完整版本: Arduino + Xbee + Bluemix = 将设备连接到云