[Arduino Uno WiFi Shield]WizFi250과 Xively를 이용하여 온도 센서 모니터링 하기 (2/2)

2014. 2. 18. 22:272018년 이전 관심사/개발관련

반응형



Step 2: Xively 계정 생성 및 Device 추가


먼저 클라우드 서버를 이용하기 위해 Xively 사이트에 가입을 합니다. 가입 후, 모니터링 하기 위한 디바이스를 추가 합니다.




Step 3: Xively Channel 생성 및 Feed ID & API Key 확인


추가한 디바이스를 클릭하면 모니터링 할 값인 ChannelID를 등록 할 수 있습니다. 저는 온도 값을 모니터링 해야 하므로 ChannelID를 TempC로 설정하였습니다. 


디바이스에서는 Xively에게 송신하는 패킷에 FeedID와  API Key, Channel ID, Channel 값이 포함되어 있어야 하므로 미리 기억 해 두는 것이 좋다.



Step 4: WizFi250 Arduino Library Download


WizFi250 Arduino Library를 GitHub에서 다운로드 받은 후, Xively Client Example를 실행 한다.

https://github.com/Wiznet/Arduino_WizFi250.git


Step 5: WizFi250 연결 및 Source 구현


WizFi250와 Arduino Uno를 연결 하고, Step 1에서 테스트 한 것과 같이 TMP36 센서를 아래 그림과 같이 연결 합니다.


Step 3에서 미리 파악한 FeedID와 API Key값을 그리고 ChannelID와 측정된 온도 값을 이용하여 Xively에 보낼 패킷을 만듭니다.

 

// Do not remove the include below

#include "WizFi250XivelyClient.h"


#include <Arduino.h>

#include <SPI.h>

#include <IPAddress.h>

#include "WizFi250.h"

#include "WizFi250_tcp_client.h"



#define APIKEY "EUHFMSwZj8pDdE6jKZgooDt3vlDivDy6srpKgbfE0rgdnZ3D"

#define FEEDID "827175846"

#define USERAGENT ""


#define SSID "DIR-636L"

#define KEY "12345678"

#define AUTH ""


#define  REMOTE_PORT    80

#define  LOCAL_PORT     5004


IPAddress ip (192,168,15,1);

IPAddress destIP (64,94,18,120);

IPAddress gateway (192,168,15,1);

IPAddress mask (255,255,255,0);


char server[] = "api.xively.com";

unsigned long lastConnectionTime = 0;

const unsigned long postingInterval = 10*1000;

boolean Wifi_setup = false;

boolean lastConnected = false;

boolean isFirst = true;


WizFi250 wizfi250;

WizFi250_TCP_Client myClient(server, REMOTE_PORT);



void sendData(String thisData);

float getTempC();

char * floatToString(char * outstr, double val, byte precision, byte widthp);


//The setup function is called once at startup of the sketch

void setup()

{

// Add your initialization code here

Serial.begin(9600);

Serial.println("\r\nSerial Init");


wizfi250.begin();

wizfi250.setDebugPrint(4);

wizfi250.hw_reset();


wizfi250.sync();

wizfi250.setDhcp();


if( wizfi250.join(SSID,KEY,AUTH) == 0 )

Wifi_setup = true;

}


// The loop function is called in an endless loop

void loop()

{

char TempC[20]="";

floatToString(TempC, getTempC(), 2, 7 );


String dataString = "TempC,";

dataString += TempC;


if( Wifi_setup )

{

wizfi250.RcvPacket();


if( myClient.available() )

{

char c = myClient.recv();

if( c != NULL)

Serial.print(c);

}

else

{

if( !myClient.getIsConnected() && lastConnected )

{

Serial.println();

Serial.println("disconnecting.");

myClient.stop();

}


if(!myClient.getIsConnected() && (millis() - lastConnectionTime > postingInterval))

{

sendData(dataString);

}


lastConnected = myClient.getIsConnected();

}

}

}


void sendData(String thisData)

{

uint8_t content_len[6]={0};

String TxData;


if(myClient.connect())

{

Serial.println("connecting..");

// send the HTTP PUT request:

TxData =  "PUT /v2/feeds/";

TxData += FEEDID;

TxData += ".csv HTTP/1.1\r\n";

TxData += "Host: api.xively.com\r\n";

TxData += "X-ApiKey: ";

TxData += APIKEY;

TxData += "\r\n";

TxData += "Content-Length:";

itoa(thisData.length(), (char*)content_len, 10);

TxData += (char*)content_len;

TxData += "\r\n";

TxData += "Content-Type: text/csv\r\n";

TxData += "Connection: close\r\n";

TxData += "\r\n";

TxData += thisData;

TxData += "\r\n\r\n";


myClient.send((String)TxData);

}


lastConnectionTime = millis();

}


float getTempC()

{

int sensor_val = analogRead(A0);


float voltage = sensor_val * 5.0;

voltage /= 1024.0;


float tempC = (voltage - 0.5) * 100;


return tempC;

}


char * floatToString(char * outstr, double val, byte precision, byte widthp){

  char temp[16];

  byte i;


  // compute the rounding factor and fractional multiplier

  double roundingFactor = 0.5;

  unsigned long mult = 1;

  for (i = 0; i < precision; i++)

  {

    roundingFactor /= 10.0;

    mult *= 10;

  }


  temp[0]='\0';

  outstr[0]='\0';


  if(val < 0.0){

    strcpy(outstr,"-\0");

    val = -val;

  }


  val += roundingFactor;


  strcat(outstr, itoa(int(val),temp,10));  //prints the int part

  if( precision > 0) {

    strcat(outstr, ".\0"); // print the decimal point

    unsigned long frac;

    unsigned long mult = 1;

    byte padding = precision -1;

    while(precision--)

      mult *=10;


    if(val >= 0)

      frac = (val - int(val)) * mult;

    else

      frac = (int(val)- val ) * mult;

    unsigned long frac1 = frac;


    while(frac1 /= 10)

      padding--;


    while(padding--)

      strcat(outstr,"0\0");


    strcat(outstr,itoa(frac,temp,10));

  }


  // generate space padding

  if ((widthp != 0)&&(widthp >= strlen(outstr))){

    byte J=0;

    J = widthp - strlen(outstr);


    for (i=0; i< J; i++) {

      temp[i] = ' ';

    }


    temp[i++] = '\0';

    strcat(temp,outstr);

    strcpy(outstr,temp);

  }


  return outstr;

}




Step 6: 데모 동영상

아래 동영상은 위 코드를 동작 시킨 데모입니다. 화면 왼쪽을 보시면 Xively Server에서 주기적으로 온도 값이 변경되는 것을 확인 할 수 있으며, 화면 오른쪽은 WizFi250을 연결한 Arduino Board의 Log Data 입니다.





반응형