본 문서는 아두이노 개발환경(IDE)를 이용해서 ESP8266 모듈을 다루는 예제들을 포함하고 있습니다.

.


IoT 시스템 구현을 한다면 한번쯤 고려하기 마련인 MQTT 프로토콜을 ESP8266에서 구현하는 예제입니다. 특히 아두이노 개발환경을 이용해서 MQTT 클라이언트를 구현하도록 하겠습니다.

이 문서에서는 MQTT 프로토콜의 상세 내용에 대해서는 다루지 않습니다. 아직 MQTT 가 익숙치 않으신 분은 아래 MQTT 를 상세히 다룬 링크를 참고하세요.

.


MQTT 통신 기본 예제

MQTT 프로토콜을 테스트하기 위해서는 MQTT 서버 역할을 하는 Broker 가 필요합니다. 가장 유명한 MQTT Broker 어플리케이션인 Mosquitto 를 PC 또는 라즈베리 파이에 설치해서 사용하시면 됩니다. 아래 링크에서 다운로드 받아 설치하세요.

MQTT 브로커가 설치되고 동작하는 상태라면 여기에 ESP8266 을 client 로 붙여 여러가지 테스트를 할 수 있습니다.

.


라이브러리 설치

ESP8266 모듈에 MQTT 기능을 구현하기 위해서는 해당 라이브러리가 필요합니다. 아두이노 개발환경에서 사용할 수 있도록 개발된 라이브러리가 여러 종류가 있는데 여기서는 PubSubClient 라이브러리를 사용하도록 하겠습니다. 일단 아두이노 개발환경을 실행하고 아래 순서대로 라이브러리를 설치하면 됩니다.

  • Arduino IDE 실행 (ESP8266 플러그인이 설치된 v1.6.5 이상)
  • 메뉴 –> sketch –> include library –> Manage Libraries
  • PubSubClient 검색
  • 클릭 후 최신 버전 설치

그림1

.


연결 방법

라이브러리 설치가 되면 이제 테스트를 위한 하드웨어 준비가 필요합니다. 여기서는 편의상 ESP8266 – NodeMCU v1.0 보드를 사용합니다. USB 연결만하면 PC에서 바로 소스코드 업로드 및 시리얼 통신 모니터링이 가능합니다.

그리고 전송/수신한 MQTT 메시지를 바로 볼 수 있도록 OLED 디스플레이를 추가했습니다. OLED 가 없다면 생략하고 NodeMCU 보드만 사용해도 테스트 하는데는 지장 없습니다.

NodeMCU 보드와 OLED 디스플레이는 아래와 같이 연결합니다.

  • NodeMCU –> OLED
  • VCC –> 3V
  • GND –> G (GND)
  • SDA –> D2 (GPIO4)
  • SCL –> D1 (GPIO5)

esp8266_oled_bb_small

.


소스 코드(스케치)

이 예제는 ESP8266 부팅 후 AP(공유기)에 접속하면 MQTT 브로커에 연결을 시도합니다. 그리고 MQTT 브로커에 연결되면 특정 토픽에 주기적으로 MQTT 메시지를 전송합니다. 해당 토픽으로 들어오는 메시지를 수신해서 OLED에 보여주기도 합니다. 소스코드는 아래 링크에서 다운로드 받으세요.

예제 소스는 AP(공유기) 아이디와 비밀번호, MQTT 설정 항목들이 임의로 작성되어 있습니다. 따라서 이 부분은 직접 자신의 환경에 맞게 수정한 후 사용해야 합니다.

//----- WiFi settings
const char *ssid = "your_ap_id";
const char *password = "your_ap_password";
const char* mqtt_server = "mqtt_url";
const char* mqtt_topic = "topic";
char* mqtt_message = "Hello world #%ld";

마지막 메시지에서 #%ld 부분은 수정하지 말고 남겨두세요.

소스코드는 아래 5개의 함수를 가지고 있습니다.

void setup() {}
void loop() {}
void callback(char* topic, byte* payload, unsigned int length) {}
void reconnect() {}
void drawText(int line, String message) {}
  • setup() 함수는 시리얼 통신, OLED 초기화 작업을 하고 AP 접속과 MQTT 통신을 위한 초기화 작업을 합니다.
  • loop() 함수는 MQTT 브로커에 연결되어 있는지 확인하고 접속이 끊어지면 재접속 합니다. 그리고 MQTT 브로커에 연결되었을 때 주기적으로 메시지를 전송합니다.
  • callback() 함수는 MQTT 메시지를 수신했을 때 호출되는 콜백함수입니다. 여기서 수신한 메시지를 OLED에 표시합니다.
  • reconnect() 함수는 MQTT 브로커에 연결하고 특정 토픽 subscribe(구독) 작업을 합니다. loop() 함수에서 주기적으로 호출합니다.
  • drawText() 함수는 OLED에 메시지를 표시하기 위한 함수입니다.

그리 길지 않은 소스 코드입니다. 천천히 분석해 보시면 이후 간단한 MQTT 기능들은 쉽게 만드실 수 있을겁니다.

.


테스트

[메뉴 – 도구 – 보드] 에서 NodeMCU v1.0 보드를 선택한 뒤, 포트를 선택하고 업로드하면 됩니다. 업로드가 끝나면 아래 과정을 반복할 것입니다.

  • AP 접속
  • MQTT 서버 접속
  • 사용자가 미리 지정한 토픽 subscribe(구독)
  • 주기적으로 지정한 토픽에 메시지 전송
  • 메시지를 수신할 경우 OLED에 표시

20160502_153030

.


참고자료

여기서는 아두이노 개발환경을 이용해서 ESP8266 – MQTT 기능을 테스트 했습니다. 같은 기능을 ESP8266 – Sming framework 을 이용해서 구현할 수도 있습니다.

구현에 사용된 PubSubClient 의 상세 내용을 아래 링크에서 보실 수 있습니다.