두 ESP8266 간의 통신 | Communication between two ESP8266

이 가이드는 두 대의 ESP8266 장치를 WiFi를 통해 TCP/IP로 연결하고 데이터를 교환하는 방법을 보여줍니다. 한 대의 ESP8266은 TCP 클라이언트로 작동하며, 다른 하나는 TCP 서버로 작동할 것입니다. 이 과정을 예를 들어 자세히 살펴보겠습니다:

준비물

2×ESP8266 NodeMCU Amazon
2×Micro USB Cable Amazon
1×(Optional) ESP8266 Screw Terminal Adapter 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이 TCP 클라이언트이고 다른 하나는 TCP 서버입니다.

통신을 위해 중앙 집중식 서버를 사용하는 경우, 일반적으로 두 ESP8266 모두 TCP 클라이언트로 작동합니다.

두 ESP8266 사이의 통신에 사용할 애플리케이션 프로토콜을 결정할 때, 선택할 수 있는 여러 옵션이 있습니다:

  • 원시 TCP 상의 자체 정의 프로토콜
  • 모드버스 TCP
  • HTTP
  • Telnet
  • SSH
  • MQTT (중앙 집중식 서버가 필요함)

예시 응용 프로그램

다음 프로그램을 현실로 만들어 봅시다: ESP8266 #1에 부착된 버튼/스위치를 사용하여 WiFi를 통해 ESP8266 #2에 연결된 LED를 켜고 끌 수 있습니다.

communication between two esp8266

앞서 언급한 바와 같이, 몇 가지 응용 프로그램 프로토콜이 있습니다. 이 예시를 단순화하기 위해, 우리만의 프로토콜(자체 정의 프로토콜)을 만들 것입니다.

자체 정의 프로토콜

간단한 규약을 설정합시다:

  • 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 #1 - ESP8266과 버튼 사이의 배선도

    ESP8266 NodeMCU Button Wiring Diagram

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

    ESP8266의 핀 배치ESP8266 및 다른 구성 요소에 전원을 공급하는 방법에 대해 더 많이 보십시오.

    • ESP8266 #2 - ESP8266과 LED 사이의 배선도
    ESP8266 NodeMCU LED Wiring Diagram

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

    ESP8266 코드 (ESP8266 #1용)

    /* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/communication-between-two-esp8266 */ #include <ezButton.h> #include <ESP8266WiFi.h> #define BUTTON_PIN D7 // 버튼이 연결된 ESP8266 핀 #define SERVER_IP "192.168.0.180" #define SERVER_PORT 4080 ezButton button(BUTTON_PIN); // D7 핀에 연결된 ezButton 생성 const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // 여기에 WIFI SSID를 변경하세요. const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // 여기에 WIFI 비밀번호를 변경하세요. WiFiClient TCPclient; void setup() { Serial.begin(9600); button.setDebounceTime(50); // 50 밀리초로 디바운스 시간 설정 Serial.println("ESP8266 #1: TCP CLIENT + A BUTTON/SWITCH"); // 와이파이에 연결 WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // TCP 서버에 연결 (ESP8266 #2) if (TCPclient.connect(SERVER_IP, SERVER_PORT)) Serial.println("ESP8266 #1: TCP 서버에 연결됨"); else Serial.println("ESP8266 #1: TCP 서버에 연결 실패"); } void loop() { button.loop(); // 반드시 loop() 함수를 먼저 호출해야 함 if (!TCPclient.connected()) { Serial.println("ESP8266 #1: 연결이 끊어짐"); TCPclient.stop(); // TCP 서버에 재연결 (ESP8266 #2) if (TCPclient.connect(SERVER_IP, SERVER_PORT)) Serial.println("ESP8266 #1: TCP 서버에 재연결됨"); else Serial.println("ESP8266 #1: TCP 서버에 재연결 실패"); } if (button.isPressed()) { TCPclient.write('1'); TCPclient.flush(); Serial.println("ESP8266 #1: - 버튼이 눌렸습니다, 명령을 보냈습니다: 1"); } if (button.isReleased()) { TCPclient.write('0'); TCPclient.flush(); Serial.println("ESP8266 #1: - 버튼이 놓였습니다, 명령을 보냈습니다: 0"); } }

    ESP8266 코드 ESP8266 #2용

    /* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/communication-between-two-esp8266 */ #include <ESP8266WiFi.h> #define LED_PIN D6 // ESP8266핀이 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("ESP8266 #2: TCP SERVER + AN LED"); // Wi-Fi에 연결 WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // TCP 서버 시작 TCPserver.begin(); } void loop() { // 클라이언트가 연결되었는지 확인 WiFiClient client = TCPserver.available(); if (client) { // TCP 클라이언트에서 명령어 읽기 char command = client.read(); Serial.print("ESP8266 #2: - Received command: "); Serial.println(command); if (command == '1') digitalWrite(LED_PIN, HIGH); // LED를 켭니다 else if (command == '0') digitalWrite(LED_PIN, LOW); // LED를 끕니다 client.stop(); // 연결을 끊습니다 } }

    사용 방법

    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 주소를 얻으세요.

    COM6
    Send
    ARDUINO #2: TCP SERVER + AN LED TCP Server IP address: 192.168.0.2 -> Please update the serverAddress in ESP8266 #1 code
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • ESP8266 #1의 코드에서 TCP 서버 IP 주소를 변경하십시오.
    • ESP8266 #1 코드를 ESP8266 #1에 업로드하십시오.
    • 아두이노 IDE #1에서 시리얼 모니터를 엽니다.
    • ESP8266 #1의 버튼을 누르고 계속해서 ESP8266 #2의 LED 상태를 관찰하십시오(켜져 있어야 합니다).
    • ESP8266 #1의 버튼을 놓고 ESP8266 #2의 LED 상태를 관찰하십시오(꺼져 있어야 합니다).
    • 버튼을 여러 번 누르고, 계속 누르고, 놓으십시오.
    • 시리얼 모니터 #1에서 출력을 확인하십시오.
    COM6
    Send
    ARDUINO #1: TCP CLIENT + A BUTTON/SWITCH Connected to TCP server ESP8266 #1: - The button is pressed, sent command: 1 ESP8266 #1: - The button is released, sent command: 0 ESP8266 #1: - The button is pressed, sent command: 1 ESP8266 #1: - The button is released, sent command: 0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    시리얼 모니터 #2에서 출력을 확인하세요:

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

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, 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마다 다릅니다. 이 튜토리얼에서는 이 주제를 다루지 않습니다.

코멘트

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