ESP32控制的WiFi开关
简 介: 文章摘要:本文介绍了基于ESP32的WiFi远程继电器开关设计。系统采用ESP32作为主控,通过12V-5V-3.3V电源转换电路供电,配合大功率继电器实现远程开关控制。电路采用单面PCB设计,经过两次改进后完成制作。焊接调试后,通过MicroPython编写控制程序,实现LED和继电器的周期性动作。网络功能部分实现了UDP通信协议,可通过发送"ON/OFF"指令控制继电器状态,并在路由器中为ESP32分配固定IP地址以方便管理。文章还提供了Python编写的PC端控制脚本,实现远程开关控制功能。
关键词: ESP32,WiFi,开关
WiFi开关控制
AD\Test\2025\July\RelayDelaySTC8G1K.SchDoc
01 WiFi 开关
一、设计背景
近期需要对实验室中的一个电源开关进行控制, 由于它距离比较远, 下面设计一个通过WiFi控制的电源继电器模块。 这样便可以通过计算机方便控制这个远端的电源开关了。

二、电路设计
AD\Test\2025\September\WiFISwitchESP32.SchDoc
根据这两天前面的测试结果, 组装成开关控制电路。 控制芯片使用ESP32, 通过一个大功率继电器来控制外部开关。 使用 P2307将12V转换成5V, 然后再使用XC6206 转换成 3.3V, 为ESP32提供工作电源。

下面通过单面PCB, 铺设电路图, 可以在一分钟之内获得测试电路板, 第一块电路板存在瑕疵, 重新又制作了一块, 第二块制作的非常完美。
三、焊接调试
焊接电路, 使用水蒸气对电路板进行清晰。 提供电路板 12V的工作电源, 测量其中5V和3.3V的电压正常。 通过六芯弹簧夹子连接自制的下载电路模块, 可以下载测试程序, LED 以及 继电器可以周期的动作了。

from machine import Pin
import time
LED = Pin(21, Pin.OUT)
RELAY = Pin(4, Pin.OUT)
while True:
LED.on()
RELAY.on()
time.sleep_ms(500)
LED.off()
RELAY.off()
time.sleep_ms(500)
四、网络控制
使用Python语言, 编写E SP32 联网功能, 当接收到 “ON” 字符串的时候, 打开继电器; 当接收到“OFF”字符串的时候, 关闭继电器。 这样, 通过网络便可以访问控制这个继电器了。![]()
from machine import Pin
import machine,time,network,usocket
LED = Pin(21, Pin.OUT)
RELAY = Pin(4, Pin.OUT)
LED.off()
RELAY.off()
wlan = network.WLAN(network.STA_IF)
wlan.active(False)
time.sleep_ms(500)
LED.on()
wlan.active(True)
time.sleep_ms(100)
wlan.scan()
wlan.connect('TENDA626A', 'gniqouhz')
while not wlan.isconnected():
time.sleep_ms(100)
adstr = wlan.ifconfig()
print(adstr)
LED.off()
us = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)
sockaddr = usocket.getaddrinfo('0.0.0.0', 5678)[0][-1]
us.bind(sockaddr)
print(sockaddr)
while True:
data,addr = us.recvfrom(1024)
if len(data) > 0:
print(data)
print(addr)
if data == b'on':
RELAY.on()
LED.on()
elif data == b'off':
RELAY.off()
LED.off()
在办公室无线网关配置中, 将这款ESP32的无线MAC地址 静态分配一个固定的 IP地址, 这样等这个ESP32重新联网的时候, 对应的IP地址是固定的。 由此可以方便WiFi控制命令的发送。

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# RELAY.PY -- by Dr. ZhuoQing 2025-09-23
#
# Note:
#============================================================
from headm import *
import socket
#------------------------------------------------------------
UDP_HOST = '192.168.0.123'
UDP_PORT = 5678
UDP_BUFSIZE = 0x1000
relay = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
relay.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, UDP_BUFSIZE)
relay.settimeout(0.2)
def relaysend(data):
ADDR = (UDP_HOST, UDP_PORT)
if type(data) != str:
data = str(data)
data = bytes(data, 'gbk')
relay.sendto(data, ADDR)
def relayrecv():
try:
data, ADDR = relay.recvfrom(UDP_BUFSIZE)
except socket.timeout:
printf('Meter time out.')
data = ''
if len(data) > 0:
return data.decode('utf-8')
else: return ''
def relayval():
relaysend('MEMOS')
splitstr = relayrecv().split(' ')
data = []
for val in splitstr:
if len(val) > 0:
data.append(eval(val))
return data
#------------------------------------------------------------
if len(sys.argv) > 1:
if sys.argv[1] == 'on':
relaysend('on')
else:
relaysend('off')
else:
relaysend('off')
#------------------------------------------------------------
'''
while True:
relaysend('off')
time.sleep(2)
relaysend('on')
time.sleep(2)
'''
#------------------------------------------------------------
printf("\a")
#------------------------------------------------------------
# END OF FILE : RELAY.PY
#============================================================
※ 总 结 ※
本文设计了基于ESP32的开关控制电路。 后来在调试的时候, 发现了在原来设计中没有将GPIO0通过一个电阻接到高电平, 使得ESP32在启动的时候容易出现复位。 现在直接使用短路线将 GPIO0 连接到3.3V, ESP32启动联网正常了。

■ 相关文献链接:
更多推荐


所有评论(0)