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

0
671

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

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

20140301_193716

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

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

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

 

20140301_193811

 

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 센서를 아래 그림과 같이 연결 합니다.

20140301_200649

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

 

[code language=”cpp”]
// 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;

}

[/code]

Step 6: 데모 동영상

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

NO COMMENTS