2016년 3월 28일 월요일

NodeMCU와 Blynk를 사용한 IoT - (2) 튜토리얼 1

이전 포스트(NodeMCU와 Blynk를 사용한 IoT - (1) 환경설정)에서 환경설정이 끝났으므로 이제 실제로 blnyk를 사용해 원격제어를 해 보겠다.



 Blynk 앱을 실행시키고 로그인을 하면 위와 같은 화면이 나온다. 여기서 'Create New Project'를 클릭한다.



 새로 만들 프로젝트 설정 화면이 나온다.



Project Name 부분에 프로젝트의 이름(여기서는 'Tutorial 1')을 넣고 'Arduino Uno'를 클릭하면 위와 같이 어떤 하드웨어를 사용할 지 선택할 수 있다. 여기서는 NodeMCU를 사용할 것이므로 아래쪽으로 내려가 'NodeMCU'를 선택해 준다.


이제  설정이 끝났으므로 'Create Project' 버튼을 눌러주면 된다. 단 위쪽의 AUTH TOKEN 부분의 파란 글자(여기서는 중간 부분을 일부러 흐리게 한 줄)는 잘 기억하고 있어야 한다. 나중에 NodeMCU에 프로그램을 넣어줄 때 AUTH TOKEN 값을 넣어줘야만 서로 통신이 가능하다.


이제부터 프로젝트 화면을 디자인 할 수 있다.



 화면의 아무 부분이나 터치하면 오른쪽에 위와 같이 위젯을 선택할 수 있는 화면이 열린다.


가장 위에 있는 BUTTON을 선택하면 화면에 버튼 위젯이 생성된다.


생성된 버튼 위젯을 누르면 위와 같이 위젯 설정 화면이 나오게 된다.


 'Button' 부분에 버튼의 이름(여기서는 'Orange')를 넣어주고  'PIN' 부분을 누르면 그 버튼에 연결될 출력핀을 선택할 수 있다.


첫번째 버튼은 Digital - D1 핀을 선택 해 준다.


마지막으로 MODE 부분에서 PUSH와 SWITCH 를 선택할 수 있는데 PUSH인 경우는 누르고 있어야만 on이 되는 타입이고, SWITCH인 경우는 토글 스위치로 동작한다. 여기서는 SWITCH 타입을 사용한다. 설정이 끝났으면 우측 상단의 'OK' 버튼을 눌러준다.


이제 첫번째 버튼 위젯 설정이 끝난 것이다. 버튼 위젯에 방금 넣어준 이름과 핀 번호가 표시된 걸 볼 수 있다.


동일한 방법으로 두개의 버튼을 더 만들어 준다. 각각 이름은 'Blue', 'Yellow'로 하고 핀은 D2, D3을 선택해 주면 된다. 


다시 화면의 빈 부분을 눌러 새 위젯 선택 화면으로 오면 이번엔 'Large Slider'를 선택한다.


Slider 설정화면에서 이름은 'Red Brightness'로 하고 핀은 D4를 선택 해 준다. 핀 번호 옆의 0~255 값은 슬라이더를 이동시켰을 때 변화하는 최소값, 최대값이다.


이제 프로젝트 화면 디자인이 끝났다. 화면 우측 상단의 삼각형 버튼을 누르면 디자인 한 프로젝트 화면을 실행하게 된다.


프로젝트를 실행시켰지만 아직 이 프로젝트에 연결된 하드웨어가 없기 때문에 'NodeMCU is offline'이라는 메시지가 나오게 된다. 

이제 프로젝트에 연동되는 하드웨어를 만들어 준다. 이번에 사용할 회로는 다음과 같다.

4개의 LED를 NodeMCU의 D1, D2, D3, D4에 각각 연결해 주면 된다. 여기서는 D1/2/3에 연결된 LED는 on/off로 제어하고 D4에 연결된 LED는 PWM을 사용해 밝기를 제어해 보도록 한다.

여기에 사용할 코드는 다음과 같다.

#define BLYNK_PRINT Serial   
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SimpleTimer.h>
 

char auth[] = ".......";   // AUTH TOKEN
void setup()
{
  Serial.begin(115200);
  Blynk.begin(auth, "....", "....");   // SSID & PASSWORD
}

void loop()
{
  Blynk.run();

}


아두이노 IDE에서 위와 같이 프로그램 코드를 넣어주면 된다. 소스코드에서 빨간색 '....' 부분은 각각 첫번째부터 Blynk 앱에서 프로젝트를 만들때 자동으로 생성된 AUTH TOKEN 값, 두번째는 자신의 공유기 SSID, 세번째는 공유기 암호로 바꿔 프로그램을 NodeMCU에 업로드 해 주면 된다.

프로그램 업로드가 끝나고 NodeMCU에서 실행되면 이제 다시 스마트폰의 앱으로 돌아와 버튼을 눌러보거나 슬라이더를 움직이면서 보드에 연결된 LED의 동작을 확인해 보면 된다.

NodeMCU의 경우 각 핀에 대해 별도의 설정이나 제어 코드가 하나도 없는데도 Blynk를 사용하는 것 만으로 쉽게 원격에서 제어가 가능해진다.

여기서는 단순히 LED를 연결했지만 LED 대신 릴레이를 연결해 주면 곧바로 가전제품을 원격제어 하는 식의 스마트 홈을 구축할 수 있게 된다. 아래의 경우 SSR(Solid State Relay)를 사용해 전원 스위치 역할을 하게 한 것이다.



(단 220V 교류를 제어하는건 최소한의 전기적인 기본 지식이 필요하다. 기본적인 지식도 없이 시도하다 보면 감전 및 화재등의 사고가 발생할 수 있으니 주의하기 바란다.)



댓글 5개:

  1. 안녕하세요. 너무나 잘된 설명에 많은 도움을 받습니다.
    실습하는 도중 한가지 안되는 점이 있어 여쭤보려 합니다.
    헤더파일을 참조할수없다는 컴파일 오류가 뜨던데
    작성된 패키지 다운이나 경로지정 외에 다른 것도 해줘야 하나요?
    sketch_jul05a.ino:3:32: fatal error: BlynkSimpleEsp8266.h: No such file or directory

    답글삭제
  2. 안녕하세요 많은 도움을 받고있습니다.
    그런데 실습도중 하나 오류가 떠서 문의하게 되었습니다.
    헤더파일 참조가 안되던데 어떻게 해야 되나요?
    sketch_jul05a.ino:3:32: fatal error: BlynkSimpleEsp8266.h: No such file or directory

    답글삭제
    답글
    1. 아두이노용 blynk 라이브러리도 설치해 주셔야 합니다.

      https://github.com/blynkkk/blynk-library/releases/download/v0.3.7/Blynk_v0.3.7.zip

      삭제
  3. 안녕하세요 저도 사용자인데요~ 혹시 push 알람 한글로 제대로 나오시나요??? 요즘 ?로 글씨 깨져서 나오지 않으신가요?ㅜㅜ

    답글삭제
  4. nodeMCU와 Blynk를 활용해 와이파이 온습도계+음압 측정기를 만드려고 하는데요
    nodeMCU 이전에 와이파이와 esp8266-01가지고 회로짜고 정상 작동 되는 것을 확인한 후 추가 기능을 위해 nodeMCU로 옴겨 회로를 그대로 사용했음에도 문제가 생기네요.

    nodeMCU 1.0에서 사운드 센서 A0에 꼽고 DHT11 D2에 꼽고 시리얼 프린트로 해당 값을 출력 시키면

    Humidity: 2147483647% Temperature: 2147483647 C Mic: 1

    이라고 나옵니다.(마이크의 경우 0~1 왔다갔다 하고 가끔 8 나옵니다)
    해당 회로 그대로 아두이노에서 할 때에는 아무런 문제가 없이 정상값(온도 24, 습도 17%, 음향 23~30)이 출력 되었었는데
    뭐가 문제인지 감을 못잡겠네요 ㅠㅠ
    5V 전원은 모두 VIN에다가 꼽고 그라운드는 바로 옆 G에 꼽았습니다.
    이유가 뭘까요? ㅠㅠ 하루죙일 이것과 씨름 중입니다.
    (와이파이는 정상 작동 됩니다.)

    핀 연결상태는 이렇습니다.
    5V = VIN
    GND = G
    DHT = D2
    Mic = A0

    아래는 코드입니다.
    아두이노때는 잘되던 회로와 코드입니다.ㅠ
    제가 뭔가를 놓치고 있는걸까요?

    #include
    #include

    #include "DHT.h" // DHT.h 라이브러리를 포함한다
    #define DHTPIN 2 // DHT핀을 D2번으로 정의한다(DATA핀)
    #define DHTTYPE DHT11 // DHT타입을 DHT11로 정의한다
    DHT dht(DHTPIN, DHTTYPE); // DHT설정 - dht (디지털2, dht11)

    #define BLYNK_PRINT Serial // Comment this out to disable prints and save space

    const char* ssid = "****";
    const char* pass = "****";
    char auth[] = "****"; // Blynk 토큰

    int h; // 변수 h에 습도 값을 저장
    int t; // 변수 t에 온도 값을 저장
    int m; // 변수 m에 마이크 입력 값을 저장
    WidgetLED led(V3);

    void setup() {
    Serial.begin(115200);

    Blynk.begin(auth, ssid, pass); // 블링크 시작 시 토큰, 통신형태, AP이름, 비번으로 접속
    while (Blynk.connect() == 0) {
    // 연결될 때까지 기다리기
    }

    }

    void loop() {

    h = dht.readHumidity(); // 변수 h에 습도 값을 저장
    t = dht.readTemperature(); // 변수 t에 온도 값을 저장
    m = analogRead(A0);

    Blynk.run(); // 블링크 작동

    if (m > 50) {
    led.on(); //마이크 입력값 50을 넘어가면 전원 켜기
    } else {
    led.off(); //마이크 입력값 50 이하면 전원 끄기
    }

    Blynk.virtualWrite(V0, h); //블링크에 보낼 Virtual Pin 0번 값
    Blynk.virtualWrite(V1, t); //블링크에 보낼 Virtual Pin 1번 값
    Blynk.virtualWrite(V2, m); //마이크 음압 게이지용

    Serial.print("Humidity: "); // 문자열 Humidity: 를 출력한다.
    Serial.print(h); // 변수 h(습도)를 출력한다.
    Serial.print("%\t"); // %를 출력한다
    Serial.print(" Temperature: "); // 이하생략
    Serial.print(t);
    Serial.print(" C");
    Serial.print(" Mic: ");
    Serial.println(m);

    }

    답글삭제