2014. 2. 18. 22:27ㆍ2018년 이전 관심사/개발관련
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 입니다.
'2018년 이전 관심사 > 개발관련' 카테고리의 다른 글
[Arduino]WiFi Shield & Motor Driver 제어 (4) | 2014.03.17 |
---|---|
[Python] Print 변수 출력하기 (0) | 2014.02.19 |
[Arduino Uno] WizFi250과 Xively를 이용하여 온도 센서 모니터링 하기 (1/2) (0) | 2014.02.18 |
[C언어]문자열에서 특정 문자열 추출 하기 (0) | 2014.01.01 |
[Python] serial module 사용 실패 시, 해결 방법 (0) | 2013.12.20 |