ESP8266에서 MQTT 사용하기
아두이노

ESP8266에서 MQTT 사용하기

반응형

 

ESP8266에서 MQTT를 사용하기 위해서는 MQTT borker가 필요하다. 이는 파이썬 등으로 직접 구현할 수 도 있지만 아래 사이트를 통해 무료로 사용할 수 도 있다.

 

https://www.cloudmqtt.com/

 

 

우선 위의 주소로 접속하고나서 회원가입을 한다. (이메일 인증이 필요하다.)

 

회원가입을 완료하면 위와 같은 화면을 볼수있는데, Instances의 Test 항목은 필자가 이미 만들어둔 MQTT 채널이다. 새로운 채널을 만들기 위해서 Create New Instance 버튼을 누른다.

 

 

부가적인 채널의 이름, 서버(US, EU선택 가능)를 선택하면 채널 제작이 완료된다.

 

 

 

이제 완성된 채널로 들어가 보면 Details에 자신의 Server 주소, User, Password, Port 등을 알 수 있다. (다른 항목들은 여기서 별로 중요하지않다.)

여기까지 완성되었다면 ESP8266을 코딩할 차례이다.

 

우선 ESP8266을 사용하는 보드 (여기서는 wemos d1 mini)를 아래와 같이 스위치와 연결한다.

 

 

그 다음 아두이노 IDE를 이용해 다음 코드를 업로드 한다.  이때 라이브러리 하나가 필요한데 아래에서 다운받을 수 있다.

 

pubsubclient-master.zip

 

[소스코드] (https://blog.naver.com/twophase/220734184368 를 참고함)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
 
const char* ssid = "*****";           // 와이파이 이름
const char* password = "*****";       // 와이파이 비밀번호
 
#define mqtt_server "***.cloudmqtt.com"    // MQTT server 주소
#define mqtt_port XXXXX                    // port 번호
#define mqtt_topic "test"                  // topic (자유롭게 작성}
#define mqtt_user "*****"                  // username
#define mqtt_password "*****"              // password
 
int pinLED = 2;                            
int pinSwitch = 5;                         
int pinState = HIGH;
 
WiFiClient espClient;
PubSubClient client(espClient);
 
void setup() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);
 
  pinMode(pinLED, OUTPUT);
  pinMode(pinSwitch, INPUT_PULLUP);
  
  pinState = digitalRead(pinSwitch);
  digitalWrite(pinLED, pinState);
 
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}
 
void loop() {
  if (!client.connected()) {
    client.connect("ESP8266Client", mqtt_user, mqtt_password);
    client.subscribe(mqtt_topic); 
  }
  if (pinState != digitalRead(pinSwitch)) {
    pinState = !pinState;
    client.publish(mqtt_topic, pinState? "LED OFF" : "LED ON");
  }
  client.loop();
}
 
void callback(char* topic, byte* payload, unsigned int length) {
  String Msg = "";
  int i=0;
  while (i<length) Msg += (char)payload[i++];
  if (Msg == "Push") {
    digitalWrite(pinLED, !digitalRead(pinLED));
    client.publish(mqtt_topic, (digitalRead(pinLED) ? "LED OFF" : "LED ON"));
    return;
  }
  if (Msg == "LED ON") digitalWrite(pinLED, LOW);
  if (Msg == "LED OFF") digitalWrite(pinLED, HIGH);
 
cs

 

여기서 7, 8, 10, 11번째 줄은 모두 자신의 MQTT 채널의 Details에 적힌 내용을 적어야 한다. (Topic은 자유)

업로드 후 다시 CloudMQTT에 접속하여 WebsocetUI를 클릭한다.

 

그다음 Topic에 자신이 정했던 topic, Message에 Push라고 입력한 뒤 Send 버튼을 누르면 ESP8266에 내장된 LED가 켜지는 것을 확인할 수 있다.  (LED ON, LED OFF를 입력하고 직접 변화를 확인해 보자)

 

반응형
    # 테스트용