피코 W 보드의 LED를 네트워크에 연결된 브라우저에서 켜고 끄기

피코 W 보드의 LED를  네트워크에 연결된 브라우저에서 켜고 끄기

앞선 글을 통해 라즈베리파이 피코 W의 주요 특징들을 소개하고, Wifi 네트워크에 접속하는 방법을 소개한 바 있다.

​

https://kongyine.com/223199089617

그런데, 이렇게 피코 보드가 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를 각종 릴레이나 모터 등의 장치로 대체하면 동일한 방식으로 다양한 장치들을 무선으로 브라우저에서 제어할 수 있게 된다.