机器人与人工智能爱好者论坛
标题: Arduino + Xbee + Bluemix = 将设备连接到云 [打印本页]
作者: irobot 时间: 2016-6-1 08:44
标题: Arduino + Xbee + Bluemix = 将设备连接到云
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 时,可向您的手机发送一个推送通知。
参考资料
欢迎光临 机器人与人工智能爱好者论坛 (http://robot-ai.org/) |
Powered by Discuz! X3.2 |