2014年4月24日木曜日

arduinoからxively(旧Pachube)にデータ送信



arduino等で取得したデータを送信すると、グラフにしてくれるwebサービスとして使える
Pachubeを紹介する記事があったので検索してみると、リニューアルしていました。
xively
https://xively.com/




サービスの概要、アカウントの取得、スケッチの書き方までこちらを参考にしました。
http://garretlab.web.fc2.com/arduino/lab/xively/index.html
http://www.kumikomi.net/archives/2013/08/ca063gcc.php?page=1

HttpClientライブラリ
https://github.com/amcewen/HttpClient
arduino用xivelyライブラリ
https://github.com/xively/xively_arduino
をインストール。



アカウントを取り、feedやAPI-Keyを取得、xivelyライブラリのサンプルスケッチ(MultipleDatastreamsUpload)を少し書き換えるだけで、温度、照度をアップロードできるようになりました。
以下のスケッチは2つのデータをxivelyに送信するスケッチです。


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

// MAC address for your Ethernet shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //各自のシールドのmacアドレスに変更

// Your Xively key to let you upload data
char xivelyKey[] = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";   //APIキー

// Define the strings for our datastream IDs
char sensorId_temp[] = "temperature";
char sensorId_lux[] = "illuminance";
XivelyDatastream datastreams[] = {
  XivelyDatastream(sensorId_temp, strlen(sensorId_temp), DATASTREAM_FLOAT),
  XivelyDatastream(sensorId_lux, strlen(sensorId_lux), DATASTREAM_FLOAT),
};
// Finally, wrap the datastreams into a feed
XivelyFeed feed(XXXXXXXXXX, datastreams, 2 /* number of datastreams */);     //XXXXXXXXXX : feed ID

EthernetClient client;
XivelyClient xivelyclient(client);

const int pin_temp = A0;    //Analog input LM60
const int pin_lux = A5;     //Analog input NJL7502L

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の電圧はいいかげん
int sensorValue_lux = 0;    //value read from pin_lux
float lux = 0.0;
long r_lux = 10000;         //NJL7502Lに接続している抵抗値
                            //10KΩ ~1,000lux
                            //1KΩ ~10,000lux

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(15000);
  }
}

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

  get_lux();
  datastreams[1].setFloat(lux);
  Serial.println(datastreams[1].getFloat());

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

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

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);
}

void get_lux(){
  sensorValue_lux = analogRead(pin_lux);
  float v_lux = sensorValue_lux * vref / 1024;
  lux = 2 * ( v_lux / r_lux ) * 1000000;        //データシートより lx = 2 x 光電流[μA]
  Serial.print("7502L = " );
  Serial.print(sensorValue_lux);
  Serial.print("\t Volt = " );
  Serial.print(v_lux,4);
  Serial.print("\t lux = ");
  Serial.println(lux);
}



上記スケッチを書き込み、南向きの窓際に数日間置いてみたのが次のグラフです。
窓際なのに暗いのは、太陽の角度が上がりずっと屋根の影に入ってました。



日が当たると、NJL7502Lに接続した抵抗10KΩ(0~1,000lux)では、測定範囲を超えるので1KΩ(0~10,000lux)に変更、スケッチのr_luxを1000に変更して測定しました。
窓枠や手すりの影の影響で、常に日光があたっているわけではありません。
またNJL7502Lは指向性が高く+-20度で数値が半分になります。






環境:arduinoUNO、arduinoIDE1.0.5、win7(64) 

0 件のコメント:

コメントを投稿