se-l-large_image” id=”SE-77855650-7d58-4da6-afe7-1db9f5f610f3″>
77855650-7d58-4da6-afe7-1db9f5f610f3″, “data” : {“link” : “https://kongyine.com/223199089617”, : “false”, “thumbnail” : “https://dthumb-phinf.pstatic.net/?src=%22https%3A%2F%2Fblogthumb.pstatic.net%2FMjAyMzA4MzFfMzYg%2FMDAxNjkzNDg4NDE4NTA5.U9cVaQ53O3_vWZcB3zwbd5D50fsts-8kNW9Jht8TmB8g.0uXsSLBJsHbNQBD_f0V7WQKIklXg0f2uPb6iS_NGkvcg.JPEG.mythee1%2F20230831_221922.jpg%3Ftype%3Dw2%22&type=ff500_300
그런데, 이렇게 피코 보드가 Wifi망에 접속하면, 웹 브라우저를 이용하여 피코보드의 입출력 핀들을 제어하는 것이 가능해진다.
다음과 같이 GP15와 이웃한 GND를 이용하여, LED를 연결하고, 이를 웹브라우저에서 켜고, 끄기를 시도해 보았다.
앞 부분은 이전 글에서 소개한 Wifi 네트워크에 접속하는 Code를 그대로 재활용하였다.
중요한 것은 접속이 이루어진 상태에서, 할당되는 IP 주소를 확인하기 위해 다음 명령을 넣어준다.
print( “ip =”, wlan.ifconfig())
이 명령이 실행되면 다음과 같은 결과를 얻을 수 있었다.
웹 브라우저에서의 접속을 위해 맨 앞의 IP 주소를 기억해야 한다.
Code에서 새롭게 추가된 것은 다음 부분으로, 소켓 방식으로 서버와 통신을 위한 것이다.
이를 위해 먼저 socket 라이브러리 사용이 추가되었다.
import socket
그리고, 다음과 같이 socket을 만들고, 메시지를 받기 위한 대기 상태를 만들어 주었다.
여기서 0.0.0.0을 사용하는 것은 사용 가능한 모든 IP 주소에 대응하기 위한 때문으로 알려져 있다.
addr = socket.getaddrinfo(‘0.0.0.0’, 80) [0] [-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
이렇게 하면 웹 브라우저로부터 메시지를 받을 준비가 되었다.
다음과 같은 Code를 이용하여, 서버로부터 메시지를 받은 다음, 이 중에 원하는 조건이 있으면 이에 해당되는 동작을 하도록 작성했다.
먼저 웹브라우저에서 메시지를 받아들인다.
while True:
try:
cl, addr = s.accept()
print(‘client connected from’, addr)
request = str(cl.recv(1024))
그리고 이 메시지에(앞부분) 내가 정한 조건이 있는지를 확인한다. 본 예제에서는 swon과 swoff를 동작의 기준으로 설정했다. 메시지가 “/swon”으로 시작되면 피코 W에 연결된 LED가 켜지고, 메시지가 “/swoff”로 시작되면 피코 W에 연결된 LED가 꺼지는 조건이다.
이를 찾기 위해 다음과 같이. request.find(문자열) 명령을 사용했다.
led_on = request.find(‘/swon’)
led_off = request.find(‘/swoff’)
참고로 위에서 받은 메시지를 print (request)로 출력해 보면 다음과 같다. 위의 두 명령은 수신된 메시지가 지정한 문자열로 시작하는지를 찾는 것이다.
이 비교의 결과 해당 조건이 충족되면, 변수값이 6이 되고, 만일 지정한 조건이 충족되지 않으면 다음과 같이 -1이 반환되게 된다.
다음은 이렇게 반환된 값으로 LED를 켜고 크는 동작을 하는 부분이다.
if led_on == 6:
led.value(1)
stateis = “LED is ON”
if led_off == 6:
led.value(0)
stateis = “LED is OFF”
전체 Code는 다음과 같다.
중간중간 동작 확인과 각종 값들의 변화를 확인하기 위해 print 명령을 추가해 두었다.
import network
import utime
from machine import Pin
led=Pin(15, Pin.OUT)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.scan( ) #--> Scan
SSID = "MySSID"
PASSWORD = "Mypasswd"
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected() and wlan.status() >= 0:
print("Waiting to connect:")
utime.sleep(1)
if wlan.status() != 3:
raise RuntimeError('network connection failed')
else:
print("Wifi is connected == ", wlan.isconnected())
print( "Status =", wlan.status())
print( "ip =", wlan.ifconfig())
# Open Socket
import socket
addr = socket.getaddrinfo('0.0.0.0', 80) [0] [-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print("listening", addr)
print(s)
utime.sleep(2)
# Listen for connections
while True:
try:
cl, addr = s.accept()
print('client connected from', addr)
request = str(cl.recv(1024))
print("Request", request)
led_on = request.find('/swon')
led_off = request.find('/swoff')
print("led_on, led_off ==", led_on, led_off)
if led_on == 6:
print("led on")
led.value(1)
stateis = "LED is ON"
if led_off == 6:
led.value(0)
stateis = "LED is OFF"
response = stateis
cl.send('HTTP/1.0 200 OKrnContent-type: text/htmlrnrn')
cl.send(response)
cl.close()
except OSError as e:
cl.close()
print('connection closed')
이 Code의 동작 모습은 다음과 같다.
웹 브라우저에서 반환된 ip 주소를 적고 동작을 결정하는 문자열인 /swon 또는 /swoff를 기재하여 실행하면 다음과 같이 피코보드에 연결된 LED가 켜지거나 꺼지게 된다.

LED를 각종 릴레이나 모터 등의 장치로 대체하면 동일한 방식으로 다양한 장치들을 무선으로 브라우저에서 제어할 수 있게 된다.

