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

이 가이드는 두 개의 아두이노 나노 ESP32 장치 간에 TCP/IP를 통해 WiFi를 통한 연결을 설정하고 데이터를 교환하는 방법을 보여줍니다. 하나의 아두이노 나노 ESP32는 TCP 클라이언트로 기능하며 다른 하나는 TCP 서버로 작동합니다. 예를 들어 이 과정을 자세히 살펴봅시다:

communication between two ESP32

준비물

2×ESP-WROOM-32 Dev Module 쿠팡 | Amazon
2×Micro USB Cable Amazon
1×Push Button Amazon
1×LED Amazon
1×Breadboard 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Recommended) ESP32 Screw Terminal Adapter 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

두 Arduino Nano ESP32 간의 통신 - 개요

"Arduino Nano ESP32 #1"과 "Arduino Nano ESP32 #2" 사이의 통신을 가능하게 하는 다양한 방법이 있습니다. 방법의 선택은 그들 사이의 거리에 따라 달라집니다. 몇 가지 옵션으로는:

Methods Distance
SPI very short
I2C very short
UART (TTL) very short
UART (RS-232/485/422) short
Bluetooth short
LoRa long
WiFi unlimited(*)

※ NOTE THAT:

(*):

  • 두 개의 Arduino Nano ESP32 장치가 인터넷에 연결되어 있으면, 통신 거리는 제한이 없습니다.
  • 두 개의 Arduino Nano ESP32 장치가 인터넷에 연결되어 있지 않지만 동일한 LAN(Local Area Network)에 연결되어 있을 경우, 통신 거리는 LAN 네트워크 내로 제한됩니다.

이 튜토리얼은 두 개의 ESP32 사이의 통신을 위해 WiFi를 사용할 것입니다.

두 Arduino Nano ESP32 간의 WiFi를 통한 통신

다음 조건에서 두 개의 Arduino Nano ESP32 장치는 WiFi를 통해 통신을 수립할 수 있습니다:

  • 두 Arduino Nano ESP32 장치가 동일한 LAN(로컬 영역 네트워크) 내에 있으면 인터넷에 연결할 필요 없이 서로 통신할 수 있습니다.
  • 두 Arduino Nano ESP32 장치가 서로 다른 LAN 네트워크에 있을 경우, 통신을 원활하게 하기 위해 인터넷에 연결해야 합니다.

아두이노 나노 ESP32 장치 두 대 간 통신을 위한 두 가지 주요 방법이 있습니다:

직접 통신:

이 방법에서, 하나의 아두이노 나노 ESP32는 TCP 클라이언트로 작동하고 다른 하나는 TCP 서버로 사용됩니다. 그들은 WiFi를 통해 서로 직접 통신합니다.

중앙 집중 서버를 통한 간접적인 커뮤니케이션 (예: MQTT 서버):

아두이노 나노 ESP32 장치 둘 다 TCP 클라이언트로 작동하며 MQTT 서버와 같은 중앙 집중식 서버를 통해 간접적으로 통신합니다. 구현 세부 사항은 ESP32에서 아두이노 나노 ESP32로의 통신 via MQTT 튜토리얼을 참조하실 수 있습니다.

두 개의 Arduino Nano ESP32가 서로 통신하기 위해 사용하는 애플리케이션 프로토콜이 필요합니다. 예를 들어:

  • 자체 정의 프로토콜(TCP 기반) (직접 통신에 사용됨)
  • 모드버스 TCP (직접 통신에 사용됨)
  • HTTP (직접 통신에 사용됨)
  • 텔넷 (직접 통신에 사용됨)
  • SSH (직접 통신에 사용됨)
  • MQTT (서버를 통한 간접 통신에 사용됨)

예시 응용 프로그램

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

communication between two ESP32

단순화하기 위해, 우리가 정의한 프로토콜(우리가 만든 것이지, 표준이 아닌)을 사용할 것입니다.

자체 정의 프로토콜

다음과 같이 단순한 프로토콜을 정의합니다:

  • 아두이노 나노 ESP32 #1아두이노 나노 ESP32 #2 사이에 TCP 연결을 생성합니다.
  • 아두이노 나노 ESP32 #1:
    • TCP 클라이언트: 아두이노 나노 ESP32 #2에게 TCP 연결 요청을 적극적으로 합니다.
    • 스위치의 상태가 켜짐으로 변경되면, 아두이노 나노 ESP32 #1아두이노 나노 ESP32 #2에게 1의 값으로 바이트(명령)를 보냅니다.
    • 스위치의 상태가 꺼짐으로 변경되면, 아두이노 나노 ESP32 #1아두이노 나노 ESP32 #2에게 0의 값으로 바이트(명령)를 보냅니다.
  • 아두이노 나노 ESP32 #2:
    • TCP 서버: 아두이노 나노 ESP32 #1에서 온 TCP 연결 요청을 듣습니다. TCP 요청이 있으면, 이를 받아들이고 연결이 생성됩니다.
    • 바이트를 받으면:
      • 값이 1이면, LED를 켭니다.
      • 값이 0이면, LED를 끕니다.

      배선도

      Arduino Nano ESP32 #1을 위한 배선도: TCP 클라이언트 + 버튼/스위치

      Arduino Nano ESP32 Button Wiring Diagram

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

      아두이노 나노 ESP32 #2를 위한 배선도: TCP 서버 + LED

      Arduino Nano ESP32 LED Wiring Diagram

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

      ※ NOTE THAT:

      내장된 저항기가 없는 경우 LED에는 저항기를 사용해야 합니다. 버튼과 LED에 대한 전용 튜토리얼이 있습니다. 다음에서 더 자세한 내용을 알아볼 수 있습니다:

      Arduino Nano ESP32 용 코드 Arduino Nano ESP32 #1

      /* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/communication-between-two-arduino-nano-esp32 */ // ESP32: TCP CLIENT + 버튼/스위치 #include <ezButton.h> #include <WiFi.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* serverAddress = "192.168.0.180"; // ESP32#2의 IP 주소로 변경하세요 const int serverPort = 4080; ezButton button(BUTTON_PIN); // ezButton 생성 WiFiClient TCPclient; void setup() { Serial.begin(9600); button.setDebounceTime(50); // 디바운스 시간을 50 밀리세컨드로 설정 Serial.println("Arduino Nano ESP32 #1: TCP CLIENT + 버튼/스위치"); // Wi-Fi에 연결 WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("WiFi에 연결 중..."); } Serial.println("WiFi에 연결됨"); // TCP 서버에 연결(아두이노 #2) if (TCPclient.connect(serverAddress, serverPort)) { Serial.println("TCP 서버에 연결됨"); } else { Serial.println("TCP 서버에 연결 실패"); } } void loop() { button.loop(); // loop() 함수를 먼저 호출해야 함 if (!TCPclient.connected()) { Serial.println("연결이 끊김"); TCPclient.stop(); // TCP 서버에 재연결(아두이노 #2) if (TCPclient.connect(serverAddress, serverPort)) { Serial.println("TCP 서버에 재연결됨"); } else { Serial.println("TCP 서버에 재연결 실패"); } } if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush(); Serial.println("- 버튼이 눌려짐, 전송된 명령: 1"); } if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush(); Serial.println("- 버튼이 놓여짐, 전송된 명령: 0"); } }

      아두이노 나노 ESP32 코드 아두이노 나노 ESP32 #2

      /* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/communication-between-two-arduino-nano-esp32 */ // ESP32 #2: TCP 서버 + LED #include <WiFi.h> #define LED_PIN D5 // 아두이노 나노 ESP32 핀이 LED에 연결된 핀 #define SERVER_PORT 4080 const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // WIFI SSID로 변경하세요 const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // WIFI 비밀번호로 변경하세요 WiFiServer TCPserver(SERVER_PORT); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("Arduino Nano ESP32 #2: TCP 서버 + LED"); // Wi-Fi에 연결 WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("WiFi에 연결 중..."); } Serial.println("WiFi에 연결됨"); // 로컬 IP 주소 출력: Serial.print("ESP32 #2: TCP 서버 IP 주소: "); Serial.println(WiFi.localIP()); Serial.println("ESP32 #2: -> ESP32 #1 코드에서 serverAddress를 업데이트하세요"); // TCP 클라이언트 (ESP32 #1로부터) 수신 대기 시작 TCPserver.begin(); } void loop() { // ESP32 #1로부터 TCP 클라이언트 대기: WiFiClient client = TCPserver.available(); if (client) { // TCP 클라이언트로부터 명령어 읽기: char command = client.read(); Serial.print("ESP32 #2: - 받은 명령어: "); Serial.println(command); if (command == '1') digitalWrite(LED_PIN, HIGH); // LED 켜기 else if (command == '0') digitalWrite(LED_PIN, LOW); // LED 끄기 client.stop(); } }

      사용 방법

      • 만약 이번이 처음으로 ESP32를 사용하는 경우, Arduino Nano ESP32용 환경 설정 방법을 참조하세요.
      • 버튼/스위치를 Arduino Nano ESP32 #1에 연결하세요
      • LED를 Arduino Nano ESP32 #2에 연결하세요
      • Arduino IDE를 엽니다 (Arduino IDE #1이라고 함)
      • Arduino IDE에 ezButton 라이브러리를 설치하세요
      • USB 케이블을 이용해 Arduino Nano ESP32 #1을 PC에 연결하고 Arduino IDE #1에서 Arduino Nano ESP32 #1의 COM 포트를 선택하세요
      • PC에서 Arduino IDE 아이콘을 클릭하여 다른 Arduino IDE 창을 엽니다 (Arduino IDE #2라고 함, 중요!(**))
      • USB 케이블을 이용해 Arduino Nano ESP32 #2을 PC에 연결하고 Arduino IDE #2에서 Arduino Nano ESP32 #2의 COM 포트를 선택하세요
      • Arduino Nano ESP32 #1 코드를 복사하여 Arduino IDE #1에 붙여넣고 저장하세요 (이름은 ESP321로 함)
      • Arduino Nano ESP32 #2 코드를 복사하여 Arduino IDE #2에 붙여넣고 저장하세요 (이름은 ESP322로 함)
      • 먼저 Arduino Nano ESP32 #2 코드를 Arduino Nano ESP32 #2에 업로드하세요
      • Arduino IDE #2에서 시리얼 모니터를 열고 TCP 서버 IP 주소를 얻으세요
      COM6
      Send
      Arduino Nano ESP32 #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in Arduino Nano ESP32 #1 code
      Autoscroll Show timestamp
      Clear output
      9600 baud  
      Newline  
      • 아두이노 나노 ESP32 #1 코드에서 TCP 서버 IP 주소 업데이트하기
      • 아두이노 나노 ESP32 #1 코드를 아두이노 나노 ESP32 #1에 업로드하기
      • 아두이노 IDE #1에서 시리얼 모니터 열기
      • 아두이노 나노 ESP32 #1에 있는 버튼을 누르고 있기 → 아두이노 나노 ESP32 #2의 LED 상태 확인하기 (켜짐)
      • 아두이노 나노 ESP32 #1의 버튼을 놓기 → 아두이노 나노 ESP32 #2의 LED 상태 확인하기 (꺼짐)
      • 위 과정을 여러 번 반복하기.
      • 두 시리얼 모니터의 출력 확인하기
        • 아두이노 나노 ESP32 #1의 시리얼 모니터
        COM6
        Send
        Arduino Nano ESP32 #1: TCP CLIENT + A BUTTON/SWITCH Arduino Nano ESP32 #1: Connected to TCP server Arduino Nano ESP32 #1: - The button is pressed, sent command: 1 Arduino Nano ESP32 #1: - The button is released, sent command: 0 Arduino Nano ESP32 #1: - The button is pressed, sent command: 1 Arduino Nano ESP32 #1: - The button is released, sent command: 0 Arduino Nano ESP32 #1: - The button is pressed, sent command: 1 Arduino Nano ESP32 #1: - The button is released, sent command: 0
        Autoscroll Show timestamp
        Clear output
        9600 baud  
        Newline  

        아두이노 나노 ESP32 #2의 시리얼 모니터

        COM6
        Send
        Arduino Nano ESP32 #2: TCP SERVER + AN LED Arduino Nano ESP32 #2: TCP Server IP address: 192.168.0.2 Arduino Nano ESP32 #2: -> Please update the serverAddress in Arduino Nano ESP32 #1 code Arduino Nano ESP32 #2: - Received command: 1 Arduino Nano ESP32 #2: - Received command: 0 Arduino Nano ESP32 #2: - Received command: 1 Arduino Nano ESP32 #2: - Received command: 0 Arduino Nano ESP32 #2: - Received command: 1 Arduino Nano ESP32 #2: - Received command: 0
        Autoscroll Show timestamp
        Clear output
        9600 baud  
        Newline  

        ※ NOTE THAT:

        • (**): "파일" → "새로 만들기" 또는 "열기"를 통해 Arduino IDE #2 창에서 Arduino IDE #2 창을 열 경우, 동일한 PC에서 두 개의 Arduino Nano ESP32에 대해 두 개의 시리얼 모니터를 동시에 열 수 없습니다.
        • 이 자체 정의된 프로토콜에는 대안이 있습니다. 그것은 Modbus TCP입니다. Modbus 프로토콜은 표준화되었으며, 자체 정의된 프로토콜에 비해 많은 장점이 있습니다. Arduino Nano ESP32 - Modbus 튜토리얼에서 더 보십시오.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

인터넷을 통해 두 개의 Arduino Nano ESP32 연결 방법

인터넷을 통해 두 장치를 연결하는 방법을 보세요

※ 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!