예산이 부족하다고 해서 고급 DIY 프로젝트에 도전할 수 없다는 뜻은 아닙니다. IoT 프로젝트를 확장할 수 있는 작고 저렴하며 편리한 WiFi 모듈을 찾고 있다면 ESP-01 모듈이 좋은 선택입니다. 하지만 이러한 모듈을 MQTT와 같은 경량 프로토콜과 통합하는 것은 특히 IoT 개발이 처음인 경우 까다로울 수 있습니다.

ESP-01 기판만 프로그래밍하는 것은 ESP8266 계열의 다른 모듈에 비해 어려울 수 있습니다. 하지만 모듈 사용을 시작하는 데 필요한 모든 하드웨어 및 소프트웨어 설정의 기본 사항과 간단한 절차에 따라 MQTT를 설정하는 방법을 살펴봅니다.

보드 알아보기

ESP8266 ESP-01은 IoT 애플리케이션을 위해 설계된 고집적 SoC인 ESP8266EX 칩과 함께 제공되는 작고 컴팩트한 WiFi 모듈입니다.

이 모듈에는 TCP/IP 프로토콜 스택이 있는 단일 칩 무선 마이크로컨트롤러가 포함되어 있으며 무선 네트워크에 연결하거나 액세스 포인트 역할을 할 수 있습니다. 또한 ESP-01 모듈은 GPIO 핀, 전원 및 접지, UART 인터페이스에 대한 액세스를 제공하는 2×4 핀 헤더를 갖추고 있습니다.

하드웨어 설정

이 모듈은 브레드보드에 전혀 적합하지 않습니다. 편의를 위해 사전 제작된 확장 보드를 구입하거나 점퍼 와이어와 브레드 보드를 사용하는 구식 방식을 사용할 수 있습니다.

전용 프로그래머인 ESP8266 시리얼 모듈 보드를 사용하면 프로그래밍을 쉽게 할 수 있습니다. 이 방법을 선호하는 경우, DIYHOBI 에 프로그래머를 사용하여 프로그램을 ESP-01 모듈에 플래시하는 방법에 대한 편리한 자습서가 있습니다(USB-TTL CH340G 변환기 모듈 어댑터 포함).

하지만 아두이노 보드를 사용하여 모듈을 프로그래밍할 수도 있습니다. 아래 회로도를 참조하세요.

모듈을 아두이노의 3.3v 핀에 직접 연결하고 싶을 수도 있지만, 핀이 제공하는 전류보다 더 많은 전류를 필요로 하므로 일반적으로 모듈을 아두이노의 3.3v 핀에 직접 연결하는 것은 권장하지 않습니다. 대신 Arduino 5V를 LM1117/LD117과 같은 3.3V 전압 레귤레이터에 연결한 다음 레귤레이터에서 WiFi 모듈에 전원을 공급하세요.

ESP의 VCC 및 CH_PD 핀을 아두이노의 5V 핀에 연결하지 마세요. 모듈을 5V 전원에 연결하면 모듈이 손상될 수 있습니다.

이 글도 확인해 보세요:  NUC와 SBC: 어떻게 비교할 수 있을까요?

모든 커패시터는 10uF이고 저항은 1K 저항입니다.

소프트웨어 요구 사항

ESP-01 모듈은 일반적으로 아두이노 플랫폼과 함께 사용됩니다. 따라서 소프트웨어 설정은 매우 간단하며, 특히 아두이노 C에 익숙하다면 더욱 그렇습니다. 하지만 라즈베리에 더 익숙하다면 다양한 라즈베리 파이 IoT 프로젝트를 시도해 볼 수 있습니다.

이것이 기본 요구 사항입니다:

⭐ MQTT 브로커 또는 서버(예: Mosquitto 또는 CloudMQTT).

⭐ ESP8266 코어 라이브러리가 포함된 Arduino IDE.

⭐ Arduino용 PubSubClient 라이브러리.

로컬에 자체 MQTT 서버를 보유하면 프로젝트 내에서 유연성을 확보할 수 있다는 점을 기억해야 합니다.

필요한 라이브러리 설치하기

먼저 컴퓨터에 Arduino IDE를 다운로드하여 설치합니다. 설치가 완료되면 Arduino IDE를 열고 파일 및 환경 설정으로 이동합니다.

추가 보드 관리자 URL 필드에 다음 URL을 입력합니다:

 http://arduino.esp8266.com/stable/package_esp8266com_index.json 

확인을 클릭하여 환경설정 창을 닫습니다.

다음으로 도구 및 보드 및 보드 관리자로 이동합니다.

그런 다음 esp8266을 검색하고 esp8266 보드 패키지를 설치합니다(여기에는 ESP-01 모듈에 필요한 모든 라이브러리가 포함되어 있습니다).

PubSubClient 라이브러리를 설치하려면 Sketch의 ‘라이브러리 포함’ 및 ‘라이브러리 관리’로 이동합니다.

PubSubClient를 검색하고 라이브러리를 클릭하여 설치합니다.

필요한 라이브러리를 모두 설치했으면 ESP-01 모듈 프로그래밍을 시작할 수 있습니다. 한 가지 주의할 점은 라이브러리에 포함된 Wifi.h를 사용하거나 ESPWifi.h 라이브러리 를 다운로드하여 스케치에 포함시킬 수 있다는 것입니다.

ESP-01과 MQTT 브로커 간 연결 설정

MQTT 브로커는 MQTT 클라이언트 사이에서 중개자 역할을 하는 서버입니다. 이를 통해 클라이언트는 게시-구독 모델을 통해 서로 메시지를 주고받을 수 있습니다.

ESP-01 모듈을 MQTT 브로커에 연결하려면 코드에 브로커의 IP 주소와 포트 번호를 지정해야 합니다. 또한 브로커에 ESP-01 모듈을 식별하는 고유 클라이언트 ID를 제공해야 합니다.

먼저 스케치 상단에 필요한 라이브러리를 포함하세요.

 #include <ESP8266WiFi.h>
#include <PubSubClient.h>

다음으로 WiFi 및 MQTT 연결 세부 정보를 정의합니다.

 const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
const char* mqtt_server = "YOUR_MQTT_SERVER";

플레이스홀더를 나만의 WiFi 및 MQTT 연결 세부 정보로 바꾸는 것을 잊지 마세요.

이 글도 확인해 보세요:  새로운 아두이노 우노 R4가 메이커의 판도를 바꾸는 이유

그런 다음 WiFi 클라이언트를 생성하고 로컬 WiFi 네트워크에 연결합니다:

 WiFiClient espClient;
void setup_wifi() {
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
}

이 함수는 스케치의 setup() 함수에서 호출해야 합니다.

다음으로 MQTT 클라이언트를 생성하고 MQTT 브로커에 연결해야 합니다:

 PubSubClient client(espClient);
void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP01", mqtt_user, mqtt_password)) {
      // Subscribe to a topic
      client.subscribe("test/topic");
    } else {
      delay(5000);
    }
  }
}

MQTT 브로커에 연결하면 토픽 게시 및 구독을 시작할 수 있습니다.

ESP-01에서 MQTT 브로커로 데이터 게시하기

이제 ESP01 모듈을 MQTT 브로커에 성공적으로 연결했으므로 ESP-01에서 브로커로 데이터를 게시하는 방법을 살펴봅시다.

데이터를 게시하려면 client.publish() 함수를 사용하여 inTopic 주제에 메시지를 게시합니다.

 client.publish("inTopic", "Hello from ESP-01"); 

“Hello from ESP-01” 메시지를 inTopic 주제에 게시합니다.

ESP-01의 센서 데이터를 브로커에 게시할 수도 있습니다. 예를 들어 ESP-01에 온도 센서가 연결되어 있는 경우 아래와 같이 브로커에 온도 데이터를 게시할 수 있습니다.

 float temperature = 25.5;
String temperatureString = String(temperature);
char temperatureChar[5];
temperatureString.toCharArray(temperatureChar, 5);
client.publish("Temp", temperatureChar);

이렇게 하면 온도 데이터가 Temp 항목에 게시됩니다.

프로젝트의 요구 사항에 따라 데이터를 루프 또는 일정한 간격으로 게시할 수 있습니다. 브로커에 너무 많은 데이터가 넘쳐나지 않도록 하고 적절한 간격으로 게시하고 있는지 확인하세요.

ESP-01에서 MQTT 토픽 구독 및 데이터 수신하기

토픽을 구독하려면 client.subscribe() 함수를 사용합니다. 아래 사례의 경우 클라이언트는 outTopic 토픽을 구독합니다.

 client.subscribe("outTopic"); 

토픽을 구독한 후에는 아래 스케치의 loop() 함수에서 client.loop() 함수를 사용하여 해당 토픽에 게시된 메시지를 수신할 수 있습니다:

 void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

이것은 지속적으로 새 메시지를 확인하고 새 메시지가 수신되면 콜백 함수를 실행합니다.

수신된 메시지를 처리하려면 아래와 같이 콜백 함수를 정의합니다:

 void callback(char* topic, byte* payload, unsigned int length) {
  // Print the received message
  Serial.print("Message received on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

이 함수는 구독한 주제에 대한 새 메시지가 수신되면 호출됩니다. 이 함수는 수신된 메시지를 직렬 모니터에 인쇄합니다.

이 글도 확인해 보세요:  GY-271 나침반 모듈과 아두이노로 길 찾기

QoS(서비스 품질) 수준 및 보안 기능 사용하기

요청을 처리하는 데 사용되는 가장 중요한 기술 중 하나는 MQTT 메시지에 대해 QoS(서비스 품질) 수준을 사용하는 것입니다. QoS 수준은 브로커와 가입자가 메시지를 처리하는 방법을 정의합니다. QoS 수준에는 0, 1, 2의 세 가지가 있습니다.

QoS 레벨 0은 메시지가 한 번만 전송되고 가입자에게 전달되는 것이 보장되지 않으므로 가장 안정성이 낮습니다. QoS 수준 1은 메시지가 적어도 한 번 이상 전송되고 가입자에게 적어도 한 번 이상 전달되도록 보장되므로 더 안정적입니다. QoS 수준 2는 메시지가 정확히 한 번만 전송되고 가입자에게 정확히 한 번만 전달되도록 보장되므로 가장 안정적입니다. 디바이스의 통신 방식은 다른 일반적인 사물 인터넷(IoT) 보안 문제 및 해결 방법과도 밀접한 관련이 있습니다.

QoS 레벨을 사용하려면 client.publish() 함수를 사용하여 메시지를 게시할 때 원하는 레벨을 지정할 수 있습니다:

 client.publish("topic", "Hello, world!", 1); 

이렇게 하면 Hello, world! 메시지가 QoS 수준 1로 주제 주제에 게시됩니다.

또 다른 고급 기법은 LWT(Last Will and Testament) 메시지를 사용하는 것입니다. LWT 메시지는 클라이언트가 예기치 않게 연결을 끊을 때 브로커가 보내는 메시지입니다. 이는 오프라인 장치를 감지하거나 장치 연결이 끊어졌을 때 조치를 트리거하는 데 중요하다고 생각합니다.

LWT 메시지를 사용하려면 client.setWill() 함수를 사용하여 브로커에 연결할 때 LWT 메시지를 지정할 수 있습니다:

 client.setWill("status", "offline", 1, true); 

이렇게 하면 QoS 수준이 1이고 retain 플래그가 true로 설정된 상태 항목에서 LWT 메시지가 오프라인으로 설정됩니다.

다음 IoT 프로젝트 준비

ESP-01 모듈은 IoT 프로젝트를 위한 경제적이고 컴팩트한 솔루션으로, MQTT와 함께 사용하면 프로젝트를 한 단계 더 발전시킬 수 있습니다. 초기 설정이 까다로울 수 있지만, 가벼운 통신과 높은 확장성 등 MQTT의 이점을 고려하면 투자할 가치가 있습니다.

By 김민수

안드로이드, 서버 개발을 시작으로 여러 분야를 넘나들고 있는 풀스택(Full-stack) 개발자입니다. 오픈소스 기술과 혁신에 큰 관심을 가지고 있고, 보다 많은 사람이 기술을 통해 꿈꾸던 일을 실현하도록 돕기를 희망하고 있습니다.