ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

arduinoコミュのxivelyの使い方教えてください

  • mixiチェック
  • このエントリーをはてなブックマークに追加
またこちらに投稿させていただきました。ほりすけです。

室温をクラウド上でグラフ化できるツールはないかと探した所、xivelyというサービスを知りました。
http://cranberrytree.blogspot.jp/2014/04/arduinoxivelypachube.html
こちらの記事を参考に、温度だけUPするスケッチに変更したのですが、うまくデータが反映されません。

スケッチはこちらのようにしました。

#include <SPI.h>
#include <Ethernet.h>
#include <HttpClient.h>
#include <Xively.h>

// MAC address for your Ethernet shield
byte mac[] = { macアドレス入力しています }; //各自のシールドのmacアドレスに変更

// Your Xively key to let you upload data
char xivelyKey[] = "APIキーを入力しています"; //APIキー

// Define the strings for our datastream IDs
char sensorId_temp[] = "temperature";

XivelyDatastream datastreams[] = {
XivelyDatastream(sensorId_temp, strlen(sensorId_temp), DATASTREAM_FLOAT),

};
// Finally, wrap the datastreams into a feed
XivelyFeed feed(フィードIDを入力しています, datastreams, 2 /* number of datastreams */); //XXXXXXXXXX : feed ID

EthernetClient client;
XivelyClient xivelyclient(client);

const int pin_temp = A0; //Analog input LM60


int sensorValue_temp = 0; //value read from pin_temp
float offset = 0.424; //offset 424mv
float vc = 0.00625; //+6.25mv/1℃
float temp = 0.0;
float vref = 5.0; //デフォルト参照電圧5V=電源電圧
//実際の電圧に合わせる
//USBの電圧はいいかげん


void setup() {
// put your setup code here, to run once:
Serial.begin(9600);

Serial.println("Starting multiple datastream upload to Xively...");
Serial.println();

while (Ethernet.begin(mac) != 1){
Serial.println("Error getting IP address via DHCP, trying again...");
delay(1000);
}
}

void loop() {
get_temp();
datastreams[0].setFloat(temp);
Serial.println(datastreams[0].getFloat());


Serial.println("Uploading it to Xively");
int ret = xivelyclient.put(feed, xivelyKey);
Serial.print("xivelyclient.put returned ");
Serial.println(ret);

Serial.println();
delay(1000);
}

void get_temp(){
sensorValue_temp = analogRead(pin_temp);
float v_temp = sensorValue_temp * vref / 1024;
temp = (v_temp - offset) / vc; //電圧から温度に変換
Serial.print("LM60 = " );
Serial.print(sensorValue_temp);
Serial.print("\t Volt = " );
Serial.print(v_temp,4);
Serial.print("\t TEMP = ");
Serial.println(temp);
}


上記のような内容です。
シリアルモニターにはこのような表示がされています。

S = -24.87
-24.87
Uploading it to Xively
Starting multiple datastream upload to Xively...

LM60 = 55 Volt = 0.2686 TEMP = -24.87
-24.87
Uploading it to Xively

シリアルモニターを見ると温度はきちんと拾っているみたいですが、なぜか反映されません。
ID,APIはコピペしているので間違いないと思います。

わかる方おりましたら教えてください。

コメント(17)

シリアル出力ですが、一番肝心のここはどうなってます?

int ret = xivelyclient.put(feed, xivelyKey);
Serial.print("xivelyclient.put returned ");
Serial.println(ret);

ちゃんと正の値が帰ってきてますか?ライブラリのぞいてみた感じ、サーバーのやり取りがしっぱいしたら負の値が出力されるみたいですよ。負ならアカウントがらみかネットがらみの設定が間違ってるのでは?
>>[1] 返信ありがとうございます。

負の値になっています。
API key やIDはコピペして貼付けたので問題ないかと思われます。
ネットの設定とはmacアドレスとかIPアドレスの事でしょうか?
毎度時間がなくて斜め読みだけで申し訳ないのですが、、、

要は送信したデータが正しくクラウドで正しく受信されてないのはわかりますよね?
ちょっとだけコードを追ってみたんですが、そもそもデータストリームを1つしか用意してないのに、

// Finally, wrap the datastreams into a feed
XivelyFeed feed(フィードIDを入力しています, datastreams, 2 /* number of datastreams */); //XXXXXXXXXX : feed ID

の設定(?)でデータストリームを2にしてるのが悪さしてませんか?
ライブラリの中身まで見てないのでどういう処理をしてるのかわかりませんが、APIの説明を見る限り明らかに間違ってるので確認してみてください。
ちょうど今月のInterface誌にxivelyに関する記事があり、私も興味を持ったのでいろいろやってみているところでした。
書かれたスケッチはライブラリに付属のサンプルである「DatastreamUpload」とほとんど変わらないと思いますが、私もそれとほぼ同じもので正常に動作しました。ねこ蔵さんの書かれているとおり、データストリームの数としては1を指定してます。

ちなみに気圧センサーから読んだ値を1分毎に送信してます。せっかくなので公開設定しました。明朝にかけて台風通過の様子が記録されるかと思います。
https://xively.com/feeds/660013950

表示の時刻がUTCになってしまいますねぇ…
>>[3]

いつも返信ありがとうございます。
XivelyFeed feed(フィードIDを入力しています, datastreams, 2)のところを1に直して見ました。

まだ値がマイナスになってしまいますので、APIの説明じっくり読んで、原因探ってみます。
>>[4]

返信ありがとうございます。
私も一度サンプルを使って試してみます。
サンプルを使って試してみたのですが、やはりマイナス表示になってしまいます。

温度センサーはIC LM35を使用しています。
もしかしたら、計算間違いなのかもしれません。

float offset = 0.11にしたところアナログの温度計と近似値になりました。
LM35の計算がこれでは駄目なのかな?とは思いますが、とりあえずいい値が出ました。

各種センサーの使い方や計算方法等はどのように勉強したらよいでしょうか?
オススメの書籍やホームページ、アドバイスがございましたら教えてください。
うーん、サンプルプログラムをそのまま使ってもダメっていう事は、クラウド側の設定とかでしょうかね?ネットワーク環境とかかなとも思ったんですが、同じ環境でtwitterへのhttpはちゃんと通ってたんですよね?

あとセンサの件ですが、LM35の各パラメータ(offsetの0.424とか 06.25mv/c っていったいどこから出てきたんですか?自分の記憶だとLM35はオフセットゼロで1℃が10mVというSignal Conditioningが簡単なのが売りのデバイスだったはずですが。
横槍入れます

「うまくデータが反映されません」の内容がいまいち掴めず静観していました
「シリアルモニターを見ると温度はきちんと拾っているみたい」
とのことでしたので、負温を測定しているものだと思っていました
参照元の温度センサはLM60、実際に使用されている温度センサはLM35

センサの違いを無視しているのが要因かと

センサの使い方は、データシートを見るのが一番確実
[arduino lm35」等、arduinoとセンサ名を組み合わせて検索かければ、マイナーなものでなければ何かしら参考になるスケッチは見つかるかと
あくまで「参考」なので、自身の環境と違う部分があれば、当然読み替え等が必要です
>>[8]

いつも返信ありがとうございます。

>ネットワーク環境とかかなとも思ったんですが、同じ環境でtwitterへのhttpはちゃんと通ってたんですよね?
twitterはちゃんと通りました。

>LM35の各パラメータ(offsetの0.424とか 06.25mv/c っていったいどこから出てきたんですか?
参考サイトがあったのでそのまま使用しました。
http://cranberrytree.blogspot.jp/2014/04/arduinoxivelypachube.html

まだまだ勉強不足で、
int sensorValue_temp = 0;
float offset = 0.424;
float vc = 0.00625;
float temp = 0.0;
float vref = 5.0;
この辺の意味がわからず、そのまま活用してました。
やはりコチラの計算が原因で負の値だったんですね。
勉強します。

今度は28℃異常になったら、警報メールを送信する。などやってみたいです。

>>[9]

返信ありがとうございます。

>「うまくデータが反映されません」の内容がいまいち掴めず静観していました
すみません。抽象的でした。

>参照元の温度センサはLM60、実際に使用されている温度センサはLM35 。センサの違いを無視しているのが要因かと
原因解決できました。ありがとうございます。

>センサの使い方は、データシートを見るのが一番確実
データシートですね。データシート色々見て勉強してみます。
アドバイスありがとうございました。
>>[10]

>やはりコチラの計算が原因で負の値だったんですね。

違うと思いますよ。
もしサーバーへのアップロードが正常に行える状況であれば、仮にセンサー出力の計算が間違っていれば、その間違った値がきちんとサーバーにアップロードされるはずです。そしてシリアル出力には「200」という値が表示されるはずです(正常応答の意味)。
具体的に、xivelyclient.put returned の後にはどんな数字が出ているのでしょうか?
サーバーへの接続まで出来ているならば、3ケタの数字が表示されるはずです。もしAPIキーが間違っていれば-401、フィードIDが間違っていたら-404が表示されます。
もし-3とか1桁の数字であればサーバーへの接続そのものが出来ていない可能性が高いです。

まずはサンプルのDatastreamUploadの、MACアドレス、APIキー、フィードIDだけを変更し(センサーの値はとりあえず無視して)、200が表示されることまでを確認してみてください。

ちなみにEthernetシールドは何をお使いでしょうか。もし純正などSDカード搭載のものをお使いでSDカードが挿入されているようであれば抜いてみてください。サンプルのスケッチはSDカードのCSを制御していないのでカードが入ってると誤動作を起こします。
>>[12]

いつも返信ありがとうございます。
とても勉強になります。

>具体的に、xivelyclient.put returned の後にはどんな数字が出ているのでしょうか?
200が表示されました。

>サーバーへの接続まで出来ているならば、3ケタの数字が表示されるはずです。もしAPIキーが間違っていれば-401、フィードIDが間違っていたら-404が表示されます。
そうなんですね。基本的な事もわかっておりませんでした。

>ちなみにEthernetシールドは何をお使いでしょうか。
Ethernetシールドは純正なものでSDカード搭載ですが、SDカードは挿入しておりません。
>>[13]
200という事であれば、この画面の場合であれば29.27という値がサーバーにアップロードされているはずですね。
参考までに、当初負の値だったのが200になった時の変化点は何だったのでしょうか…。
>>[14]
負の値の時から変えたのは、計算式の値を変更しました。

float offset = 0.424 から
float offset = 0.11 に変更しました。
>>[15]
ひょっとして、[2]とか[5]での「負の値」って、
LM60 = 55 Volt = 0.2686 TEMP = -24.87 ←これのことだったのでしょうか!?

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

arduino 更新情報

arduinoのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング