Arduino Uno と IBM IoT Foundation を利用してクラウド対応の温度センサーを作成する
第 1 回 回路を組み立てて環境を構築する
http://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-arduino-iot1/
第 2 回 スケッチを作成して IBM IoT Foundation Quickstart に接続する
http://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-arduino-iot2/
簡単にいえば、Arduino UNOにEthernetシールドと温湿度一体型センサDHT11をつないでIBM IoT FoundationのQuickStart(MQTTブローカ)にデータを送信するデモを作ることができるというもの。
で..どうせこれからもIoTデモを作っていくなら、EthernetとWiFi両方付いているArduino YUNのほうがすっきりするんじゃないの?とない頭をまわし、Arduino YUNを手に入れた。
先の記事でWiFi設定したのはこのためだ。
Arduino YUNのWiFi設定を有効にする
http://fight-tsk.blogspot.jp/2015/05/arduino-yunwifi.html
SketchプログラムはYUNになるとEthernetライブラリ(EthernetクラスやEthernetClientクラス)は使わずにかわりにBirdgeライブラリ(BridgeクラスとYunClientクラス)に差し替えなければならない。
また、どうせセンサを入手するなら裸のセンサをダイレクトに繋がずに、Groveキットになっているものをつかえば、プルアップ抵抗も組み付けてくれているのでよいかな、しかもGroveキットにDHT22というDHT11より精度の上の製品が出ているので、こっちを使うことにした。
GROVE - デジタル温度・湿度センサPro SEN51035P
https://www.switch-science.com/catalog/819/
Arduino YUNとSEN51035Pは、赤・黒・黄のオス・オスのジャンパ線3本用意して、以下のように接続した。
- SEN51035P GND(黒) と Arduino YUN GND
- SEN51035P VCC(赤) と Arduino YUN 5V
- SEN51035P SIG(黄) と Arduino YUN A0
SketchプログラムのほうもDHT11ライブラリではなく、製品Wiki にのっていた以下のライブラリを使用した。
Arduino library for the DHT series temperature&humidity sensors
https://github.com/Seeed-Studio/Grove_Temperature_And_Humidity_Sensor
書き換えたScketctプログラムは、以下のとおり。
#include <SPI.h>
#include <Bridge.h>
#include <Console.h>
#include <YunClient.h>
#include <DHT.h>
#include <PubSubClient.h>
/*
* Arduino YUN
* + 温湿度センサ DH22 (SIG -> A0)
*
* IBM IoT Foundation
* https://internetofthings.ibmcloud.com/
* -> Try QuickStart
* -> MAC:b4218af800a8
*/
// Arduino YUN
// MAC アドレス(要書き換え)
byte mac[] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
char macstr[] = "xxxxxxxxxxxx";
// クライアントオブジェクト
YunClient c;
// 温湿度センサ
// DHT sig ピン
#define DHTPIN A0
// センサ種類
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// センサオブジェクト
DHT dht(DHTPIN, DHTTYPE);
float tempF = 0.0;
float tempC = 0.0;
float humidity = 0.0;
// MQTTブローカ
// PC (mosquitto)
//byte localserver[] = {192, 168, 1, 13 };
// IBM IoTF quickstart
char servername[]="messaging.quickstart.internetofthings.ibmcloud.com";
String clientName = String("d:quickstart:arduino:") + macstr;
String topicName = String("iot-2/evt/status/fmt/json");
// MQTTクライアントオブジェクト
//PubSubClient client(localserver, 1883, 0, c);
PubSubClient client(servername, 1883, 0, c);
void setup() {
// シリアル初期化
Serial.begin(9600);
while (!Serial) {
; // 待機
}
Serial.println("Start serial");
// センサオブジェクト初期化
dht.begin();
Serial.println("Start dht");
// Bridge 初期化
Bridge.begin();
Serial.println("Start bridge");
// 待機
delay(2000);
}
void loop() {
char clientStr[34];
clientName.toCharArray(clientStr,34);
char topicStr[26];
topicName.toCharArray(topicStr,26);
getData();
if (!client.connected()) {
Serial.print("Trying to connect to: ");
Serial.println(clientStr);
client.connect(clientStr);
}
if (client.connected() ) {
String json = buildJson();
char jsonStr[200];
json.toCharArray(jsonStr,200);
boolean pubresult = client.publish(topicStr,jsonStr);
Serial.print("attempt to send ");
Serial.println(jsonStr);
Serial.print("to ");
Serial.println(topicStr);
if (pubresult)
Serial.println("successfully sent");
else
Serial.println("unsuccessfully sent");
}
delay(5000);
}
String buildJson() {
String data = "{";
data+="\n";
data+= "\"d\": {";
data+="\n";
data+="\"myName\": \"Arduino DHT22\",";
data+="\n";
data+="\"temperature (F)\": ";
data+=(int)tempF;
data+= ",";
data+="\n";
data+="\"temperature (C)\": ";
data+=(int)tempC;
data+= ",";
data+="\n";
data+="\"humidity\": ";
data+=(int)humidity;
data+="\n";
data+="}";
data+="\n";
data+="}";
return data;
}
void getData() {
humidity = dht.readHumidity();
tempF = dht.readTemperature(true);
tempC = dht.readTemperature(false);
}
YUNに書き込んで、シリアルコンソールを開いた後、IBM IoT FoundationのQuickStartサイトにMACアドレスを入力するとグラフが表示される。
MQTTブローカへ接続するためのライブラリだが、PubSubClientライブラリのほうがPahoライブラリより軽いので、Arduinoにはこっちのほうがよいかもしれない。
Arduinoを使ってみて気づいたが、メモリを75%以上使ったプログラムは、複数回実行しても同じ動作をしてくれないことがあり、開発者をこまらせてくれる。
回路側の合計アンペア数はこえるとピタッと止まるが、途中まで通信できていたのに途中からエラーになったりする。
メモリ潤沢なWebアプリ開発者がArduino快活すると、これまで使ったことのない筋肉を突然使って筋肉痛起こしているような感覚になる..





























