Protocol/MQTT

MQTT가 포함 된 ESP8266 및 Node-RED (게시 및 구독)

황기하 2021. 6. 22.

이 게시물에서는 Node-RED에서 ESP8266 출력을 제어하고 ESP8266의 센서 데이터를 표시하는 방법을 보여줄 것입니다. Node-RED 소프트웨어는 Raspberry Pi에서 실행되며 ESP8266과 Node-RED 소프트웨어 간의 통신은 MQTT 통신 프로토콜로 이루어집니다.

다음 그림은이 자습서에서 수행 할 작업의 개요를 보여줍니다.

 

 

먼저 아래 비디오 데모를보십시오.

 

Node-RED 및 Node-RED 대시 보드

Raspberry Pi에 Node-RED 및 Node-RED 대시 보드가 설치되어 있어야합니다 . 다음 블로그 게시물은 Node-RED 및 Node-RED 대시 보드를 시작하는 데 유용합니다.

 

MQTT 프로토콜

이 튜토리얼에서는 Node-RED 소프트웨어를 실행하는 Raspberry Pi와 MQTT를 사용하는 ESP8266 간의 통신을 설정합니다.

MQTT는 MQ T elemetry  T ransport의 약자이며  클라이언트로 메시지를 게시하고 수신 할 수있는 멋진 경량 게시 및 구독 시스템입니다. 제한된 장치와 낮은 대역폭을 위해 설계된 간단한 메시징 프로토콜입니다. 따라서 사물 인터넷 애플리케이션을위한 완벽한 솔루션입니다.

MQTT에 대해 자세히 알아 보려면 아래 비디오를 시청하십시오.

 

 

Mosquitto Broker 설치

MQTT에서 브로커는 기본적으로  모든 메시지 를  수신 하고, 메시지를  필터링  하고,   관심있는 사람을 결정 하고,   구독 된 모든 클라이언트에 메시지를 게시 합니다.

사용할 수있는 여러 브로커가 있습니다. 이 튜토리얼에서는  Raspberry Pi에 설치 해야하는 Mosquitto Broker 를 사용합니다  .

 

Raspberry Pi에 Mosquitto 브로커를 설치하려면 다음 자습서를 따르십시오  . 
Raspberry Pi에 Mosquitto Broker를 설치하는 방법 .

테스팅

Mosquitto 브로커가 성공적으로 설치되었는지 확인하려면 다음 명령을 실행하십시오.

 

pi @ ra spberry : ~ $ mosquitto -v

 

그러면 현재 Raspberry Pi에서 실행중인 Mosquitto 버전이 반환됩니다. 1.4 이상이어야합니다.

참고 : Mosquitto 명령은 현재 설치된 Mosquitto 버전을 반환하지만 Mosquitto를 다시 초기화하려고 시도합

니다. Mosquitto가 이미 실행 중이므로 오류 메시지가 표시됩니다. 비슷한 메시지가 표시 되더라도
Mosquitto가 제대로 설치되어 실행되고 있다고 걱정하지 마십시오.

Node-RED와 MQTT 통신 설정

이 섹션에서는 Node-RED 노드를 사용하여 MQTT 통신을 설정합니다.

대시 보드 레이아웃

첫 번째 단계는 대시 보드 레이아웃을 만드는 것입니다. 이 예에서는 ESP8266 출력을 제어하는 ​​버튼이 있습니다. DHT11 센서의 온도 및 습도 판독 값을 표시하는 차트 및 게이지.

Node-RED 창의 오른쪽 상단 에서 대시 보드   아래의 레이아웃 탭을  선택합니다  . Room 이라는  탭을 만들고 Room 탭 안에 아래 그림과 같이 Lamp 와  Sensor 라는 두 그룹을 만듭니다 .

흐름 만들기

다음 노드를 흐름으로 드래그합니다. 아래 그림을 참조하십시오.

  • 스위치 – ESP8266 출력을 제어합니다.
  • mqtt 출력 노드 – 스위치 상태에 따라 ESP8266에 메시지를 게시합니다.
  • 2x  mqtt 입력 노드 –이 노드는 ESP에서 센서 데이터를 수신하기 위해 온도 및 습도 주제를 구독합니다.
  • 차트 – 온도 센서 판독 값을 표시합니다.
  • 게이지 – 습도 센서 판독 값을 표시합니다.

Node-RED와 MQTT 브로커를 연결해야합니다. MQTT 브로커를 Node-REd에 연결하려면 MQTT 출력 노드를 두 번 클릭합니다. 아래 그림과 같이 새 창이 나타납니다.

  1. 새 mqtt-broker 추가 옵션을 클릭하십시오 .
  2. 서버 필드에 localhost  입력 하십시오.
  3. 다른 모든 설정은 기본적으로 올바르게 구성됩니다.
  4. 추가를 누르면 MQTT 출력 노드가 자동으로 브로커에 연결됩니다.

다음 그림에 표시된대로 다른 모든 노드 속성을 편집합니다.

  • switch –  스위치가 켜져  있을 때 on  문자열 메시지를 보냅니다  . 꺼져 있을 때 문자열 끄기  메시지를 보냅니다  . 이 노드는 방 / 램프 주제 에 게시됩니다  . 그러면 ESP가이 주제를 구독하여 메시지를받습니다.
  • mqtt 출력 노드 . 이 노드는 mosquitto 브로커에 연결되어 있으며 룸 / 램프 주제에 게시됩니다 .
  • mqtt 입력 노드 . 이 노드는 ESP8266에서 온도 센서 데이터를 수신 하기 위해 실내 / 온도 주제를 구독합니다 . ESP8266은이 주제에 대한 온도 판독 값을 공개 할 것입니다.
  • 차트. 차트는 룸 / 온도 주제 에 대해 수신 된 판독 값을 표시합니다 .
  • mqtt 입력 노드. 이 노드는 ESP8266에서 습도 센서 데이터를 수신 하기 위해 방 / 습도 주제를 구독합니다 . ESP8266은 동일한 주제에 대한 습도 측정 값을 공개 할 것입니다.
  • 계량기. 게이지는 실내 / 습도 주제 에 대해 수신 한 판독 값을 표시합니다 .

아래 그림과 같이 노드를 연결하십시오.

Node-RED 애플리케이션이 준비되었습니다. 오른쪽 상단에 있는 배포 버튼을 클릭합니다  .

Node-RED 애플리케이션이 준비되었습니다. 대시 보드가 어떻게 보이는지 보려면   http : // your-pi-ip-address / ui로 이동하십시오 .

이제 다음 섹션에 따라 ESP8266을 준비하십시오.

Arduino IDE 준비

Arduino IDE를 사용하여 ESP8266을 프로그래밍합니다. Arduino IDE를 사용하여 ESP8266에 코드를 업로드하려면 ESP8266 애드온 ( Arduino IDE에 ESP8266 보드를 설치하는 방법)을 설치해야합니다 . 또한 ESP8266을위한 모든 것을 준비하려면 두 개의 추가 라이브러리를 설치해야합니다.

PubSubClient 라이브러리 설치

PubSubClient의 라이브러리는 간단한 게시 수행하기위한 클라이언트 / 지원 MQTT는 (기본적 ESP8266이 노드 RED와 통화 할 수 있습니다)하는 서버에 가입 메시징을 제공합니다.

1) PubSubClient 라이브러리를 다운로드하려면 여기를 클릭하십시오 . 다운로드 폴더에 .zip 폴더 가 있어야 합니다.

2) .zip 폴더의 압축을 풀면 pubsubclient-master 폴더가 나타납니다.

3) 폴더 이름 변경 pubsubclient-master pubsubclient

4) pubsubclient 폴더를 Arduino IDE 설치 라이브러리 폴더로 이동하십시오.

5) 그런 다음 Arduino IDE를 다시 엽니 다.

라이브러리에는 여러 예제 스케치가 함께 제공됩니다. Arduino IDE 소프트웨어 내에서 File> Examples> PubSubClient를 참조하십시오.

DHT 센서 라이브러리 설치

DHT 센서 라이브러리는  당신의 ESP8266 또는 아두 이노 보드에 온도와 습도를 읽을 수있는 DHT 센서를 사용하는 쉬운 방법을 제공합니다.

1)  DHT 센서 라이브러리를 다운로드하려면 여기를 클릭하십시오 .  다운로드에 .zip 폴더 가 있어야합니다. 

2) .zip  폴더의   압축을  풀면 DHT-sensor-library-master  폴더가 나타납니다.

3)  폴더 이름 변경 DHT 센서 라이브러리 마스터 에  DHT

4) DHT  폴더를 Arduino IDE 설치  라이브러리  폴더로  이동하십시오. 

5)  그런 다음 Arduino IDE를 다시 엽니 다.

DHT11 센서 및 ESP8266에 대한 자세한 내용은  Arduino IDE가 포함 된 ESP8266 DHT11 / DHT22 온도 및 습도 웹 서버를 참조하십시오 .

Arduino IDE에서 올바른 보드 선택

또한 Arduino IDE에서 올바른 보드를 선택해야합니다.

1) 도구로 이동하여“NodeMCU 1.0 (ESP-12E 모듈)”을 선택합니다.

2) 도구> 포트> COM4 (필자의 경우)에서 ESP 포트 번호를 선택합니다.

코드 업로드

이제 다음 코드를 ESP8266에 업로드 할 수 있습니다. 이 코드는 MQTT 프로토콜 을 통해 실내 / 온도  실내 / 습도 주제 에 대한 DHT11 센서의 온도 및 습도 메시지를 게시합니다 .

ESP는 룸 / 램프 주제를 구독 하여 Node-RED 애플리케이션에서 해당 주제에 대해 게시 한 메시지를 수신하고 램프를 켜거나 끕니다.

코드는 변경해야 할 부분에 대해 잘 설명되어 있습니다. 자신의 SSID, 암호 및 RPi IP 주소로 코드를 편집해야합니다.

이 코드는 다른 DHT 센서와도 호환됩니다. 센서를 선택하려면 올바른 코드 줄의 주석을 제거하고 주석을 추가하기 만하면됩니다.

/*****
 
 All the resources for this project:
 https://randomnerdtutorials.com/
 
*****/

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

// Uncomment one of the lines bellow for whatever DHT sensor type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Change the credentials below, so your ESP8266 connects to your router
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// Change the variable to your Raspberry Pi IP address, so it connects to your MQTT broker
const char* mqtt_server = "REPLACE_WITH_YOUR_RPI_IP_ADDRESS";

// Initializes the espClient. You should change the espClient name if you have multiple ESPs running in your home automation system
WiFiClient espClient;
PubSubClient client(espClient);

// DHT Sensor - GPIO 5 = D1 on ESP-12E NodeMCU board
const int DHTPin = 5;

// Lamp - LED - GPIO 4 = D2 on ESP-12E NodeMCU board
const int lamp = 4;

// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);

// Timers auxiliar variables
long now = millis();
long lastMeasure = 0;

// Don't change the function below. This functions connects your ESP8266 to your router
void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected - ESP IP address: ");
  Serial.println(WiFi.localIP());
}

// This functions is executed when some device publishes a message to a topic that your ESP8266 is subscribed to
// Change the function below to add logic to your program, so when a device publishes a message to a topic that 
// your ESP8266 is subscribed you can actually do something
void callback(String topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;
  
  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();

  // Feel free to add more if statements to control more GPIOs with MQTT

  // If a message is received on the topic room/lamp, you check if the message is either on or off. Turns the lamp GPIO according to the message
  if(topic=="room/lamp"){
      Serial.print("Changing Room lamp to ");
      if(messageTemp == "on"){
        digitalWrite(lamp, HIGH);
        Serial.print("On");
      }
      else if(messageTemp == "off"){
        digitalWrite(lamp, LOW);
        Serial.print("Off");
      }
  }
  Serial.println();
}

// This functions reconnects your ESP8266 to your MQTT broker
// Change the function below if you want to subscribe to more topics with your ESP8266 
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    /*
     YOU MIGHT NEED TO CHANGE THIS LINE, IF YOU'RE HAVING PROBLEMS WITH MQTT MULTIPLE CONNECTIONS
     To change the ESP device ID, you will have to give a new name to the ESP8266.
     Here's how it looks:
       if (client.connect("ESP8266Client")) {
     You can do it like this:
       if (client.connect("ESP1_Office")) {
     Then, for the other ESP:
       if (client.connect("ESP2_Garage")) {
      That should solve your MQTT multiple connections problem
    */
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");  
      // Subscribe or resubscribe to a topic
      // You can subscribe to more topics (to control more LEDs in this example)
      client.subscribe("room/lamp");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

// The setup function sets your ESP GPIOs to Outputs, starts the serial communication at a baud rate of 115200
// Sets your mqtt broker and sets the callback function
// The callback function is what receives messages and actually controls the LEDs
void setup() {
  pinMode(lamp, OUTPUT);
  
  dht.begin();
  
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

}

// For this project, you don't need to change anything in the loop function. Basically it ensures that you ESP is connected to your broker
void loop() {

  if (!client.connected()) {
    reconnect();
  }
  if(!client.loop())
    client.connect("ESP8266Client");

  now = millis();
  // Publishes new temperature and humidity every 30 seconds
  if (now - lastMeasure > 30000) {
    lastMeasure = now;
    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
    float h = dht.readHumidity();
    // Read temperature as Celsius (the default)
    float t = dht.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    float f = dht.readTemperature(true);

    // Check if any reads failed and exit early (to try again).
    if (isnan(h) || isnan(t) || isnan(f)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }

    // Computes temperature values in Celsius
    float hic = dht.computeHeatIndex(t, h, false);
    static char temperatureTemp[7];
    dtostrf(hic, 6, 2, temperatureTemp);
    
    // Uncomment to compute temperature values in Fahrenheit 
    // float hif = dht.computeHeatIndex(f, h);
    // static char temperatureTemp[7];
    // dtostrf(hif, 6, 2, temperatureTemp);
    
    static char humidityTemp[7];
    dtostrf(h, 6, 2, humidityTemp);

    // Publishes Temperature and Humidity values
    client.publish("room/temperature", temperatureTemp);
    client.publish("room/humidity", humidityTemp);
    
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t Temperature: ");
    Serial.print(t);
    Serial.print(" *C ");
    Serial.print(f);
    Serial.print(" *F\t Heat index: ");
    Serial.print(hic);
    Serial.println(" *C ");
    // Serial.print(hif);
    // Serial.println(" *F");
  }

원시 코드보기

 

코드를 업로드 한 후 Node-RED 애플리케이션과 Mosquitto 브로커를 실행하는 Raspberry Pi를 사용하여 Arduino IDE 직렬 모니터를 115200의 전송 속도로 열고 실시간으로 무슨 일이 일어나는지 확인할 수 있습니다.

이는 ESP가 라우터 및 Mosquitto 브로커에 성공적으로 연결되었는지 확인하는 데 유용합니다. ESP가 수신하고 게시하는 메시지도 볼 수 있습니다.

회로 구축

다음 섹션에서는이 프로젝트의 회로를 구축하는 데 필요한 부품과 회로도를 보여줍니다.

필요한 부품

다음은 회로를 구축하는 데 필요한 부품입니다 ( Maker Advisor 에서 최적의 가격을 찾으려면 아래 링크를 클릭하십시오 ).

앞의 링크를 사용하거나 MakerAdvisor.com/tools 로 직접 이동 하여 프로젝트의 모든 부품을 최적의 가격으로 찾을 수 있습니다!

회로도

다음은이 프로젝트의 회로에 대한 회로도입니다.

데모

축하합니다! 이제 프로젝트가 완료되었습니다.

이동 에 http : // 당신의-PI-IP 주소는 / ▽를 노드-RED 응용 프로그램과 함께 ESP를 제어 할 수 있습니다. Pi와 동일한 네트워크의 모든 브라우저에서 애플리케이션에 액세스 할 수 있습니다 (아래 비디오 데모보기).

 

응용 프로그램은 아래 그림과 같아야합니다.

마무리

이 자습서에서는 Node-RED 및 MQTT 통신 프로토콜을 사용하여
ESP에서 조명을 켜고 센서를 모니터링 할 수있는 기본 개념을 보여주었습니다. 
다음 기본 단계에 따라 고급 프로젝트를 빌드 할 수 있습니다.

이 튜토리얼이 도움이 되셨기를 바랍니다.

 

[원문 : https://randomnerdtutorials.com/esp8266-and-node-red-with-mqtt/ ]

'Protocol > MQTT' 카테고리의 다른 글

MQTT 란 무억이고 작동원리는 어떠한가  (0) 2021.06.22

댓글