2016년 11월 23일 수요일

ThingSpeak 기반 IoT 데이터 분석

오늘은 ThingSpeak (씽 스피크) 기반 데이터 분석 방법에 대한 글을 이야기해 보겠습니다.

IoT 장치에서 데이터를 취득한 후에는 데이터 통계 및 분석 방법을 이용해, 패턴을 추출하고, 변화량이나 추세를 예측하는 등의 작업이 매우 중요해 집니다. 예를 들어, 에너지 전력 소비량을 시간에 따라 그래프에 표시하면, 불필요하게 에너지를 소비하는 시점이 언제인지, 그때 어떤 장치가 에너지를 소비하는 지 등을 알 수 있습니다.

이 글은 IoT 장치에서 센싱된 데이터를 취득하여 데이터를 분석하는 간단한 방법을 보여줍니다. 이 글에서는 데이터 취득 및 제어는 아두이노와 Blynk를 사용하며, 데이터 분석은 ThingSpeak를 사용할 것입니다.

이 글은 다음 레퍼런스를 참고 하였습니다.
ThingSpeak 기반 데이터 분석


ThingSpeak 데이터 분석 영상

1. ThingSpeak 동작 방식
ThingSpeak는 클라우드 기반으로 동작되는 데이터 분석 솔류션으로 오픈소스 기반으로 동작합니다. RESTful API를 사용하기 때문에, 데이터를 ThingSpeak로 전송하는 것은 매우 쉽습니다. Matlab 스크립트를 웹상에서 지원하므로, 과학 실험 데이터 분석도 가능합니다. 게다가, 메시지 교환 세계 표준인 MQTT (Message Queueing Telemetry Transport) 도 지원합니다.

ThingSpeak에서 데이터 분석을 위해서는 보통 다음과 같은 준비 단계를 거쳐야 합니다.

1. ThingSpeak 가입
2. ThingSpeak 데이터 분석 채널 생성
3. 채널에 분석이 필요한 데이터 필드 생성
4. 채널 설정 저장

이렇게 채널이 만들어지면, 채널 내에 정의된 필드 별로, 데이터를 RESTful API를 이용해, ThingSpeak에 저장하면 됩니다.

2. 센싱 데이터 전송
센싱 데이터는 다음 코드와 같이 ThingSpeak 에서 제공하는 API, 미리 생성된 API 키를 이용해, 각 데이터 필드에 데이터를 전송하는 과정을 거칩니다.

#include "Bridge.h"
#include "HttpClient.h"

//Thingspeak parameters
String thingspeak_update_API    = "http://api.thingspeak.com/update?";
String thingspeak_write_API_key = "key=XXXXXXXXXXXXXX";//Insert Your Write API key here
String thingspeakfieldname      = "&field1=";

void setup() {
  Bridge.begin();       // Initialize Bridge
  Serial.begin(9600);  // Initialize Serial
  
  while (!Serial);        // Wait until a Serial Monitor is connected.
  int data=240;        // Data to be sent to thingspeak, change this variable value and post accordingly
  
  postToThinspeak(data);  // run various example processes
  Serial.flush();         // Ensure the last bit of data is sent.
}

void loop() {
  // Do nothing here.
}

void postToThinspeak(int data) {
  HttpClient client;

    String request_string =  thingspeak_update_API + thingspeak_write_API_key + thingspeakfieldname + data;
    // Make a HTTP request:
    client.get(request_string);

  // if there are incoming bytes available
  // from the server, read them and print them:
  while (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  delay(15000);
}

이제, 이 코드를 WiFi 쉴드가 장착된 아두이노에 입력하고, 실행을 하면, ThingSpeak의 해당 채널에서 수집되는 데이터를 실시간 그래프로 시각화될 것입니다. 물론, 이 데이터는 통계 데이터, 회귀분석, 연관분석, 패턴분석, 클러스터링 등 다양한 데이터 분석 자료로 활용할 수 있고, Matlab과 같은 스크립트를 약간만 수정함으로써 손쉽게 결과값을 얻을 수 있습니다.


3. 결론
이 글에서는 ThingSpeak를 간단히 알아 보았습니다. 이런 데이터 분석 사이트는 많은 기능이 무료로 제공되고, RESTful API를 지원하고 있어, 사용이 매우 쉽습니다. 게다가, 과학 데이터 분석에서 사용하는 Matlab과 같은 스크립트도 지원하고 있어 그 활용도가 매우 높습니다. 다음과 같이 본인이 만든 채널을 공유하고 피드백도 받을 수 있습니다.


IoT 시대에 꼭 필요한 데이터 분석도구입니다.



2016년 11월 10일 목요일

NodeMCU(ESP8266) / Blynk 기반 IoT 기기 개발 사례 소개

이 글은 Blynk와 ESP8266 NodeMCU를 이용해, IoT 기기를 개발하는 손쉬운 방법을 설명한다. ESP8266 NodeMCU는 ESP 여러 버전 중 하나이며, IO 핀이 포함되어 있어, IoT기기를 개발하기 매우 편리하다. AliExpress에서 3~4달러에 구입할 수 있다.

Blynk에 대해서는 앞의 글을 읽어 보길 바란다.

ESP8266 NodeMCU 핀은 다음과 같다.

이 글은 다음 링크를 참고하였다.
이 예제에서는 다음과 같은 재료가 필요하다. 
1. Node MCU ESP8266 12E
2. 스마트폰
3. LED, 330 옴 저항
4. 브래드보드
5. 아두이노 IDE

1. 아두이노 Blynk 및 Blynk ESP8266 라이브러리 설정
라이브러리 설치는 이전 글을 참고하여 설정한다. 참고로, ESP 라이브러리리 설치 주소는 http://arduino.esp8266.com/stable/package_esp8266com_index.json 이다. 


정상적으로 설치되면, 다음과 같은 메뉴를 볼 수 있다. 

2. Blynk 앱 프로젝트 개발
다음과 같이 앱을 실행해, 프로젝트를 개발한다. 보드는 NodeMCU로 선택한다.



3. 회로 연결
다음과 같이 회로를 연결한다. 

4. ESP 코드 업로드
아두이노 IDE의 파일 > 예제 > Blynk-Boards_WiFi > Esp8266Standalone 예제를 선택한다. 


보드는 NodeMCU 1.0을 선택한다. 포트 선택을 한다. 만약, 연결된 포트가 안보이면, NodeMCU 통신 포트 드라이버가 제대로 설치되지 않은 것이다. 아래 링크에서 드라이버 설치 프로그램 다운받아 설치한다.

소스코드에서 통신 속도는 115200으로 수정하고, 네트워크 ID와 PASSWORD를 코드에 입력한다. 아울러, Blynk 프로젝트의 토큰을 입력한다.

그리고 소스를 업로드한다.

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "...";    // Blynk 토큰 입력

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "...";    // wifi SSID 입력
char pass[] = "";     // wifi SSID 암호 입력

void setup()
{
  Serial.begin(115200);     // 통신속도 115200 수정
  Blynk.begin(auth, ssid, pass);
}

void loop()
{
  Blynk.run();
}


5. 원격 LED 제어
앱을 다음과 같이 실행해 원격으로 LED를 제어해 본다.


10k옴과 조도센서를 이용해 아날로그 값을 측정해 보자. 다음과 같이 조도센서의 신호출력핀은 NodeMCU의 A0와 연결한다.

그래프 위젯을 하나 삽입하고, 센서 데이터는 A0로 부터 받도록 설정하면, 다음과 같이, 정상적으로 조도 센서값을 받고 있는 것을 확인할 수 있다. 


이로써, 스마트폰이 네트워크와 연결된 곳이라면, NodeMCU를 이용해, 원격으로 센서 신호를 받고, 스위치나 모터와 같은 액추에이터를 끄고 컬 수 있음을 알 수 있다. 

이외에 제공되는 위젯들을 잘 활용하면, 매우 다양한 제어를 원격으로 할 수 있음을 알 수 있다. 상세한 Blynk 사용 방법은 다음 링크와 아두이노 통합개발환경의 예제 메뉴에서 Blynk 예제 파일들을 참고하길 바란다.
hackster.io/blynk 예제


2016년 11월 8일 화요일

ESP8266 기반 Blynk활용 IoT 기기 개발

이 글은 ESP8266 기반 IoT 기기 개발에 대한 내용이다. 이 기기는 2~3달러로 매우 싸지만, WiFi와 GPIO포트를 지원하여, IoT기기 개발에 매우 좋은 소형 컴퓨터이다.

이 글은 ESP8266을 기반으로 Blynk를 사용해 IoT기기를 개발하는 방법을 설명한다. ESP8266은 여러가지 버전이 있다. 다음은 ESP8266-01버전이다.


이 글은 다음 레퍼런스를 참고하였다.
이 중에 아두이노 우노나 메가를 이용한 ESP 예제를 간단히 따라해 본다. 이 경우, 기존 아두이노의 작업들을 재활용할 수 있는 장점이 있다. 저렴한 ESP 로 WiFi기반 IoT 기기를 개발할 수 있다.

이 튜토리얼을 따라가기 위해서는 다음과 같은 부품이 필요하다.
  1. Arduino Uno
  2. 점퍼 와이어
  3. ESP8266-01
  4. 가변저항 및 버튼 스위치
소프트웨어 라이브러리 다운로드는 다음과 같다.

1. 아두이노 IDE 통합개발환경을 설치한다.
2. Blynk 아두이노 라이브러리를 다운로드 한다.
3. Blynk 라이브러리를 다운로드 한다.
4. Blynk-ESP8266 아두이노 라이브러리를 다운로드한다.
5. pySerial 을 다운로드 한다.
6. esptool 을 다운로드 한다.
7. SDK1.0.0 v0.22 ESP2866 펌웨어를 다운로드한다.
8. ESP8266_flasher 실행 프로그램을 다운로드한다.
9. Blynk 앱을 휴대폰에 설치한다.

1. ESP 펌웨어 설치
ESP와 아두이노를 연결한다. 

ESP8266 - Arduino
GND      - GND
GP2       - 연결안함
GP0       - GND
RXD       - RX
TXD       - TX
CHPD     - 3.3V
RST        - 연결안함
VCC       - 3.3V


이제 esp8266_flasher.exe 를 실행하고, AT22SDK100-2015-03-20-boost12.bin 을 선택한다.



COM 포트를 적절히 선택하고, download 버튼을 클릭한다. 제대로 펌웨어 업그레이드가되면, failed to leave flash mode this is OK 메시지를 볼 수 있다. 



업데이트 중에는 다음과 같이 ESP8266 모듈의 파란색 LED가 깜빡거리는 것을 볼 수 있다.


* 참고: CP2102 USB-TLL 모듈 통해 펌웨어를 업데이트하는 방법이 있다.  CP2102는 2000원 정도로 가격이 매우 저렴하다. 

CP2102 USB-TLL MODULE

ESP와 CP2102 USB-TLL간 회로 연결은 다음과 같이 한다.

ESP8266 - CP2102
GND      - GND
GP2       - 연결안함
GP0       - GND
RXD       - TX
TXD       - RX
CHPD     - 3.3V
RST        - 연결안함
VCC       - 3.3V

그리고, ESP8266 Flash Downloader 프로그램을 이용해, 앞서 설명했던 것과 똑같이 펌웨어 업데이트를 하면 된다.

ESP는 AP, STA, AP+STA모드를 지원한다. 이는 ESP8266 config 프로그램을 통해 다음과 같이 손쉽게 설정할 수 있다.


* 참고: 리눅스 환경에서는 파이썬을 이용해 펌웨어를 업그레이드 할 수 있다. PySerial-2.7 폴더에 들어간 후, python setup.py install 를 설치한 후, 파이썬 esptool.py 를 이용해, 펌웨어 업그레이드가 가능하다.

2. 아두이노 Blynk와 Blynk-ESP8266 라이브러리 설치
아두이노 Blynk와 Blynk-ESP8266 라이브러리를 설치한다. 이를 위해 아두이노 IDE 를 실행하고, 스케치의 Include library 메뉴에서 다운로드한 파일 중 다음의 zip 파일을 추가/설치한다.

blynk-library-master
ITEADLIB_Arduino_WeeESP8266-master

메뉴에서 스케치의 Include Library 메뉴에서 manage library 메뉴를 통해 ESP8266 library를 업데이트한다.

3. 아두이노 코드 업로드
다음과 같이 연결한다.

ESP8266 - Arduino Mega
GND      - GND
GP2       - 연결안함
GP0       - 연결안함
RXD       - TX
TXD       - RX
CHPD     - 3.3V
RST        - 연결안함
VCC       - 3.3V

아두이노 우노의 경우는 다음과 같이 연결한다 (혹시, 잘 동작 안되면, Arduino Mega와 같이 우노의 RX, TX핀으로 직접 연결한다. 이 예제의 경우, 직접 RX, TX를 연결하였다. 참고로 SW 시리얼은 아직 불완전하다는 말이 있다).

ESP8266 - Arduino UNO
GND      - GND
GP2       - 연결안함
GP0       - 연결안함
RXD       - D3
TXD       - D2
CHPD     - 3.3V
RST        - 연결안함
VCC       - 3.3V

이 예에서는 아두이노 D7 핀에 LED를 연결해 제어할 것이다.

1. 아두이노 메가의 경우, IDE의 파일 > 예제 > Blynk > BoardsAndShields > ESP8266_Shield_HardSer 예제를 선택한다. 아두이노 우노는 ESP8266_Shield_SoftSer 예제를 선택한다. 만약, ESP8266 통신 속도를 9600 bps로 설정하려면, AT모드에서, AT+UART_DEF=9600,8,1,0,0 명령을 수행해야 한다. 이 예제의 경우, 115200 bps를 사용하였다.

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "...";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "...";
char pass[] = "";

// Hardware Serial on Mega, Leonardo, Micro...
#define EspSerial Serial

// Your ESP8266 baud rate:
#define ESP8266_BAUD 115200

ESP8266 wifi(&EspSerial);

void setup()
{
  // Set console baud rate
  Serial.begin(115200);
  delay(10);
  // Set ESP8266 baud rate
  EspSerial.begin(ESP8266_BAUD);
  delay(10);

  Blynk.begin(auth, wifi, ssid, pass);
}

void loop()
{
  Blynk.run();
}


2. 스마트폰의 Blynk 앱을 실행하고, 프로젝트를 하나 만든 후, 생성된 인증 토큰을 ESP8266 예제의 해당 부분에 붙여 넣는다. 그리고, WiFi네트워크의 SSID, PASSWORD를 소스코드의 해당 부분에 붙여 넣는다.

3. 아두이노 IDE 모니터링 프로그램을 실행하면, 다음과 같이 아두이노가 Blynk 서버와 접속되는 정보를 볼 수 있다.


4. Blynk 제어
다음과 같이 아두이노 버튼과 가변저항을 수정하면, Blynk 위젯 정보가 원격으로 변화되는 것을 알 수있다. 


아울러, LED를 아두이노 13번 핀에 연결하고, Blynk에서 버튼 위젯을 D13에 연결하여, 버튼을 클릭하면, 다음과 같이 정상적으로 동작하는 것을 확인할 수 있다.




이런 식으로 센서와 연결된 장치를 인터넷 기반으로 제어할 수 있다. 그러므로, 시간과 노력이 있다면, 누구나 IoT 기기를 저렴하고 손쉽게 개발할 수 있다.

오픈소스 기반 IoT 기기 연결 플랫폼 Blynk 와 Temboo

이 글은 오픈소스 기반 IoT 기기 연결 플랫폼에 대한 글이다.

1. Blynk 
Blynk는 IoT 기기를 개발하는 메이커에게 도움을 주는 플랫폼이다. Blynk는 하드웨어 간 연결을 지원하고, 가상 사용자 인터페이스를 지원한다. Blynk는 상당히 빠르게 성장하는 오픈소스 기반 IoT 플랫폼이다. 이를 이용하면, 다음과 같은 IoT 센서 앱을 손쉽게 개발할 수 있다.


Blynk는 다음과 같이 인터넷 접근 가능한 다양한 하드웨어와 앱을 서로 연결해 준다. 별도의 PC가 필요없다.


Blynk 서버는 스마트폰과 하드웨어 간 통신을 담당하며, 클라우드 플랫폼으로 동작된다. 하드웨어와 서버 연결을 위해 Blynk Libraries를 제공한다.

복잡한 코딩을 할 필요가 없다. Blynk 앱에서 IoT로 만들고 싶은 인터넷에 연결된 보드 종류를 선택하고, 보드 입출력핀에 연결된 센서나 액추에이터를 선택하면 된다.

불필요한 코딩이 없음. 인터넷에 연결된 보드 종류와 입출력 핀 동작을 지정해 주면 된다

Blynk는 앱 빌더와 퍼블리쉬를 지원하며, 클라우드 기반에서 동작하며, 다양한 임베디드 하드웨어들을 지원한다.


다음 영상은 아두이노에 연결된 센서나 액추에이터를 Blynk를 이용해 얼마나 쉽게 IoT 기반 장치를 만들 수 있는 지를 잘 보여준다. 



Blynk는 매우 쉽고, 게다가, 오픈소스로 많은 위젯이 무료이다. 게다가, Blynk소스 서버가 공유되어 있어, 라즈베리파이 같은 저렴한 PC에 설치해, 자신만의 Blynk서버를 만들 수도 있다.  



아두이노와 센서가 준비되어 있다면, Blynk를 설치하고, IoT 기기를 만드는 데 5분이 걸리지 않는다.  Blynk의 Getting started 사이트는 Blynk 설치 앱과 아두이노를 위한 라이브러리를 제공한다.



Blynk는 매우 다양한 하드웨어를 지원하며, 이 중에는 가격이 불과 5달러 정도 밖에 하지 않은 ESP8266 등도 포함하고 있다. 물론, 유튜브 등에는 이와 관련된 수많은 튜토리얼 영상이 공유되고 있다.

2. TEMBOO
TEMBOO 플랫폼을 이용해 IoT 기기를 손쉽게 개발할 수 있다. Github에 소스가 올라온 지는 벌써 4년이 되어 가는 IoT 플랫폼이다. TEMBOO는 아두이노 기반으로 동작한다. 아두이노 WiFi 쉴드나 아두이노 윤을 이용해 개발할 수 있다. 다만, 아두이노 윤(Arduino Yun)을 이용하면, TEMBOO 플랫폼을 이용해 IoT 기기를 손쉽게 개발할 수 있으나, 아두이노 윤 가격이 9만원으로 매우 비싼것이 단점이다.

100개 이상의 SaaS 사이트에서 제공되는 데이터를 API기반으로 연결해, 아두이노 윤과 연결할 수 있다. 예를 들어, 트위터에서 어떤 메시지가 올라오면, 이 값을 받아서, 네트워크에 연결된 기기를 동작하거나 센싱하는 일을 손쉽게 할 수 있다.


다음은 TEMBOO를 소개하고, 간단한 앱 개발 방법을 보여준다.


단순히, 데이터를 입력받을 장치를 선택하고, 데이터를 변환하는 규칙을 적용한 후, 출력받을 장치를 선택하면 된다.


그럼, 다음과 같은 아두이노 코드를 자동으로 생성해준다.
/*
  GetYahooWeatherReport
  
  Demonstrates making a request to the Yahoo Weather API using the Temboo Arduino Yun library.
  
  This example code is in the public domain.
*/

#include <Bridge.h>
#include <Temboo.h>
#include "TembooAccount.h" // contains Temboo account information

// the address for which a weather forecast will be retrieved
String ADDRESS_FOR_FORECAST = "104 Franklin St., New York NY 10013";

int numRuns = 1;   // execution count, so that this doesn't run forever
int maxRuns = 10;  // max number of times the Yahoo WeatherByAddress Choreo should be run

void setup() {
  Serial.begin(9600);
    
  // for debugging, wait until a serial console is connected
  delay(4000);
  while(!Serial);
  Bridge.begin();
}

void loop()
{
  // while we haven't reached the max number of runs...
  if (numRuns <= maxRuns) {
      
    // print status
    Serial.println("Running GetWeatherByAddress - Run #" + String(numRuns++) + "...");

    // create a TembooChoreo object to send a Choreo request to Temboo
    TembooChoreo GetWeatherByAddressChoreo;
    
    // invoke the Temboo client
    GetWeatherByAddressChoreo.begin();

    // add your temboo account info
    GetWeatherByAddressChoreo.setAccountName(TEMBOO_ACCOUNT);
    GetWeatherByAddressChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME);
    GetWeatherByAddressChoreo.setAppKey(TEMBOO_APP_KEY);
    
    // set the name of the choreo we want to run
    GetWeatherByAddressChoreo.setChoreo("/Library/Yahoo/Weather/GetWeatherByAddress");
    
    // set choreo inputs; in this case, the address for which to retrieve weather data
    // the Temboo client provides standardized calls to 100+ cloud APIs
    GetWeatherByAddressChoreo.addInput("Address", ADDRESS_FOR_FORECAST);

    // add an output filter to extract the name of the city.
    GetWeatherByAddressChoreo.addOutputFilter("city", "/rss/channel/yweather:location/@city", "Response");
    
    // add an output filter to extract the current temperature
    GetWeatherByAddressChoreo.addOutputFilter("temperature", "/rss/channel/item/yweather:condition/@temp", "Response");

    // add an output filter to extract the date and time of the last report.
    GetWeatherByAddressChoreo.addOutputFilter("date", "/rss/channel/item/yweather:condition/@date", "Response");

    // run the choreo 
    GetWeatherByAddressChoreo.run();
        
    // when the choreo results are available, print them to the serial monitor
    while(GetWeatherByAddressChoreo.available()) {
          
      char c = GetWeatherByAddressChoreo.read();    
      Serial.print(c);
    }
    GetWeatherByAddressChoreo.close();

  }

  Serial.println("Waiting...");
  Serial.println("");
  delay(30000); // wait 30 seconds between GetWeatherByAddress calls
}

TEMBOO 홈페이지에는 TEMBOO를 이용한 다양한 오픈소스 IoT 프로젝트를 다음과 같이 확인할 수 있다.

앞으로는 누구나 자신에게 필요한 IoT 기기를 쉽게 만들고, 제어할 수 있도록, 불필요한 코딩은 점점 줄여나가는 방식으로 발전될 것 같다.