[Arduino] Temperature Monitoring System using Xively Server & WizFi250

Posted by 카이젠8501 카이젠8501
2014.03.19 14:06 Development(English)

Step 1: H/W

-          Temperature Sensor : TMP36

-          TMP36 Datasheet : http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Temp/TMP35_36_37.pdf

-          Feature

n  Low voltage operation(2.7V to 5.5V)

n  Calibrated directly in

n  10mv/ scale factor

n  ±0.5 linearity

  • Pin Description



Picture of Hardware



 

Step 2: Create Xively ID and Add Device

For using xively cloud server, you have to create xively ID and add device as below.



 

Step 3: Create Xively Channel and Check your FeedID & APIKey

After Step2, If you click device, You can add Channel ID which is monitoring value from temperature sensor.

I want to check temperature data. So I added ChannelID to “TempC”.

And then you have to memory your FeedID, API Key, and ChannelID because packet which WizFi250&Arduino send needs this information.



Step 4: WizFi250 Arduino Library Download

You can download WizFi250 Arduino Library in GitHub. If you did download complete, you can see Xively Client Example.

You have to use this example.

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

 

Step 5: Source Code and Demonstration

This picture is my demonstration board. Component of demonstration board are Arduino Uno, WizFi250-EVB and TMP36.

And TMP36 is connected to 5V, GND, A0 port in WizFi250-EVB



 

This is source code about Xively Client Example. In this code, you have to change APIKEY, FEEDID to your information.


#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 "Wiznet_Kaizen"

#define KEY "123456789"

#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() == RET_OK)

{

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: Video



 

저작자 표시
신고
이 댓글을 비밀 댓글로
    • 김정민
    • 2014.09.29 12:35 신고
    #define REMOTE_PORT 80
    #define LOCAL_PORT 5004

    이 부분은 뭔가요? 어디서 읽어와야 하나요?
    • #define REMOTE_PORT 80 은 Xively Server에 Data를 송신하기 위해 사용하는 Port 번호 입니다.
      Xively Server에 데이터를 송신할 때는 HTTP Porotocol을 사용하기 때문에 Port 번호를 80으로 지정 하였습니다.
    • 김정민
    • 2014.09.30 19:47 신고
    정말 고맙습니다!
    편안한 저녁시간 보내세요!
    • help!
    • 2014.10.01 10:49 신고
    WizFi250 모델(EVB 버전 아니고요)에 아두이노 우노를 가지고 있습니다.
    인터넷에 돌아다니는 여러가지 코드로 아두이노를 통해 작동 테스트를 해보고 싶은데 번번히 실패입니다. 간단한 인터넷 통신 (트위터, 지메일 송신)을 하는 것을 목표로 하고 있습니다. 아래는 WizFi250WebServer 파일로 아두이노에 업로드 했을 때 나오는 메세지 앞부분입니다. 어디서부터 어떻게 접근해야할지 막막합니다, 작은 정보라도 알려주시면 고맙겠습니다!

    WizFi250WebServer.ino:16:11: error: no matching function for call to 'WizFi250::WizFi250()'
    WizFi250WebServer.ino:16:11: note: candidates are:
    In file included from WizFi250WebServer.ino:4:0:
    C:\Users\jm\Documents\Arduino\libraries\Wizfi250/WizFi250.h:17:5: note: WizFi250::WizFi250(Stream&)
    WizFi250(Stream &);
    • 현재 사용하고 계신 WizFi250이 모듈형태로 되어 있나요? 모듈 형태로만 되어 있다면 Arduino Uno하고는 점퍼로 연결 하신 건가요?
      점퍼로 연결 하셨다면 SPI Interface로 연결하신 건지 UART Interface로 연결 하신건지 알려 주시기 바랍니다.
    • 몽브리
    • 2015.11.26 18:58 신고
    안녕하세요! 검색하다가 보게되었는데요!
    혹시 비슷하게 이더넷 실드로는 할수 없을까요?ㅠㅠ
    • 안녕하세요 제가 답변이 늦었네요. 당연히 이더넷 쉴드를 사용하실 수 있습니다.
      이더넷 쉴드를 사용하시는 경우, https://www.arduino.cc/en/Tutorial/PachubeCient
      예제를 참고하셔서 구현 하시면 됩니다.
    • 추가로 이제는 Xively에 가입이 안 되실 수 있습니다. 이런 경우, Ubidots라는 클라우드 서비스를 이용하셔도 Xively와 비슷한 환경을 구축 하실 수 있습니다.

      Ubidots에 대한 자세한 사용법은 아래 링크를 참고 하시기 바랍니다.

      Ubidots.com document: http://ubidots.com/docs/devices/arduino-ethernet.html

      블로그 내용
      https://wizdaniel.wordpress.com/2015/06/04/wizfi250_ubidots_1/
      https://wizdaniel.wordpress.com/2015/06/04/wizfi250_ubidots_2/
      https://wizdaniel.wordpress.com/2015/06/04/wizfi250_ubidots_3/