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

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

1. PICO를 Wifi에 연결하고, LED를 점멸시키는 선행지식

이전 글들을 통해 라즈베리파이 피코 보드에서 Wifi 네트워크에 접속하는 방법을 소개했었다.

https://kongyine.com/223199089617

​

그리고 이렇게 Wifi 네트워크에 연결된 피코 보드 상의 LED를 네트워크 상의 다른 장치의 브라우저에서 URL을 이용하여 켜고, 끄는 방법을 다음 글에서 소개한 바 있었다.

​

https://kongyine.com/223199530424

se-l-image” id=”SE-2e430b24-f99e-497f-9bad-ae9436a8a4f7″>

2e430b24-f99e-497f-9bad-ae9436a8a4f7″, “data” : {“link” : “https://kongyine.com/223199530424”, : “false”, “thumbnail” : “https://dthumb-phinf.pstatic.net/?src=%22https%3A%2F%2Fblogthumb.pstatic.net%2FMjAyMzA5MDFfMTA0%2FMDAxNjkzNTM4NzQzNTE4.2T1KQ3XjTmGMeamH4V0mJJAic1JTRNezoXlhUISCa8gg.e6VvJ-V9VdMnA2B3BsC37H3JLyoSNDkqtFiMgPn-4U0g.PNG.mythee1%2Fimage.png%3Ftype%3Dw2%22&type=ff120

​

그러나 이 방법의 아쉬웠던 점은 브라우저 주소에 반복해서 LED 동작을 위한 메시지를 swon 또는 swoff 등의 형태로 입력해 주어야 해서 반복해서 사용이 불편하다는 점이었다. 이 점을 개선해 보기로 했다.

​

​

2. 브라우저에 선택 버튼을 반영시키는 개선

가장 쉬운 방법으로 아주 간단한 html 페이지를 만들고, 간단한 버튼을 만들어 이 버튼을 클릭할 때, swon 또는 swoff가 URL 형태로 전달되도록 해보았다.

​

최종적으로 원하는 모습은 다음과 같이 화면 중앙 부분에 2개의 버튼이 행을 달리하면서 배열되는 것이었고, 한글도 안내표시의 일부로 정상적으로 표시되도록 하는 것이었다.

​

우선, 마이크로 파이썬 내에 html 코드를 넣기 위해 기본적인 Code를 넣어주었다.

html=”””<!DOCTYPE html>

<html>

<head>

<title>

</head>

<body>

</body>

</html>

“””

​

​

그리고, 열리는 브라우저 페이지 타이틀을 다음과 같이 header 부분에 지정했다.

<head>

<title>Pico W LED Test on Browser</title>

</head>

​

다음은 본문 부분인 body 항목에 표시될 안내용 문장을 기입했다. 표시될 글자들의 크기도 h1, h2 등으로 지정했다.

<body>

<h1>Pico W – Control LED connected to PICO</h1>

<h1>Control the LED</h1>

<h1>Select the Button for LED Control</h1>

<h2>다음 버튼 중 원하는 LED 동작 버튼을 선택해 주세요</h2>

</body>

​

다음은 선택 버튼 생성을 위해 html 코드의 <body>와 ,</body> 사이에 다음과 같은 code를 넣어주었다.

이 코드들이 브라우저 화면에서 버튼을 만들어주고, 버튼을 누르면, 각각에 들어있는 메시지를 url의 일부로 전달하는 동작을 하게 된다. 행을 띄우기 위해 <p>와 </p> 조합을 사용했다.

​

<p>

<a href=”swon”><button>ON</button></a>

</p>

<p>

<a href=”swoff”><button>OFF</button></a>

</p>

​

그 결과, 다음과 같은 화면이 되었다.

​

한글이 화면 표시에서 깨어지는 문제를 해결하기 위해, 다시 header 부분에 다음과 같이 문자 세트를 지정해 주었다.

<head>

<title>Pico W LED Test on Browser</title>

<meta charset=”utf-8″>

</head>

​

다음과 같이 한글도 정상적으로 표시되는 것을 확인할 수 있었다.

​

​

3. 동작 예제

이제 이 코드가 정상적으로 동작하는지를 시험해 보았다.

다음과 같이 잘 동작하는 것을 확인할 수 있었다. 각 버튼을 선택할 때마다 미리 지정해 둔 swon과 swoff가 메시지의 일부로 피코로 전달되고, LED가 의도한 대로 켜지거나 꺼지는 것을 확인할 수 있었다.

​

마지막으로, 브라우저에 표시되는 글자들을 중앙 부분으로 잘 정리할 필요가 있었다.

이것은 위에 작성한 html의 <body> 시작문 바로 다음에 다음과 같이 <center>명령을 넣어줌으로써 해결할 수 있었다.

​

<body>

<center>

</body>

​

이렇게, 기존에 URL 주소에 원하는 동작을 매번 기입하는 대신, 화면에 표시된 버튼을 선택하는 방법으로, 네트워크에 연결된 피코 W의 LED가 동작하도록 변경할 수 있었다.

​

html 코드의 완성된 다음과 같다. 나의 경우에는 두 개의 버튼 사이에 행을 띄우기 위해 <p>와 </p>를 사용했으나, 이들 대신 <br> 명령을 대체해서 사용하는 것도 가능하다.

html="""<!DOCTYPE html>
<html>
<head>
<title>Pico W LED Test on Browser</title>
<meta charset="utf-8">
</head>
<body>
<center>
<h1>Pico W - Control LED connected to PICO</h1>
<h1>Control the LED</h1>
<h1>Select the Button for LED Control</h1>
<h2>다음 버튼중 원하는 LED 동작 버튼을 선택해 주세요</h2>
<p>
<a href="swon"><button>ON</button></a>
</p>
<p>
</p>
<p>
<a href="swoff"><button>OFF</button></a>
</p>
</body>
</html>
"""

​

최종적인 코드 전체는 다음과 같다.

import network
import utime
import socket
from machine import Pin
led=Pin(15, Pin.OUT)


wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.scan( ) #--> Scan
SSID = "myssid"
PASSWORD = "mypw"
wlan.connect(SSID, PASSWORD)


html="""<!DOCTYPE html>
<html>
<head>
<title>Pico W LED Test on Browser</title>
<meta charset="utf-8">
</head>
<body>
<center>
<h1>Pico W - Control LED connected to PICO</h1>
<h1>Control the LED</h1>
<h1>Select the Button for LED Control</h1>
<h2>다음 버튼중 원하는 LED 동작 버튼을 선택해 주세요</h2>
<p>
<a href="swon"><button>ON</button></a>
</p>
<p>
</p>
<p>
<a href="swoff"><button>OFF</button></a>
</p>
</body>
</html>
"""

# Function to load in html page    
#def get_html(html_name):
#    with open(html_name, 'r') as file:
#        html = file.read()       
#    return html

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
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 >-1: 
           led.value(1)
           stateis = "LED is ON"
if led_off >-1:
           led.value(0)
           stateis = "LED is OFF"
           
        response = html
        cl.send('HTTP/1.0 200 OKrnContent-type: text/htmlrnrn')
        cl.send(response)
        cl.close()

    except OSError as e:
        cl.close()
print('connection closed')

​