두 ESP8266 간의 통신 | Communication between two ESP8266
이 가이드는 두 대의 ESP8266 장치를 WiFi를 통해 TCP/IP로 연결하고 데이터를 교환하는 방법을 보여줍니다. 한 대의 ESP8266은 TCP 클라이언트로 작동하며, 다른 하나는 TCP 서버로 작동할 것입니다. 이 과정을 예를 들어 자세히 살펴보겠습니다:
- ESP8266 #1은 버튼에 연결되어 TCP 클라이언트로 작동합니다.
- ESP8266 #2는 LED에 연결되어 TCP 서버로 기능합니다.
- 두 ESP8266 장치는 인터넷을 통해 서로 연결됩니다.
- ESP8266 #1의 버튼이 눌리면 ESP8266 #2의 LED가 켜지도록 트리거됩니다.
준비물
2 | × | ESP8266 NodeMCU | Amazon | |
2 | × | Micro USB Cable | Amazon | |
1 | × | (Optional) Screw Terminal Expansion Board for ESP8266 | 쿠팡 | Amazon |
두 ESP8266 간의 통신 - 개요
구체적인 예를 생각해 보겠습니다: ESP8266 #1이 ESP8266 #2와 상호 작용합니다. 두 ESP8266 간의 통신을 가능하게 하는 여러 방법이 있습니다. 통신 거리에 따라 그 중 하나를 선택할 수 있습니다. 아래 표는 몇 가지 방법과 해당 통신 범위를 보여줍니다.
Methods | Range |
---|---|
I2C | very short |
SPI | very short |
UART (TTL) | very short |
UART (RS-232/485/422) | short |
Bluetooth | short |
LoRa | long |
Ethernet/WiFi | unlimited(*) |
※ NOTE THAT:
- 두 ESP8266이 인터넷에 연결되어 있으면 통신 범위에 제한이 없습니다.
- 하지만 두 ESP8266이 인터넷에 연결되지 않고 동일한 LAN 네트워크에 연결된 경우, 그들의 통신 범위는 해당 로컬 영역 네트워크에 제한됩니다.
위에서 언급한 방법들 중에서, 이 튜토리얼은 두 ESP8266 사이의 소통에 WiFi를 사용합니다. 이것은 제한 없는 소통 범위를 가능하게 합니다.
두 ESP8266 간의 로컬 LAN 또는 인터넷을 통한 통신
ESP8266 두 개는 다음과 같은 경우 WiFi를 통해 서로 통신할 수 있습니다:
- 그들은 같은 로컬 영역 네트워크(LAN)에 있으며 인터넷 연결이 필요하지 않습니다.
- 그들은 다른 LAN에 있으며 인터넷 연결이 필요합니다.
두 개의 ESP8266이 로컬 LAN 네트워크 내에서 연결되었든 인터넷을 통해 연결되었든, 통신 방법은 두 가지가 있습니다:
- 두 ESP8266 사이에서 직접
- 중앙 집중식 서버를 통해(예: MQTT 서버). 두 ESP8266 사이의 MQTT를 통한 통신을 참조하세요.
직접 통신에 있어서, 일반적으로 한 ESP8266이 TCP 클라이언트이고 다른 하나는 TCP 서버입니다.
통신을 위해 중앙 집중식 서버를 사용하는 경우, 일반적으로 두 ESP8266 모두 TCP 클라이언트로 작동합니다.
두 ESP8266 사이의 통신에 사용할 애플리케이션 프로토콜을 결정할 때, 선택할 수 있는 여러 옵션이 있습니다:
- 원시 TCP 상의 자체 정의 프로토콜
- 모드버스 TCP
- HTTP
- Telnet
- SSH
- MQTT (중앙 집중식 서버가 필요함)
예시 응용 프로그램
다음 프로그램을 현실로 만들어 봅시다: ESP8266 #1에 부착된 버튼/스위치를 사용하여 WiFi를 통해 ESP8266 #2에 연결된 LED를 켜고 끌 수 있습니다.
앞서 언급한 바와 같이, 몇 가지 응용 프로그램 프로토콜이 있습니다. 이 예시를 단순화하기 위해, 우리만의 프로토콜(자체 정의 프로토콜)을 만들 것입니다.
자체 정의 프로토콜
간단한 규약을 설정합시다:
- ESP8266 #1과 ESP8266 #2 사이에 TCP 연결을 설정합니다.
- ESP8266 #1:
- TCP 클라이언트로서 작동하여 ESP8266 #2에게 TCP 연결을 시작합니다.
- 스위치가 켜질 때, ESP8266 #2에게 값이 1인 바이트(명령)를 보냅니다.
- 스위치가 꺼질 때, ESP8266 #2에게 값이 0인 바이트(명령)를 보냅니다.
- ESP8266 #2:
- TCP 서버로서 작동하여 ESP8266 #1로부터의 TCP 연결 요청을 기다립니다.
- 받은 바이트가 1이면 LED를 켭니다.
- 받은 바이트가 0이면 LED를 끕니다.
- ESP8266 #2 - ESP8266과 LED 사이의 배선도
- ESP8266 #1의 코드에서 TCP 서버 IP 주소를 변경하십시오.
- ESP8266 #1 코드를 ESP8266 #1에 업로드하십시오.
- 아두이노 IDE #1에서 시리얼 모니터를 엽니다.
- ESP8266 #1의 버튼을 누르고 계속해서 ESP8266 #2의 LED 상태를 관찰하십시오(켜져 있어야 합니다).
- ESP8266 #1의 버튼을 놓고 ESP8266 #2의 LED 상태를 관찰하십시오(꺼져 있어야 합니다).
- 버튼을 여러 번 누르고, 계속 누르고, 놓으십시오.
- 시리얼 모니터 #1에서 출력을 확인하십시오.
배선도
ESP8266 #1 - ESP8266과 버튼 사이의 배선도
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
ESP8266의 핀 배치 및 ESP8266 및 다른 구성 요소에 전원을 공급하는 방법에 대해 더 많이 보십시오.
이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
ESP8266 코드 (ESP8266 #1용)
ESP8266 코드 ESP8266 #2용
사용 방법
Arduino IDE에서 ESP8266을 시작하는 방법은 다음과 같은 단계를 따르세요:
ESP8266을 처음 사용하는 경우 Arduino IDE에서 ESP8266 환경 설정 방법 튜토리얼을 확인하세요.
도표에 표시된 대로 구성 요소를 연결하세요.
USB 케이블을 사용하여 두 개의 ESP8266 보드를 컴퓨터에 연결하세요.
Arduino IDE를 엽니다(Arduino IDE #1이라고 함).
Arduino IDE를 다시 엽니다(이번에는 Arduino IDE #2라고 함).
올바른 ESP8266 보드를 선택하세요. 예를 들어 NodeMCU 1.0 (ESP-12E Module)와 해당 COM 포트를 선택하세요.
ezButton 라이브러리를 Arduino IDE에 설치하세요.
ESP8266 #1 코드를 복사하여 Arduino IDE #1에 붙여넣고 저장하세요(ESP8266-1이라고 명명).
ESP8266 #2 코드를 복사하여 Arduino IDE #2에 붙여넣고 저장하세요(ESP8266-2라고 명명).
먼저 ESP8266 #2에 ESP8266 #2 코드를 업로드하세요.
Arduino IDE #2에서 시리얼 모니터를 열고 TCP 서버 IP 주소를 얻으세요.
시리얼 모니터 #2에서 출력을 확인하세요:
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
인터넷을 통해 두 ESP8266을 연결하는 방법
IP 주소에는 두 가지 유형이 있습니다: 사설과 공인. 가정 내 네트워크에서 일반적으로 사용되는 IP 주소는 사설입니다.
사설 IP 주소를 인식하는 것은 간단합니다. 사설 IP 주소의 세 가지 형식은 10.x.x.x, 172.16.x.x, 192.168.x.x입니다.
다음 시나리오에서 사설 IP 주소를 사용하는 것이 중요하지 않습니다:
- 두 ESP8266이 서로 다른 로컬 영역 네트워크에 있고 중앙 집중식 서버를 통해 서로 통신할 때.
두 ESP8266이 서로 다른 LAN 네트워크에 있고 서로 직접 통신하는 경우, ESP8266 TCP 클라이언트는 사설 IP 주소를 사용할 수 있습니다. 그러나, ESP8266 TCP 서버는 다음 중 하나를 사용해야 합니다:
- 공용 IP 주소
- 라우터/액세스 포인트에서 "포트 포워딩"이 설정된 개인 IP 주소
"포트 포워딩" 기술은 라우터/AP마다 다릅니다. 이 튜토리얼에서는 이 주제를 다루지 않습니다.