두 아두이노 나노 ESP32 간의 MQTT를 통한 통신 | Communication between two Arduino Nano ESP32 via MQTT

이 튜토리얼에서는 다음을 다룰 예정입니다:

communication between two arduino via MQTT

준비물

2×Arduino Nano ESP32 Amazon
2×USB Cable Type-C 쿠팡 | Amazon
1×Push Button 쿠팡 | Amazon
1×(Optional) Panel-mount Push Button Amazon
1×LED Amazon
1×220 ohm resistor Amazon
1×Breadboard 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Recommended) Screw Terminal Expansion Board for Arduino Nano 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

아두이노 나노 ESP32와 MQTT에 대하여

우리는 여기에서 MQTT와 함께 아두이노 나노 ESP32를 사용하는 방법에 대한 자세한 튜토리얼을 가지고 있습니다:

아두이노 나노 ESP32 - MQTT(BASE_URL/tutorials/arduino-nano-esp32/arduino-nano-esp32-mqtt)

두 개의 아두이노 나노 ESP32 간의 MQTT를 통한 통신

두 개의 Arduino Nano ESP32 보드는 MQTT 서버를 사용하여 서로 통신할 수 있습니다. MQTT 서버를 사용하지 않고 직접 통신하길 원한다면, [Arduino Nano ESP32에서 Arduino Nano ESP32까지 TCP 클라이언트/서버 통신]에 관한 튜토리얼을 참조하십시오(BASE_URL/tutorials/arduino-nano-esp32/communication-between-two-arduino-nano-esp32).

Arduino Nano ESP32 #1Arduino Nano ESP32 #2가 MQTT 브로커를 통해 데이터를 교환할 때:

  • 두 개의 아두이노 나노 ESP32가 MQTT 브로커에 연결합니다.
  • 아두이노 나노 ESP32 #2아두이노 나노 ESP32 #1에 데이터를 보내기 위해서는:
    • 아두이노 나노 ESP32 #1이 토픽을 구독합니다. 예를 들어: arduino-nano-esp32-1/data.
    • 아두이노 나노 ESP32 #2아두이노 나노 ESP32 #1이 구독한 토픽에 데이터를 발행함으로써 아두이노 나노 ESP32 #1에게 데이터를 보낼 수 있습니다.
  • 마찬가지로, 아두이노 나노 ESP32 #1아두이노 나노 ESP32 #2에게 데이터를 보내기 위해서는:
    • 아두이노 나노 ESP32 #2가 토픽을 구독합니다. 예를 들어: arduino-nano-esp32-2/data.
    • 아두이노 나노 ESP32 #1아두이노 나노 ESP32 #2가 구독한 토픽에 데이터를 발행함으로써 아두이노 나노 ESP32 #2에게 데이터를 보낼 수 있습니다.

    이 방법에 따르면, 두 아두이노 나노 ESP32가 데이터를 양방향으로 교환할 수 있습니다.

예시 사용 사례

다음 애플리케이션을 실현해 봅시다: 아두이노 나노 ESP32 #1에 연결된 버튼/스위치가 MQTT를 통해 아두이노 나노 ESP32 #2에 연결된 LED를 제어합니다.

communication between two arduino

위에서 언급한 바와 같이, 우리가 사용할 수 있는 몇 가지 응용 프로그램 프로토콜이 있습니다. 이 예에서는 간단하게 하기 위해, 우리 스스로 프로토콜을 정의할 것입니다(자체 정의 프로토콜).

작동 원리

간단한 프로토콜을 설정합시다:

Arduino Nano ESP32 #1Arduino Nano ESP32 #2는 MQTT 브로커( MQTT 서버)에 연결합니다.

  • Arduino Nano ESP32 #1에 대해:
    • Arduino Nano ESP32 #1은 스위치의 상태가 변경될 때마다 특정 주제(topic)에 MQTT 메시지를 보냅니다.
    • 버튼이나 스위치가 켜질 때, MQTT 메시지 페이로드는 1로 설정됩니다.
    • 버튼이나 스위치가 꺼질 때, MQTT 메시지 페이로드는 0으로 설정됩니다.
  • Arduino Nano ESP32 #2에 대해:
    • Arduino Nano ESP32 #2은 주제(topic)를 구독합니다.
    • Arduino Nano ESP32 #2가 페이로드가 1인 MQTT 메시지를 받으면 LED를 켭니다.
    • Arduino Nano ESP32 #2가 페이로드가 0인 MQTT 메시지를 받으면 LED를 끕니다.

    배선도

    아두이노 나노 ESP32 #1 - 아두이노 나노 ESP32와 버튼 간의 배선도

    Arduino Nano ESP32 Button Wiring Diagram

    이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

    • Arduino Nano ESP32 #2 - 아두이노 나노 ESP32와 LED 사이의 연결도
    Arduino Nano ESP32 LED Wiring Diagram

    이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

두 개의 Arduino Nano ESP32 간의 MQTT를 통한 통신

아두이노 나노 ESP32 코드 #1

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/communication-between-two-arduino-nano-esp32-via-mqtt */ // ESP32 #1: 버튼/스위치에 연결, MQTT 발행자로 동작 #include <WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN D2 // 아두이노 나노 ESP32 핀이 버튼에 연결됨 const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // WIFI SSID로 변경하세요 const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // WIFI 비밀번호로 변경하세요 const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // MQTT 브로커의 주소로 변경하세요 //const char MQTT_BROKER_ADRRESS[] = "192.168.0.5"; // MQTT 브로커의 IP 주소로 변경하세요 const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp32-001"; // 원하는 대로 변경하세요 const char MQTT_USERNAME[] = ""; // 필요하다면 변경하세요, 필요 없으면 비워두세요 const char MQTT_PASSWORD[] = ""; // 필요하다면 변경하세요, 필요 없으면 비워두세요 // ESP32가 발행/구독해야 하는 MQTT 토픽 const char MQTT_TOPIC[] = "esp32/command"; // 원하는 대로 변경하세요 WiFiClient network; MQTTClient mqtt = MQTTClient(256); ezButton button(BUTTON_PIN); // 핀 7에 연결된 ezButton 생성 void setup() { Serial.begin(9600); button.setDebounceTime(100); // 디바운스 시간을 100밀리초로 설정 Serial.println("Arduino Nano ESP32 #1: 버튼/스위치에 연결, MQTT 발행자로 동작"); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("Arduino Nano ESP32 - Wi-Fi에 연결 중"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); connectToMQTT(); } void loop() { mqtt.loop(); button.loop(); // loop() 함수를 먼저 호출해야 함 if (button.isPressed()) { Serial.println("- 버튼이 눌렸습니다, 명령 보내기: 1"); sendToMQTT('1'); } if (button.isReleased()) { Serial.println("- 버튼이 놓였습니다, 명령 보내기: 0"); sendToMQTT('0'); } } void connectToMQTT() { // MQTT 브로커에 연결 mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); Serial.print("Arduino Nano ESP32 - MQTT 브로커에 연결 중"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("Arduino Nano ESP32 - MQTT 브로커 연결 시간 초과!"); return; } Serial.println("Arduino Nano ESP32 - MQTT 브로커에 연결됨!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("Arduino Nano ESP32 - MQTT에 보냈습니다:"); Serial.print("- 토픽: "); Serial.println(MQTT_TOPIC); Serial.print("- 페이로드:"); Serial.println(messageBuffer); }

아두이노 나노 ESP32 코드 #2

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/communication-between-two-arduino-nano-esp32-via-mqtt */ // ESP32 #2: LED에 연결되어 MQTT 구독자로 동작합니다. #include <WiFi.h> #include <MQTTClient.h> #define LED_PIN D5 // The Arduino Nano ESP32 pin connected to LED const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS //const char MQTT_BROKER_ADRRESS[] = "192.168.0.5"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp32-002"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP32 should publish/subscribe const char MQTT_TOPIC[] = "esp32/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("Arduino Nano ESP32 #2: LED에 연결되어 MQTT 구독자로 동작합니다."); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("Arduino Nano ESP32 - Wi-Fi에 연결 중"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); connectToMQTT(); } void loop() { mqtt.loop(); } void connectToMQTT() { // MQTT 브로커에 연결합니다. mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // 들어오는 메시지를 처리할 핸들러를 생성합니다. mqtt.onMessage(messageReceived); Serial.print("Arduino Nano ESP32 - MQTT 브로커에 연결 중"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("Arduino Nano ESP32 - MQTT 브로커 연결 시간 초과!"); return; } // 주제를 구독하고, 들어오는 메시지는 messageReceived() 함수에서 처리됩니다. if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("Arduino Nano ESP32 - 주제를 구독했습니다: "); else Serial.print("Arduino Nano ESP32 - 주제 구독에 실패했습니다: "); Serial.println(MQTT_TOPIC); Serial.println("Arduino Nano ESP32 - MQTT 브로커에 연결되었습니다!"); } void messageReceived(String &topic, String &payload) { Serial.println("Arduino Nano ESP32 - MQTT에서 메시지를 받았습니다:"); Serial.println("- topic: " + topic); Serial.print("- payload: "); Serial.println(payload); char command = payload[0]; if (command == '1') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => LED를 켭니다."); digitalWrite(LED_PIN, HIGH); // Turn LED on } else if (command == '0') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => LED를 끕니다."); digitalWrite(LED_PIN, LOW); // Turn LED off } else { Serial.print("- 받은 명령어를 지원하지 않습니다: "); Serial.println(command); } }

사용 방법

Arduino Nano ESP32를 시작하려면 다음 단계를 따르세요:

  • Arduino Nano ESP32에 익숙하지 않다면, Arduino IDE에서 Arduino Nano ESP32 환경을 설정하는 방법에 대한 튜토리얼을 참조하세요. BASE_URL/tutorials/arduino-nano-esp32/arduino-nano-esp32-software-installation
  • 제공된 다이어그램에 따라 구성 요소를 연결하세요.
  • USB 케이블을 사용하여 Arduino Nano ESP32 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 Arduino IDE를 실행하세요.
  • Arduino Nano ESP32 보드와 해당하는 COM 포트를 선택하세요.
  • 버튼/스위치를 Arduino Nano ESP32 #1에 연결하세요.
  • LED를 Arduino Nano ESP32 #2에 연결하세요.
  • Arduino IDE(이를 Arduino IDE #1이라고 합니다)를 열어주세요.
  • PC에서 Arduino IDE 아이콘을 클릭하여 또 다른 Arduino IDE 창을 엽니다(이를 Arduino IDE #2라고 합니다)(중요!(**))
  • Arduino IDE의 왼쪽 탐색 바에 있는 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다.
  • 검색 상자에 MQTT를 입력한 다음, Joel Gaehwiler가 개발한 MQTT 라이브러리를 찾아보세요.
  • MQTT 라이브러리를 설치하려면 Install 버튼을 클릭하세요.
Arduino Nano ESP32 MQTT library

검색 상자에 ezButton을 입력한 다음, Arduino Nano ESP32GetStarted의 버튼 라이브러리를 찾으세요.

ezButton 라이브러리를 설치하려면 Install 버튼을 클릭하세요.

Arduino Nano ESP32 button library
  • 아두이노 나노 ESP32 #1을 USB 케이블을 통해 PC에 연결하고 아두이노 IDE #1에서 아두이노 나노 ESP32 #1의 COM 포트를 선택하세요.
  • 아두이노 나노 ESP32 #2을 USB 케이블을 통해 PC에 연결하고 아두이노 IDE #2에서 아두이노 나노 ESP32 #2의 COM 포트를 선택하세요.
  • 아두이노 나노 ESP32 #1 코드를 복사하여 아두이노 IDE #1에 붙여넣고 저장하세요(이름은 아두이노 나노 ESP32-1으로 지정).
  • 아두이노 나노 ESP32 #2 코드를 복사하여 아두이노 IDE #2에 붙여넣고 저장하세요(이름은 아두이노 나노 ESP32-2으로 지정).
  • 두 코드의 WiFi 정보(SSID와 비밀번호)를 자신의 것으로 교체하세요.
  • 두 코드의 MQTT 브로커 주소(도메인 이름 또는 IP 주소)를 교체하세요.
  • 아두이노 나노 ESP32 #1 코드를 아두이노 나노 ESP32 #1에 업로드하세요.
  • 아두이노 나노 ESP32 #2 코드를 아두이노 나노 ESP32 #2에 업로드하세요.
  • 아두이노 IDE #1에서 시리얼 모니터를 열세요.
  • 아두이노 IDE #2에서 시리얼 모니터를 열세요.
  • 아두이노 나노 ESP32 #1의 버튼을 누르고 있으면 → 아두이노 나노 ESP32 #2의 LED 상태를 확인하세요(켜짐).
  • 아두이노 나노 ESP32 #1의 버튼을 놓으면 → 아두이노 나노 ESP32 #2의 LED 상태를 확인하세요(꺼짐).
  • 버튼을 여러 번 누르고, 누른 상태로 잡고, 놓으세요.
  • 두 시리얼 모니터의 출력을 확인하세요.
    • 아두이노 나노 ESP32 #1의 시리얼 모니터
    COM6
    Send
    Arduino Nano ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER Arduino Nano ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID Arduino Nano ESP32 - Connecting to MQTT broker Arduino Nano ESP32 - MQTT broker Connected! - The button is pressed, send command: 1 Arduino Nano ESP32 - sent to MQTT: - topic: arduino/command - payload:1 - The button is released, send command: 0 Arduino Nano ESP32 - sent to MQTT: - topic: arduino/command - payload:0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • 아두이노 나노 ESP32 #2의 시리얼 모니터
    COM6
    Send
    Arduino Nano ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER Arduino Nano ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID Arduino Nano ESP32 - Connecting to MQTT broker Arduino Nano ESP32 - Subscribed to the topic: arduino/command Arduino Nano ESP32 - MQTT broker Connected! Arduino Nano ESP32 - received from MQTT: - topic: arduino/command - payload: 1 - Received command: 1 => Turned LED on Arduino Nano ESP32 - received from MQTT: - topic: arduino/command - payload: 0 - Received command: 0 => Turned LED off
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!