두 ESP32 간의 통신 | Communication between two ESP32

이 튜토리얼은 WiFi를 통해 TCP/IP로 두 ESP32 간의 연결을 생성하고 데이터를 교환하는 방법을 알려줍니다. 하나의 ESP32는 TCP 클라이언트로 작동하고 다른 하나는 TCP 서버로 작동합니다. 또한 예를 들어 상세하게 배웁니다:

communication between two ESP32

준비물

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

두 ESP32 간의 통신 - 개요

ESP32 #1ESP32 #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:

(*):

  • 우리가 두 ESP32를 인터넷에 연결하면, 통신 거리는 무제한입니다
  • 우리가 두 ESP32를 인터넷에 연결하지 않고, 같은 LAN 네트워크에 연결한다면, 통신 거리는 LAN 네트워크 내에서 제한됩니다

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

두 ESP32 간의 WiFi를 통한 통신

두 ESP32는 다음 조건이 충족되면 WiFi를 통해 서로 통신할 수 있습니다:

  • 같은 LAN 네트워크에 있는 두 개의 ESP32. 인터넷에 연결할 필요가 없습니다.
  • 다른 LAN 네트워크에 있는 두 개의 ESP32. 인터넷에 연결해야 합니다.

두 ESP32가 서로 통신할 수 있는 방법은 두 가지가 있습니다.

  • 두 ESP32가 서로 직접 통신합니다: 한 ESP32는 TCP 클라이언트이고, 다른 하나는 TCP 서버입니다.
  • 중앙 집중식 서버(예: MQTT 서버)를 통해 두 ESP32가 서로 간접적으로 통신합니다: 두 ESP32 모두 TCP 클라이언트입니다. ESP32 간 MQTT를 통한 통신 튜토리얼을 참조하세요.

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

  • 자체 정의 프로토콜을 통한 원시 TCP (직접적으로)
  • Modbus TCP (직접적으로)
  • HTTP (직접적으로)
  • Telnet (직접적으로)
  • SSH (직접적으로)
  • MQTT (서버를 통한 간접적으로)

※ NOTE THAT:

이 튜토리얼에서는 UDP 프로토콜을 다루지 않습니다.

예시 응용 프로그램

다음 응용 프로그램을 실현해 봅시다: ESP32 #1에 연결된 버튼/스위치가 WiFi를 통해 ESP32 #2에 연결된 LED를 제어합니다.

communication between two ESP32

간단히 말해서, 이 튜토리얼은 자체 정의된 프로토콜(우리가 정의한, 표준 없음)을 사용할 것입니다.

자체 정의 프로토콜

우리는 다음과 같이 간단한 프로토콜을 정의합니다:

ESP32 #1ESP32 #2 사이에 TCP 연결을 생성하세요.

  • ESP32 #1:
    • TCP 클라이언트: ESP32 #2에 TCP 연결 요청을 주도적으로 합니다.
    • 스위치의 상태가 ON으로 변경되면, ESP32 #1ESP32 #2에 값이 1인 바이트(명령)를 보냅니다.
    • 스위치의 상태가 OFF로 변경되면, ESP32 #1ESP32 #2에 값이 0인 바이트(명령)를 보냅니다.
  • ESP32 #2:
    • TCP 서버: ESP32 #1으로부터의 TCP 연결 요청을 청취합니다. TCP 요청이 있으면 이를 받아들여 연결을 생성합니다.
    • 바이트를 받으면:
      • 값이 1이면, LED를 켭니다.
      • 값이 0이면, LED를 끕니다.

      배선도

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

      ESP32 Button Wiring Diagram

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

      ESP32 및 다른 구성 요소에 전원을 공급하는 방법에 대해 잘 알지 못하는 경우, 다음 튜토리얼에서 안내를 찾을 수 있습니다: ESP32 전원 공급 방법.

      ESP32 #2를 위한 배선도: TCP 서버 + LED

      ESP32 LED Wiring Diagram

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

      ※ NOTE THAT:

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

      ESP32 코드 ESP32 #1

      /* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/communication-between-two-esp32 */ // ESP32: TCP 클라이언트 + 버튼/스위치 #include <ezButton.h> #include <WiFi.h> #define BUTTON_PIN 21 // ESP32의 GPIO21 핀을 버튼에 연결 const char* ssid = "YOUR_WIFI_SSID"; // 와이파이 SSID로 변경하세요 const char* password = "YOUR_WIFI_PASSWORD"; // 와이파이 비밀번호로 변경하세요 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("ESP32: TCP 클라이언트 + 버튼/스위치"); // Wi-Fi에 연결 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Wi-Fi에 연결 중..."); } Serial.println("Wi-Fi에 연결됨"); // 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

      /* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32/communication-between-two-esp32 */ // ESP32 #2: TCP 서버 + LED 하나 #include <WiFi.h> #define LED_PIN 18 // ESP32의 GPIO18 핀이 LED에 연결됨 #define SERVER_PORT 4080 const char* ssid = "YOUR_WIFI_SSID"; // 여러분의 와이파이 SSID로 변경하세요 const char* password = "YOUR_WIFI_PASSWORD"; // 여러분의 와이파이 암호로 변경하세요 WiFiServer TCPserver(SERVER_PORT); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP32 #2: TCP 서버 + LED 하나"); // 와이파이에 연결 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("와이파이에 연결 중..."); } Serial.println("와이파이에 연결됨"); // 로컬 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 IDE에서 ESP32 환경 설정 방법을 참조하세요.
      • 버튼/스위치를 ESP32 #1에 연결하세요
      • LED를 ESP32 #2에 연결하세요
      • Arduino IDE (Arduino IDE #1로 불림)를 열어주세요
      • Arduino IDE에서 ezButton 라이브러리를 설치하세요
      • USB 케이블을 통해 ESP32 #1을 PC에 연결하고 Arduino IDE #1에서 ESP32 #1의 COM 포트를 선택하세요
      • PC 상에서 Arduino IDE 아이콘을 클릭하는 것으로 (중요!(**)) 또 다른 Arduino IDE 창을 열어주세요 (Arduino IDE #2로 불림)
      • USB 케이블을 통해 ESP32 #2를 PC에 연결하고 Arduino IDE #2에서 ESP32 #2의 COM 포트를 선택하세요
      • ESP32 #1 코드를 복사해서 Arduino IDE #1에 붙여넣고 저장하세요 (이름: ESP321)
      • ESP32 #2 코드를 복사해서 Arduino IDE #2에 붙여넣고 저장하세요 (이름: ESP322)
      • 먼저 ESP32 #2 코드를 ESP32 #2에 업로드하세요
      • Arduino IDE #2에서 시리얼 모니터를 열고, TCP 서버 IP 주소를 얻어내세요
      COM6
      Send
      ESP32 #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in ESP32 #1 code
      Autoscroll Show timestamp
      Clear output
      9600 baud  
      Newline  
      • ESP32 #1 코드에서 TCP 서버 IP 주소를 업데이트 하세요
      • ESP32 #1 코드를 ESP32 #1에 업로드하세요
      • Arduino IDE #1에서 시리얼 모니터를 열어주세요
      • ESP32 #1에 있는 버튼을 누르고 있으면 → ESP32 #2의 LED 상태를 확인하세요 (켜짐)
      • ESP32 #1에 있는 버튼을 놓으면 → ESP32 #2의 LED 상태를 확인하세요 (꺼짐)
      • 위 과정을 여러 번 반복하세요.
      • 두 시리얼 모니터에서 출력을 확인하세요
        • ESP32 #1의 시리얼 모니터
        COM6
        Send
        ESP32 #1: TCP CLIENT + A BUTTON/SWITCH ESP32 #1: Connected to TCP server ESP32 #1: - The button is pressed, sent command: 1 ESP32 #1: - The button is released, sent command: 0 ESP32 #1: - The button is pressed, sent command: 1 ESP32 #1: - The button is released, sent command: 0 ESP32 #1: - The button is pressed, sent command: 1 ESP32 #1: - The button is released, sent command: 0
        Autoscroll Show timestamp
        Clear output
        9600 baud  
        Newline  

        ESP32 #2의 시리얼 모니터

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

        ※ NOTE THAT:

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

동영상

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

인터넷을 통해 두 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!