机器人与人工智能爱好者论坛

 找回密码
 立即注册
查看: 6776|回复: 0
打印 上一主题 下一主题

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

[复制链接]

257

主题

279

帖子

1655

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1655
跳转到指定楼层
楼主
发表于 2016-6-1 08:44:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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 模块的更多信息。

  1. /**
  2. * @author - hovig ohannessian
  3. * @date   - 25-Mar-15
  4. * xbee module #1
  5. */


  6. int buttonInput = 2;
  7. int buttonState = 0;
  8. int ledOutput = 13;
  9. char readChar;




  10. void setup() {
  11.   Serial.begin(9600);
  12.   pinMode(ledOutput, OUTPUT);
  13.   pinMode(buttonInput, INPUT);
  14.   digitalWrite(buttonInput, HIGH);
  15. }


  16. void loop() {
  17.   buttonState = digitalRead(buttonInput);
  18.   if (buttonState == HIGH) {
  19.     digitalWrite(ledOutput, LOW);
  20.   } else {
  21.     Serial.print('H');
  22.     digitalWrite(ledOutput, HIGH);
  23.     delay(1000);
  24.   }
  25. }
复制代码

第 2 部分 – Xbee 2、Arduino、蜂鸣器

查阅 xbee2-arduino-setup,了解设置 Xbee2 模块的更多信息。

  1. /**
  2. * @author - Hovig Ohannessian
  3. * @date   - 25-Mar-15
  4. * xbee module #2
  5. */
  6. int buzzer = 11;


  7. void setup() {
  8.   pinMode(buzzer, OUTPUT);
  9.   Serial.begin(9600);
  10. }


  11. void loop() {
  12.   while(Serial.available() == 0);
  13.     if(Serial.read() == 'H') {
  14.       digitalWrite(buzzer, HIGH);
  15.       delay(3000);
  16.       digitalWrite(buzzer, LOW);
  17.       delay(1000);
  18.     }
  19. }
复制代码


第 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 地址,那么可以想出一个。
  1. #include <SPI.h>
  2. #include <Ethernet.h>
  3. #include <IPStack.h>
  4. #include <Countdown.h>
  5. #include <MQTTClient.h>
  6. #define MS_PROXY "quickstart.messaging.internetofthings.ibmcloud.com"
  7. #define MQTT_PORT 1883
  8. #define MQTT_MAX_PACKET_SIZE 100
  9. byte mac[] = { 0x12, 0xFF, 0xBB, 0xCC, 0xDE, 0x11 };
  10. #define MQTT_CLIENTID "d:quickstart:iotsample-arduino:12ffbbccde11"
  11. #define MQTT_TOPIC "iot-2/evt/status/fmt/json"
  12. EthernetClient c;
  13. IPStack ipstack(c);
  14. MQTT::Client<IPStack, Countdown, 100, 1> client = MQTT::Client<IPStack, Countdown, 100, 1>(ipstack);
  15. int incomingByte = 11;
  16. String deviceEvent;
  17. int pin;


  18. void setup() {
  19.   Serial.begin(9600);
  20.   Ethernet.begin(mac);
  21.   pinMode(2, INPUT);
  22.   delay(2000);
  23. }


  24. void loop() {
  25.   int rc = -1;
  26.   if (!client.isConnected()) {
  27.     Serial.println("Connecting to IoT Foundation");
  28.     while (rc != 0) {
  29.       rc = ipstack.connect(MS_PROXY, MQTT_PORT);
  30.     }
  31.    
  32.     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
  33.     data.MQTTVersion = 3;
  34.     data.clientID.cstring = MQTT_CLIENTID;
  35.     rc = -1;
  36.     while ((rc = client.connect(data)) != 0)
  37.     ;
  38.     Serial.println("Connected successfully\n");
  39.     Serial.println("Value\tDevice Event (JSON)");
  40.     Serial.println("____________________________________________________________________________");
  41.   }


  42.   MQTT::Message message;
  43.   message.qos = MQTT::QOS0;
  44.   message.retained = false;
  45.   deviceEvent = String("{\"d\":{\"myName\":\"Arduino Uno\",\"value\":");
  46.   char buffer[60];
  47.   //   if(Serial.available()>0) {
  48.         //incomingByte = Serial.read();
  49. // }
  50.   dtostrf(getValue(),1,2, buffer);
  51.   deviceEvent += buffer;
  52.   deviceEvent += "}}";
  53.   Serial.print("\t");
  54.   Serial.print(buffer);
  55.   Serial.print("\t\t");
  56.   deviceEvent.toCharArray(buffer, 60);
  57.   Serial.println(buffer);
  58.   message.payload = buffer;
  59.   message.payloadlen = strlen(buffer);
  60.   rc = client.publish(MQTT_TOPIC, message);
  61.   
  62.   if (rc != 0) {
  63.     Serial.print("return code from publish was ");
  64.     Serial.println(rc);
  65.   }
  66.   client.yield(1000);
  67. }


  68. double getValue(void) {
  69.   pin = digitalRead(2);
  70.   return (pin);
  71. }
复制代码

有关 Bluemix Node-RED 和 MongoDB 设置和代码,请查阅 Node RED Bluemix


结果将按以下方式传输到 Mongo 数据库中和 YOUR_APP_NAME.mybluemix.net 网页上:
  1. {
  2.     "_id": {
  3.         "$oid": "XXXXXXXXXXXXXXXXXXXXXXXX"
  4.     },
  5.     "d": {
  6.         "myName": "Arduino Uno",
  7.         "value": 0
  8.     }
  9. }
复制代码

值为 0,在从 Xbee1 向 Xbee2 发送一个信号时,该值将转换为 1,而且以太网将读取它并通过 IBM 的物联网MQTT 将它发送到 MongoDB。然后,每次有针对 Bluemix 的 Node Red 的 HTTP 请求时,Bluemix 的 Node Red 就会从数据库查询数据:YOUR_APP_NAME.mybluemix.net/status。
可向此项目添加的功能是,您可以解析来自数据库的输出,当值为 1 时,可向您的手机发送一个推送通知。
参考资料
§IBM Bluemix IoT Foundation:Arduino Uno — Recipe



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|Archiver|手机版|小黑屋|陕ICP备15012670号-1    

GMT+8, 2024-4-19 20:20 , Processed in 0.060550 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表