ESP-NOW 사용하기 3. – 1:N (복수의 상대방과) 통신하기

ESP-NOW 사용하기 3. –  1:N  (복수의 상대방과) 통신하기

앞선 글에서 ESP32/8266 보드에서 ESP-NOW 통신을 이용하여, Wifi 없이도 통신을 하고, 상대방 보드에 연결된 LED를 켜고 끄는 것을 소개한 바 있었는데( https://kongyine.com/223290595170 ), ESP 보드에서는 비단 1:1 방식 외에도, 1:N의 방식으로 다수의 ESP 보드들과도 동시에 통신이 가능하다.

se-l-large_image” id=”SE-c7cc376c-6929-4dc2-a714-bc63cc9474cf”>

c7cc376c-6929-4dc2-a714-bc63cc9474cf”, “data” : {“link” : “https://kongyine.com/223290595170”, : “false”, “thumbnail” : “https://dthumb-phinf.pstatic.net/?src=%22https%3A%2F%2Fblogthumb.pstatic.net%2FMjAyMzEyMTJfMjcz%2FMDAxNzAyMzcxMjM4OTgw.L5Dm0BR2ylwJ_KHmDEixvtrdxgCJi_KOYpmG68Ftu9cg.imfKv58FVhBU3zaBDe9h7bM2Y_9lo6wt-okZNs_65fog.JPEG.mythee1%2F20231211_175141.jpg%3Ftype%3Dw2%22&type=ff500_300

이를 시도하기 위해 다음과 같이, 회로를 구성했다.

즉, 오른편에 위치한 ESP32 보드에서, 버튼스위치가 눌러지면 LED가 켜지고,

동시에 이 신호를 왼쪽의 2개 ESP32/ESP8266보드에 ESP-NOW로 보내, 해당 보드들에서도 연동하여 각각의 LED가 켜지도록 구성했다.

ESP-NOW를 사용해 복수의 ESP 보드들로 송신하려면 다음과 같은 명령어들이 필수이다.

import espnow 먼저 espnow 라이브러리 사용을 선언해 준다.

sta = network.WLAN(network.STA_IF) 통신 네트워크를 만들어준다.

sta.active(True) 통신 네트워크를 활성화시켜준다.

sta.disconnect( ) ESP8266과 통신을 대비해 필요

esp = espnow.ESPNow( ) ESP-NOW 사용 Class를 만들어준다.

esp.active(True) ESP-NOW 서비스를 활성화시킨다.

그리고 1:1 통신과 다른 것은 다음과 같이 접속한 ESP 보드들의 MAC들을 전부 지정해 주어야 하는 점이 다르다.

peer32 = b’$bxabxff(xdc’ 접속할 대상의 MAC 주소를 지정해 준다

peer8266 = b’xb4xe6-pDn’ 접속할 대상의 MAC 주소를 지정해 준다

(접속할 대상의 수만큼 기재해준다.)

esp.add_peer(peer32) ESP-NOW로 지정 대상에 접속한다

esp.add_peer(peer8266) ESP-NOW로 지정 대상에 접속한다

(접속할 대상의 수만큼 기재해준다.)

결과적으로 신호를 보내는 Sender 쪽에서 사용한 Code는 다음과 같다.

import network
from machine import Pin
import espnow
import utime

sta = network.WLAN(network.STA_IF)  
sta.active(True)
sta.disconnect()      
esp = espnow.ESPNow()
esp.active(True)

peer32 = b'$bxabxff(xdc'
peer8266 = b'xb4xe6-pDn'
esp.add_peer(peer32)
esp.add_peer(peer8266)

button = Pin(23, Pin.IN, Pin.PULL_DOWN)
led = Pin(22, Pin.OUT)
buttonwas = 0
while True:
    buttonnow = button.value()
if buttonnow != buttonwas:
if buttonnow == 1:
           message = "SWOn"
           led.value(1)
else:
           message = "SWOff"
           led.value(0)
print("Sending command : ", message)
        esp.send(peer32, message)
        esp.send(peer8266, message)
        buttonwas = buttonnow

신호를 수신하는 ESP32에서 사용한 코드는 다음과 같다.

신호를 수신하는 ESP8266도 동일한 코드를 사용하였으나, LED를 연결하는 핀의 번호만 배선 상의 이유로 배선이 편리한 GP 5번으로 변경하여 사용하였기에 핀번호만 변경해 주었다.

코드에서 신호가 수신되면, LED가 켜지는 것은 너무도 즉각적이기에, 시각적 효과를 위해 0.3초 정도의 시간 지연을 두어 신호를 받고 LED가 켜지는 것을 확인할 수 있게 했다.

import network
import espnow
import utime
from machine import Pin

sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect()
esp = espnow.ESPNow()
esp.active(True)

led = Pin(22, Pin.OUT)
while True:
    _, msg = esp.recv()
if msg:
if msg == b'SWOn':
            utime.sleep(0.2)
print("Turn on SW")
            led.on()
        elif msg == b'SWOff':
            utime.sleep(0.2)
print("Turn off SW")
            led.off()
else:
print("Unknown")

동작하는 모습은 다음과 같다.

버튼이 눌려질 때 상대측 ESP 보드들의 LED들도 켜지며, 버튼스위치를 누르는 것이 해제되면 상대측 LED들도 꺼지는 것을 확인할 수 있다.

참고 : 이 예제에서는 시각적 효과를 위해 인위적으로 약 0.3초 정도씩의 지연을 두었으나, 이를 제거하면 거의 동시에 LED가 켜고 꺼져서 ESP-NOW 통신에 시간 지연은 거의 없는 것을 확인할 수 있었다.