앞선 글에서 ESP32보드 2개를 이용하여, ESP-NOW를 활용한 통신으로 상대방 ESP32보드에 있는 LED를 버튼스위치로 켜고 끄는 것을 소개한 바 있었다. 그런데 이것은 일방적인 통신이었다. 즉 ESP 보드 A에서 ESP 보드 B로 신호를 보내는 것이었다.
https://blog.naver.com/mythee1/223290595170
이전 글에서 사용했던 예제와 코드를 개량하여, 양측 모두에서 서로 신호를 주고받는 것을 시도해 보았다.
즉, 다음과 같은 구성에서 A 보드(오른쪽)의 버튼이 눌려지면, A 보드의 출력 신호용 백색 LED가 켜지고, 이 신호가 ESP 보드 B(왼쪽)에서 수신되면, 수신 확인을 의미하는 청색 LED가 보드 B에서 켜진다.
그리고, 이 신호를 다시 보드 B에서 A로 연계해서 보내는 신호인 백색 LED가 보드 B에서 켜지고, 이 신호가 다시 ESP 보드 A에서 수신되면, 최종적으로 적색 LED가 켜지면서 하나의 신호를 서로 양방향으로 주고받는 사이클을 완료하는 형태이다. (스위치가 꺼지는 경우도 마찬가지이다.)
이를 위해 Code를 다음과 같이 개량했다.
먼저 최초 신호를 보낼 A 보드는 기존 코드에 최종적으로 반환되어 오는 신호를 수신할 수 있도록 다음 부분을 추가했다. 버튼스위치 값의 변화를 체크한 이후, 상태 값을 변경하기 전에 반환되는 메시지 여부를 체크하도록 한 것이다.
최종 코드는 다음과 같다.
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)
peer = b'$bxabxff(xdc'
esp.add_peer(peer)
button = Pin(23, Pin.IN, Pin.PULL_DOWN)
ledout = Pin(22, Pin.OUT)
ledin = Pin(1, Pin.OUT)
buttonwas = 0
while True:
buttonnow = button.value()
if buttonnow != buttonwas:
if buttonnow == 1:
message = "SWOn"
ledout.value(1)
print("Sending command : ", message)
else:
message = "SWOff"
ledout.value(0)
print("Sending command : ", message)
esp.send(peer, message)
_, msg = esp.recv()
if msg:
if msg == b'KeyOn':
utime.sleep(0.1)
ledin.value(1)
print("Rcvd message : KeyOn")
elif msg == b'KeyOff':
utime.sleep(0.1)
ledin.value(0)
print("Rcvd message : KeyOff")
else:
print("Unknown")
buttonwas = buttonnow
반면 과거 단방향 통신에서 수신만 하던 B 보드에는 수신된 메시지에 따라 송신이 가능하도록,
송신할 상대방 보드의 MAC 주소를 추가했고, peer = b’xe4exb8rTxf4′
peer를 추가해 주는 명령을 사용했다. esp.add_peer(peer)
그리고 송신 기능을 하도록 send 명령을 추가했다. esp.send(peer, msgback)
시각적 효과를 위해 송신 측 LED 핀을 추가했고, ledout = Pin(23, Pin.OUT)
시간에 따른 동작을 보기 위해 0.1초 정도씩 지연을 주었다. utime.sleep(0.1)
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)
peer = b'xe4exb8rTxf4' #E4:65:B8:0D:54:F4
esp.add_peer(peer)
ledin = Pin(22, Pin.OUT)
ledout = Pin(23, Pin.OUT)
while True:
_, msg = esp.recv()
if msg:
if msg == b'SWOn':
print("Rcvd message : Turn on SW")
utime.sleep(0.1)
ledin.on()
msgback="KeyOn"
utime.sleep(0.1)
esp.send(peer, msgback)
print("Sending Msg. : ", msgback)
ledout.on()
elif msg == b'SWOff':
print("Rcvd message : Turn off SW")
utime.sleep(0.1)
ledin.off()
msgback="KeyOff"
utime.sleep(0.1)
esp.send(peer, msgback)
print("Sending Msg. : ", msgback)
ledout.off()
else:
print("Unknown")
결과적으로 동작하는 모습은 다음과 같다.
참고로 단계별 동작을 좀 더 정확히 보기 위해 LED 동작을 0.3초씩 지연시킨 경우의 동작 모습은 다음과 같다.
A 보드에서 버튼이 눌려지거나 떼어짐에 따라, 순차적으로 LED들이 ESP-NOW 통신을 통해 작동하는 것을 볼 수가 있다.

