피코 보드의 내장 온도센서 측정값을 네트워크/인터넷으로 연결된 장치에 표시하고, 전열 장치 제어하기

피코 보드의 내장 온도센서 측정값을 네트워크/인터넷으로 연결된 장치에 표시하고, 전열 장치 제어하기

앞선 글에서 피코 보드의 LED를 네트워크 또는 인터넷상의 다른 장치의 브라우저에서 제어하는 방법을 소개한 바 있었다. LED를 켜고 끌 뿐만 아니라, LED의 상태에 대한 메시지를 브라우저에서 볼 수도 있었다.

https://blog.naver.com/mythee1/223201016741

https://blog.naver.com/mythee1/223201031398

그런데, 이 부분을 생각해 보면, LED 상태에 대한 메시지 외에, 피코 보드에 연결된 여러 가지 센서에서 측정한 측정값을 네트워크나 인터넷으로 접속한 다른 PC에서 브라우저를 통해 볼 수가 있다는 의미가 되기도 한다.

이를 구현하기 위해, 피코 보드에 내장된 온도센서 값을 브라우저로 보내고, 이 값에 따라 피코 보드에 연결된 전열 장치(여기서는 LED)를 켜거나 끌 수 있도록 구현해 보기로 했다.

피코 보드의 내장 온도센서에 대해서는 앞선 글에서 소개한 바가 있으므로, 해당 내용에 대해서는 다음 링크를 통해 이전 글을 참조하기 바란다. https://blog.naver.com/mythee1/223185333640

이를 구현하기 위해, 앞선 LED 제어를 위한 Code에 앞선 내장 온도센서 응용 COde 부분을 가져와 하나로 합쳤다.

그리고 브라우저로 반환하는 부분에 이 온도값을 반환하도록 다음과 같이 Code를 개조했다.

그 결과, 이 COde를 동작하면 쉘 부분에 다음과 같이 입력 전압과 호남산 온도값을 나타내는데,

브라우저를 통해 피코 보드가 접속한 IP 주소에 접속하면 다음과 같이 의도한 대로, 온도값이 표시되는 것을 볼 수가 있었다.

쉘에 표시되는 값과 브라우저에 표시되는 온도값이 잘 일치하는 것을 볼 수가 있다.

앞선 html 포맷에 맞추어 온도가 표시되고, LED 제어가 되도록 앞선 글에서 설명한 Code들을 반영하여 완성한 Code는 다음과 같다.

import network
import utime
import socket
from machine import Pin
led=Pin(15, Pin.OUT)
sensor_T = machine.ADC(4)
conversion_factor = 3.3 / (65535)

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

html="""<!DOCTYPE html>
<html>
<head>
<title>Pico W 온도측정과 전원제어</title>
<meta charset="utf-8">
</head>
<body>
<center>
<h1>Pico W - 온도측정 및 전원 Control</h1>
<br><br>
<h2>전원장치의 원하는 동작을 선택해 주세요</h2>
<p>
<a href="swon"><button>ON</button></a>
</p>
<p>
</p>
<p>
<a href="swoff"><button>OFF</button></a>
<br><br>
%s
        </p>
</body>
</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)

# 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)
        status = "      "
if led_on == 6: 
           led.value(1)
           status = "LED is ON"
if led_off ==6:
           led.value(0)
           status = "LED is OFF"        
        inputvolt = sensor_T.read_u16() * conversion_factor
        Celcius_T0 = round(27 - (inputvolt - 0.706)/0.001721, 2)
print("Input volt=  ", inputvolt, "Calculated Temp ==", Celcius_T0)

        tempfeed="측정된 현재 온도는 =="+str(Celcius_T0)   
        response = html % status
        cl.send('HTTP/1.0 200 OKrnContent-type: text/htmlrnrn')
        cl.send(response)
        cl.send(tempfeed)
        cl.close()

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

다른 장치에서 이 IP주소로 접속한 결과는 다음화면과 같다.

피코 보드가 알려주는 온도값과 피코 보드에 연결된 전열 장치(여기서는 LED)의 상태를 표시해준다.

또한 버튼 선택으로, 해당 전열장치(=LED)를 조작할 수 있다.

동작 과정에 대한 동영상을 참고하면, 버튼조작과, 온도값 반환상태, 그리고 버튼 조작에 따른 LED 점멸 상태를 확인할 수 있다.