Translate

2015年5月28日木曜日

Intel Edison for Arduino上の光センサデータをIBM IoT Foundation QuickStartへ送信する



前の記事

Arduino YUN上の温湿度センサデータをIBM IoT Foundation QuickStartへ送信する

ではArduino YUNを使ったのだけど、今回はIntel Edison Kit for Arduinoで試してみた。
ただ、DHTライブラリをつかおうとすると、ヘッダファイルに埋め込まれた"#error CPU SPEED NOT SUPPORTED"にひっかかってしまったので、以下の光センサを使った。

スイッチサイエンス:Grove - 光センサ


配線はほぼDHTの場合と同じ。オス・オスのジャンパ線で以下のように結線した。

  • 光センサ側GND(黒)→Edison(Arduino)GND
  • 光センサ側VCC(赤)→Edison(Arduino)5V
  • 光センサ側SIG(黄)→Edison(Arduino)A0




Edisonのほうは、前に書いた記事

Intel Edison をセットアップしてLチカまで持っていく


を済ませて、PuTTYから「configure_edison --setup」を実行して初期設定をすませておいた状態のものを使った。


Edison用のArduino IDE(執筆時1.6.0)を起動して、ボードを「Intel Edison」、ポートを「Intel Edison Virtual COM Port」のCOM番号を選択しておく。ライブラリは前の記事を参考のこと。

Sketchプログラムは、以下のとおり。

#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>

// Intel Edison Kit for Arduino

// MAC アドレス(PuTTYでifconfigすればわかるので書き換える)
byte mac[]    = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX };
char macstr[] = "xxxxxxxxxxxx";

// WiFi(環境に合わせて書き換える)
char ssid[] = "XXXXX";
char pass[] = "XXXXXXX";

// クライアントオブジェクト
WiFiClient c;

// 光量センサ

// LIGHT sig ピン
#define LIGHTPIN A0

float lightLevel = 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");
 
  // WiFi 初期化
  WiFi.begin(ssid, pass);
  Serial.println("Start wifi");
 
  // 待機
  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\": \"Intel Edison for Arduino Light\",";
  data+="\n";
  data+="\"lightLevel\": ";
  data+=(int)lightLevel;
  data+="\n";
  data+="}";
  data+="\n";
  data+="}";
  return data;
}

void getData() {
  int sensorValue = analogRead(LIGHTPIN);
  lightLevel = (float) (1023-sensorValue)*10/sensorValue;
}

前の記事に書いたとおりIBM IoT FoundationのTry QuickStartからMACをアドレスを指定してしばらく待つと、グラフ表示される。


光センサの補正は、どこかの本で書いたものを使ったが、補正は必要かな。

Arduino IDEのWiFiライブラリがつかえるのがありがたい。これでWiFi接続がとっても簡単。

でも本当はmarrとかをJavaScriptで書かないとダメなことはわかっているんだけど..

しかもEdisonでpsしたら、mosquittoあがってるし..ブローカとしてEdisonを使ってあげるのが正しい?!

0 件のコメント:

NVIDIA K20C で Tensor2Tensor を動かしてみた

ふとしたことで一時的にNVIDIA K20Cが使える機会ができた。 ので、ココぞとばかりに前に動かしたTransformerモデルの 実装サンプル Tensor2Tensor を オプションなし で動かしてみた。 [GitHub]T2T: Tensor2Tensor Tra...