IoT 사물인터넷 관련해서, 피지컬 혹은 인터넷 사이트 객체 간의 연결과 데이터 교환은 매우 중요하다. 이런 관점에서 IFTTT와 MQTT는 IoT에서 매우 중요한 위치를 차지하고 있는 플랫폼 중 하나이다.
IFTTT 개념 및 작동 방식 IFTTT (IF this than that) 는 인터넷 사이트 객체간 특정 트리거 조건이 발생했을 때, 다른 인터넷 객체에 메시지를 전달해 주는 브로커 역할을 한다. IFTTT에서는 이런 조건과 액션들을 조합해 애플릿(applet) 만드는 행위가 요리와 비슷해서 레시피라 한다. 다음 그림은 특정 트리거(사진 업로드)가 발생했을 때, 특정 액션(드롭박스에 사진을 저장)하는 레시피 예이다.
실제로, IFTTT에 가입한 후, 애플릿을 하나 만들면, 매우 직관적인 애플릿 메이커 화면이 뜨고, 각 this, that에 조건과 행위를 선택해 주기만 하면 작업이 끝난다 (예 - 구글 어시스턴스 트리거 조건 -> 특정 사이트에 메시지 전송. 아래 참고.).
이런 방식으로 IoT 객체에서 발생된 트리거를 특정 웹사이트에 전달해 줄 수 있고, 웹사이트에서 발생된 트리거를 IoT 객체에 전달해 줄 수도 있다. MQTT 개념 및 작동 방식 MQTT (Message Queueing Telemetry Transport) 는 IBM 에서 개발된 후, 2014년 국제 민간 표준기구인 오아시스에 의해서 표준으로 제정된 네트워크 상에서 메시지를 교환하는 표준 프로토콜이다. 작동 방식을 보면, 메시지를 중계하는 브로커가 메시지 출판자와 구독자를 중계하며, 메시지 교환을 처리한다.
이런 방식은 ROS(Robot Operating System)에서도 동일하게 사용되는 방식으로, 소프트웨어 공학에서 유명한 디자인 패턴 중 publication-subscription 구조를 사용한다.
IFTTT에 비해, MQTT는 표준화된 방식으로 메시지를 교환하는 양쪽을 연결해 주는 역할을 한다.
IoT 연결 브로커 플랫폼
이런 브로커 플랫폼을 이용하면, 다음과 같이 아마존 에코에서 특정 음성에 반응하는 사물 인터넷 기기, CCTV에서 특정 이미지 인식 조건이 일치할 때, SMS 문자를 전송하는 기기 등을 손쉽게 개발할 수 있다.
앞으로 이와 같은 IoT 플랫폼을 이용한 제품들이 더욱 다양해 질 것이라 예상한다.
참고 - IFTTT 작업 순서
IFTTT에서 구글 어시스턴스에서 음성을 입력받아, 특정 조건일 때의 텍스트를 특정 사이트에 전송하는 예를 간단히 만들어 본다.
3D 프린터는 AliExpress에서 찾아보시면 가성비 좋은 제품들이 쏟아져 나오는 데요, 20~40만원대 평가가 좋은 제품 구입하시면 큰 무리없이 사용 가능합니다.
Thingiverse는 프린팅할 수 있는 수많은 3D 모델을 무료로 다운로드 할 수 있는 사이트입니다. 게다가, 플라스틱 케이스, 기어 등을 디자인하는 앱도 무료로 제공해 줍니다 (최고!). 복잡한 디자인이 아니면, 굳이 123D, Tinker캐드 등을 이용해, 디자인할 필요가 없습니다. 다운로드 받고 프린팅하면 작업 끝납니다.
여기에서는 Customizable case app 을 이용해, 다음과 같이 케이스를 디자인하였습니다. 참고로, Thingiverse에는 캐드를 이용하지 않고 손쉽게 디자인할 수 있는 수많은 앱이 있습니다. Thingiverse App을 이용해 기어, 스틱, 스마트폰 거치대 같은 것은 쉽게 디자인할 수 있죠.
Create Thing버튼을 클릭하면, Thingiverse가 치수를 보고, 알아서 다음 처럼 디자인해 줍니다.ㅎ
ESP NodeMCU (4천원), 서보 모터 SG90 (3천원), 양면 테이프, 전선 와이어, 브래드보드, LED, 저항 10옴, 광센서, 9V 배터리 및 배터리 연결선 (2천원), mini USB 케이블 및 USB 어답터 (스마트폰 전원 어답터 재활용)
몇몇 부분을 재활용하면, 재료비는 대략 만원정도네요.ㅎ
4. 위젯 디자인
Blynk에서 다음과 같이 위젯을 스마트폰에 설치된 Blynk로 디자인해 줍니다(참고 - 이전 Blynk 관련 글).
각 위젯 역할을 다음과 같습니다. 참고로, Virtual Pin에 연결된 것은 V# 이렇게 표시했습니다.
스위치 버튼(V7): 서보 모터를 동작시킵니다. 아울러, 동작 표시를 위해 LED를 켜고 끔니다.
슬라이더: 첫번째 슬라이더(V8)는 서보 모터 시작 각도, 두번째(V9)는 끝 각도를 지정합니다.
LED(V1): 동작 상태를 표시합니다.
그래프(A0): 시간에 따른 조도값을 표시합니다.
5. 회로 연결
ESP NodeMCU보드와 부품간 회로는 다음과 같이 연결합니다.
LED = D2, GND
서보 모터 = D4, 3V, GND
조도 센서 + 저항 = A0, 3V, GND
6. 코딩
ESP NodeMCU, Blynk 코딩은 다음과 같이 합니다. 타이머는 차후 다른 데이터 센싱을 위해, 코딩한 것입니다. 필요 없으면 삭제해도 동작합니다.
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
#include <Servo.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "fd288f0e5e684408b6d91ba97c87b3b2";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "U+Net8080";
char pass[] = "5000005129";
// Widget
SimpleTimer timer;
WidgetLED led(V1);
// Servo
Servo servo;
int minAngle = 15;
int maxAngle = 105;
int ledPin = D2;
void setup()
{
delay(10);
pinMode(ledPin, OUTPUT);
// pinMode(2, INPUT_PULLUP);
servo.attach(D4);
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
servo.write(minAngle);
delay(30);
timer.setInterval(1000L, sensingData);
}
BLYNK_WRITE(V7) // Button Widget is writing to pin V2
{
int pinData = param.asInt();
if(pinData == HIGH)
{
digitalWrite(ledPin, HIGH);
led.on();
servo.write(maxAngle);
delay(30);
}
else if(pinData == LOW)
{
digitalWrite(ledPin, LOW);
led.off();
servo.write(minAngle);
delay(30);
}
}
BLYNK_WRITE(V8)
{
minAngle = param.asInt();
servo.write(minAngle);
delay(30);
}
BLYNK_WRITE(V9)
{
maxAngle = param.asInt();
servo.write(maxAngle);
delay(30);
}
void loop()
{
Blynk.run();
timer.run();
}
void sensingData()
{
int state = analogRead(A0);
// state = digitalRead(2);
}
7. 조립
3D프린팅한 케이스에 앞의 재료들을 잘 배치해 넣습니다. 전선은 떨어지지 않게 글루건을 사용해 잘 붙입니다. 양면테이프를 이용해, 케이스와 스위치가 있는 벽에 부착합니다. 그리고, 전원을 연결해 테스트 해 봅니다.
간단하게, 스마트 스위치를 만들어 보았습니다. 이 정도는 집에서도 3D프린터만 있으면 쉽게 작업할 수 있습니다. 3D프린터가 없어도, 케이스같은 것은 다이소같은 곳에서 적당한 것 사서, 짤라서 사용해도 되죠. 이때는 드라멜같은 다양한 툴셋을 지원하는 만능 전동공구가 있으면 편합니다.
8. 마무리
오늘은 간단히 IoT기반 스마트 스위치를 만들어 보았습니다. 잉여력 돋지 않나요? 다만, 크기가 해외 스타트업체에서 소개한 제품보단 큰게 안습입니다. 만약, 회로 디자인 도구와 디자인 캐드를 잘 사용하실 수 있으면, 작고 귀엽게 최적화된 스마트 스위치를 집에서 생산해 볼 수도 있을 겁니다.
집안 여기 저기에 IoT 스마트 스위치를 붙여 넣고 직장에 있을 때 한번 테스트해보세요. 본인이 만들어도, 직접 집의 가전기기들을 제어해 보면, 신기하고 재미있을 겁니다.^^
오늘은 ThingSpeak (씽 스피크) 기반 데이터 분석 방법에 대한 글을 이야기해 보겠습니다.
IoT 장치에서 데이터를 취득한 후에는 데이터 통계 및 분석 방법을 이용해, 패턴을 추출하고, 변화량이나 추세를 예측하는 등의 작업이 매우 중요해 집니다. 예를 들어, 에너지 전력 소비량을 시간에 따라 그래프에 표시하면, 불필요하게 에너지를 소비하는 시점이 언제인지, 그때 어떤 장치가 에너지를 소비하는 지 등을 알 수 있습니다.
이 글은 IoT 장치에서 센싱된 데이터를 취득하여 데이터를 분석하는 간단한 방법을 보여줍니다. 이 글에서는 데이터 취득 및 제어는 아두이노와 Blynk를 사용하며, 데이터 분석은 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과 같은 스크립트도 지원하고 있어 그 활용도가 매우 높습니다. 다음과 같이 본인이 만든 채널을 공유하고 피드백도 받을 수 있습니다.
이 글은 Blynk와 ESP8266 NodeMCU를 이용해, IoT 기기를 개발하는 손쉬운 방법을 설명한다. ESP8266 NodeMCU는 ESP 여러 버전 중 하나이며, IO 핀이 포함되어 있어, IoT기기를 개발하기 매우 편리하다. AliExpress에서 3~4달러에 구입할 수 있다.
Blynk에 대해서는 앞의 글을 읽어 보길 바란다. ESP8266 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 예제 파일들을 참고하길 바란다.
그리고, 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 파일을 추가/설치한다.
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 기기를 저렴하고 손쉽게 개발할 수 있다.
1. Blynk
Blynk는 IoT 기기를 개발하는 메이커에게 도움을 주는 플랫폼이다. Blynk는 하드웨어 간 연결을 지원하고, 가상 사용자 인터페이스를 지원한다. Blynk는 상당히 빠르게 성장하는 오픈소스 기반 IoT 플랫폼이다. 이를 이용하면, 다음과 같은 IoT 센서 앱을 손쉽게 개발할 수 있다.
Blynk는 다음과 같이 인터넷 접근 가능한 다양한 하드웨어와 앱을 서로 연결해 준다. 별도의 PC가 필요없다.
Blynk 서버는 스마트폰과 하드웨어 간 통신을 담당하며, 클라우드 플랫폼으로 동작된다. 하드웨어와 서버 연결을 위해 Blynk Libraries를 제공한다.
복잡한 코딩을 할 필요가 없다. Blynk 앱에서 IoT로 만들고 싶은 인터넷에 연결된 보드 종류를 선택하고, 보드 입출력핀에 연결된 센서나 액추에이터를 선택하면 된다.
불필요한 코딩이 없음. 인터넷에 연결된 보드 종류와 입출력 핀 동작을 지정해 주면 된다
Blynk는 앱 빌더와 퍼블리쉬를 지원하며, 클라우드 기반에서 동작하며, 다양한 임베디드 하드웨어들을 지원한다.
다음 영상은 아두이노에 연결된 센서나 액추에이터를 Blynk를 이용해 얼마나 쉽게 IoT 기반 장치를 만들 수 있는 지를 잘 보여준다.
Blynk는 매우 쉽고, 게다가, 오픈소스로 많은 위젯이 무료이다. 게다가, Blynk소스 서버가 공유되어 있어, 라즈베리파이 같은 저렴한 PC에 설치해, 자신만의 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 retrievedString ADDRESS_FOR_FORECAST ="104 Franklin St., New York NY 10013";int numRuns =1;// execution count, so that this doesn't run foreverint maxRuns =10;// max number of times the Yahoo WeatherByAddress Choreo should be runvoid 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 statusSerial.println("Running GetWeatherByAddress - Run #"+String(numRuns++)+"...");// create a TembooChoreo object to send a Choreo request to TembooTembooChoreoGetWeatherByAddressChoreo;// invoke the Temboo clientGetWeatherByAddressChoreo.begin();// add your temboo account infoGetWeatherByAddressChoreo.setAccountName(TEMBOO_ACCOUNT);GetWeatherByAddressChoreo.setAppKeyName(TEMBOO_APP_KEY_NAME);GetWeatherByAddressChoreo.setAppKey(TEMBOO_APP_KEY);// set the name of the choreo we want to runGetWeatherByAddressChoreo.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 APIsGetWeatherByAddressChoreo.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 temperatureGetWeatherByAddressChoreo.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 monitorwhile(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 기기를 쉽게 만들고, 제어할 수 있도록, 불필요한 코딩은 점점 줄여나가는 방식으로 발전될 것 같다.