두 ESP32 간의 통신 | Communication between two ESP32
이 튜토리얼은 WiFi를 통해 TCP/IP로 두 ESP32 간의 연결을 생성하고 데이터를 교환하는 방법을 알려줍니다. 하나의 ESP32는 TCP 클라이언트로 작동하고 다른 하나는 TCP 서버로 작동합니다. 또한 예를 들어 상세하게 배웁니다:
- ESP32 #1은 버튼에 연결되어 TCP 클라이언트로 작동합니다.
- ESP32 #2는 LED에 연결되어 TCP 서버로 작동합니다.
- 두 ESP32는 인터넷을 통해 서로 연결됩니다.
- ESP32 #1의 버튼이 눌리면, ESP32 #2의 LED가 켜집니다.
준비물
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) Screw Terminal Expansion Board for ESP32 | 쿠팡 | Amazon |
두 ESP32 간의 통신 - 개요
ESP32 #1이 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:
(*):
- 우리가 두 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를 제어합니다.
간단히 말해서, 이 튜토리얼은 자체 정의된 프로토콜(우리가 정의한, 표준 없음)을 사용할 것입니다.
자체 정의 프로토콜
우리는 다음과 같이 간단한 프로토콜을 정의합니다:
ESP32 #1과 ESP32 #2 사이에 TCP 연결을 생성하세요.
- ESP32 #1:
- TCP 클라이언트: ESP32 #2에 TCP 연결 요청을 주도적으로 합니다.
- 스위치의 상태가 ON으로 변경되면, ESP32 #1은 ESP32 #2에 값이 1인 바이트(명령)를 보냅니다.
- 스위치의 상태가 OFF로 변경되면, ESP32 #1은 ESP32 #2에 값이 0인 바이트(명령)를 보냅니다.
- ESP32 #2:
- TCP 서버: ESP32 #1으로부터의 TCP 연결 요청을 청취합니다. TCP 요청이 있으면 이를 받아들여 연결을 생성합니다.
- 바이트를 받으면:
- 값이 1이면, LED를 켭니다.
- 값이 0이면, LED를 끕니다.
- ESP32 - LED 튜토리얼
- ESP32 - Button 튜토리얼
- 만약 이것이 처음 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 주소를 얻어내세요
- ESP32 #1 코드에서 TCP 서버 IP 주소를 업데이트 하세요
- ESP32 #1 코드를 ESP32 #1에 업로드하세요
- Arduino IDE #1에서 시리얼 모니터를 열어주세요
- ESP32 #1에 있는 버튼을 누르고 있으면 → ESP32 #2의 LED 상태를 확인하세요 (켜짐)
- ESP32 #1에 있는 버튼을 놓으면 → ESP32 #2의 LED 상태를 확인하세요 (꺼짐)
- 위 과정을 여러 번 반복하세요.
- 두 시리얼 모니터에서 출력을 확인하세요
- ESP32 #1의 시리얼 모니터
- (**): "파일" → "새로 만들기" 또는 "열기"를 통해 Arduino IDE #2 창에서 또 다른 Arduino IDE #2 창을 열 경우, 같은 PC에서 두 개의 ESP32에 대해 두 개의 직렬 모니터를 동시에 열 수 없습니다.
- 이 자체 정의 프로토콜에 대한 대안이 있습니다. 바로 Modbus TCP입니다. Modbus 프로토콜은 표준화되어 있으며 자체 정의 프로토콜에 비해 많은 장점이 있습니다. ESP32 - Modbus 튜토리얼에서 자세히 알아보세요.
배선도
ESP32 #1을 위한 배선도: TCP 클라이언트 + 버튼/스위치
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
ESP32 및 다른 구성 요소에 전원을 공급하는 방법에 대해 잘 알지 못하는 경우, 다음 튜토리얼에서 안내를 찾을 수 있습니다: ESP32 전원 공급 방법.
ESP32 #2를 위한 배선도: TCP 서버 + LED
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
※ NOTE THAT:
LED에 내장 저항이 없는 경우 저항을 사용해야 합니다. 버튼과 LED에 대한 전용 튜토리얼이 있습니다. 다음에서 자세히 알아볼 수 있습니다:
ESP32 코드 ESP32 #1
ESP32 코드 ESP32 #2
사용 방법
ESP32 #2의 시리얼 모니터
※ NOTE THAT:
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
인터넷을 통해 두 ESP32를 연결하는 방법
인터넷을 통해 두 장치를 연결하는 방법을 참고하세요.