Arduino + Xbee + Bluemix = 将设备连接到云  
dW@大冰  
 
本教程将建立一种无线通信,以便远程控制设备的打开/关闭,或者为您提供一个传感器而不是按钮,在每次邮件到达您邮箱时发出信号,让您知道有邮件到达。 本项目包含三个主要部分: §Arduino + Xbee + 按钮 + LED 灯 §Arduino + Xbee + 蜂鸣器 §Arduino + 以太网 + Bluemix 在第 1 部分中,当按下按钮时,LED 灯会打开并从 Xbee1 向 Xbee2 发送一个信号;在第 2 部分中,蜂鸣器会发出声音。与此同时,该信号会被以太网 Arduino 读取,并通过 MQTT 通信发送到 Bluemix 的MongoDB。Node-RED 将处理以太网 Arduino 的读取,并将它发送到 MongoDB,它还会在您在 Bluemix 应用程序链接上使用 /status 时检索数据库中的内容。 备注:本项目可在插入 Arduino 中的外部电池上运行。硬件设置可能有所不同,您可能会使用更少量的 Arduino。您可以选择构建自己的项目,本教程将为您提供基本的入门知识或参考。所以要执行这个项目,我们首先需要: §Arduino(3 个) §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 灯和一个按钮
 
 - /**
 
 - * @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[60];
 
 -   //   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 时,可向您的手机发送一个推送通知。 参考资料 
  
 
 |