ESP32 개발보드에 연결된 장치(LED, 릴레이 등)를 웹서버로 켜고 끄기

ESP32 개발보드에 연결된 장치(LED, 릴레이 등)를 웹서버로 켜고 끄기

앞선 글에서 ESP32개발 보드에서 와이파이 네트워크에 접속하는 방법을 자세히 소개한 바 있었다.

이렇게 ESP32보드로 와이파이에 접속한 이후, ESP32 개발보드에 연결된 여러 전원 스위치를 원격으로 끄거나 켤 수 있다면, 실생활에서 매우 편리하고, 응용범위도 넓어지게 된다.

본 글에서는 ESP32개발 보드를 인터넷에 연결시켜 둔 후, ESP32보드에 연결된 전원 스위치에 해당되는 LED를 웹 브라우저 상에서 켜거나 끄는 방법을 소개하려 한다. (참고 – ESP32에서 와이파이로 인터넷을 연결하는 방법 자체는 다음 글을 참조하기 바란다. https://blog.naver.com/mythee1/223285419703 )

예제회로는 다음과 같이 간단하게, GP22번 핀과 GND에 LED를 연결하여 구성하였다.

ESP32는 동작전압이 3.3V로 내 경험으로는 별도의 저항을 추가하지 않아도 중형 LED 사용에 문제는 없었다.

코드는 앞선 글에서 소개한 와이파이 접속 코드에, socket을 형성하는 부분과, socket을 통해 접속한 Web 브라우저에서 읽어오는 접속 정보 중에 들어있는 문자열을 통해 LED를 제어하도록 했다.

먼저 socket 사용을 위해 socket 라이브러리 사용을 선언해 준다.

import socket

그리고 socket을 형성해 준다.

addr = socket.getaddrinfo(‘0.0.0.0’, 80) [0] [-1]

s = socket.socket()

s.bind(addr)

s.listen(1)

stateis = “”

별도의 PC에서 이 ESP32 보드에 접속하는 경우 접속 정보를 읽기 위해 다음과 같은 문구들을 넣어준다.

본 글에서는 ‘swon’으로 시작되는 접속 정보일 때 LED가 켜지고, ‘swoff’으로 시작되는 접속 정보일 때 LED가 꺼지도록 다음과 같이 코드를 구성했다.

while True:

try:

cl, addr = s.accept()

request = str(cl.recv(1024))

led_on = request.find(‘/swon’)

led_off = request.find(‘/swoff’)

웹브라우저에서는 ESP32보드의 ip 주소를 통해 다음과 같은 방식으로 접속해 제어하게 된다.

브라우저에서 접속하는 주소는 ESP32개발 보드가 사용하는 IP 주소인데, 다음에서처럼 esp32 보드를 와이파이 네트워크에 접속할 때 확인되는 값이다.

(참고 – 만일 접속하는 pc와 esp32가 접속한 네트워크가 서로 다른 경우라면, esp32 개발 보드가 접속한 네트워크의 라우터에서 포트포워딩이 필요하며, 브라우저에서 접속하는 주소는 해당 라우터의 외부 ip 주소를 사용해야 한다.)

최종적으로 본 글에서 예제로 사용한 코드는 다음과 같으며,

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

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.scan( ) #--> Scan
SSID = "접속 SSID"
PASSWORD = "접속 Password"
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected() and wlan.status() >= 0:
print("Waiting to connect:")
    utime.sleep(1)
if wlan.status() != 1010:
    raise RuntimeError('network connection failed')
else:
print("Wifi is connected == ", wlan.isconnected())
print( "Status =", wlan.status())
print( "ip =", wlan.ifconfig())   

addr = socket.getaddrinfo('0.0.0.0', 80) [0] [-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
stateis = ""
while True:
try:
        cl, addr = s.accept()
        request = str(cl.recv(1024))
        led_on = request.find('/swon')
        led_off = request.find('/swoff')
if led_on == 6: 
           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()

동작하는 모습은 다음과 같다.