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

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

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

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

​

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

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

​