本文介绍了 DFRobot FireBeetle 2 ESP32 P4 开发套件通过无线 WiFi 模块和 MQTT 协议实现 Home Assistant 远程控制步进电机旋转的项目设计。
包括项目介绍、流程图、硬件连接、流程图、工程代码、HA 面板设计、运行效果展示等。
项目介绍
环境搭建:Docker、EMQX、HA 部署;
工程测试:流程图、MicroPython 代码、MQTTX 通信测试;
HA 测试:配置文件、面板卡片设计、调试;
环境搭建
下载并安装 Docker Desktop 软件;
部署 EMQX 平台和 HA 平台;
硬件连接
步进电机
Step Motor | Board |
---|---|
IN1 | 4 |
IN2 | 5 |
IN3 | 20 |
IN4 | 21 |
VCC | 5V |
GND | GND |
Type-C 数据线接入 USB-CDC 接口,实现程序调试和系统供电;

工程测试
包括流程图、代码、MQTTX 软件测试等。
流程图

工程代码
运行 Thonny IDE 软件,配置解释器和设备端口,新建文件并添加如下代码
import json
import time
import random
import network
from machine import Pin
import uasyncio as asyncio
from umqtt.simple import MQTTClient
# ------------- 用户配置 -------------
WIFI_SSID = "Xiaomi_8ABD"
WIFI_PWD = "15836035036"
MQTT_SERVER = "192.168.31.160"
MQTT_PORT = 32768
MQTT_CLIENT_ID = 'micropython-client-{id}'.format(id=random.getrandbits(8))
MQTT_USER = "LJL"
MQTT_PWD = "4421989g"
SUB_TOPIC = "esp/stepper/cmd"
PUB_TOPIC = "esp/stepper/status"
# 电机引脚(A B C D)
MOTOR_PINS = [4, 5, 20, 21]
# ------------------------------------
def wifi_connect(ssid, pwd):
sta = network.WLAN(network.STA_IF)
sta.active(True)
if not sta.isconnected():
print("Connecting Wi-Fi...")
sta.connect(ssid, pwd)
for _ in range(20):
if sta.isconnected():
break
time.sleep(1)
print("Wi-Fi connected:", sta.ifconfig())
# --------------Stepper-------------------------------------
class Stepper28BYJ48:
STEP_SEQ = [
[1,0,0,1], [1,0,0,0], [1,1,0,0], [0,1,0,0],
[0,1,1,0], [0,0,1,0], [0,0,1,1], [0,0,0,1]
]
def __init__(self, pins):
self.coils = [Pin(p, Pin.OUT) for p in pins]
self.release()
def _write(self, pattern):
for coil, v in zip(self.coils, pattern):
coil.value(v)
def step(self, steps, delay_ms=2):
direction = 1 if steps > 0 else -1
for _ in range(abs(steps)):
for phase in range(8)[::direction]:
self._write(self.STEP_SEQ[phase])
time.sleep_ms(delay_ms)
self.release()
def angle(self, deg, delay_ms=2):
steps = int(deg * (509 / 360))
self.step(steps, delay_ms)
def release(self):
for c in self.coils:
c.value(0)
motor = Stepper28BYJ48(MOTOR_PINS)
# 连接 MQTT
def mqtt_connect():
c = MQTTClient(MQTT_CLIENT_ID, MQTT_SERVER, MQTT_PORT, MQTT_USER, MQTT_PWD)
c.set_callback(on_msg)
c.connect()
c.subscribe(SUB_TOPIC)
print("[MQTT] connected & subscribed")
return c
# 收到控制指令
def on_msg(topic, msg):
try:
cmd = json.loads(msg)
angle = cmd.get("angle", 0)
#speed = max(1, cmd.get("speed", 2)) # 步间延时(ms)
speed = max(1, min(10, cmd.get("speed", 2))) # 限制速度范围 1-10
delay_ms = 11 - speed # 数值越大速度越快,延迟越小
motor.angle(angle, delay_ms)
# 回传状态
stat = {"angle_done": angle, "speed_set": speed}
client.publish(PUB_TOPIC, json.dumps(stat))
except Exception as e:
print("Bad msg:", e)
# 主协程
async def main():
wifi_connect(WIFI_SSID, WIFI_PWD)
global client
client = mqtt_connect()
while True:
client.check_msg()
await asyncio.sleep_ms(100)
asyncio.run(main())
保存代码并运行。
MQTTX 测试
新建连接,输入本地计算机 IP 地址、端口号、MQTT Broker 用户名、密码等;
运行连接,添加订阅主题 esp/stepper/status 获取监听消息;
在发送界面输入主题 esp/stepper/cmd 向 EMQX 发送指令消息;

定义旋转角度和速度,步进电机旋转 20 °,速度取值范围 1-10;

HA 测试
进入 HA 所在文件夹,打开 configuration.yaml 配置文件,添加数字显示控件和按钮控件
mqtt:
number:
- name: "Step Motor"
unique_id: stepper_angle
command_topic: "esp/stepper/cmd"
state_topic: "esp/stepper/status"
value_template: "{{ value_json.angle_done }}"
min: -360
max: 360
step: 1
unit_of_measurement: "°"
optimistic: false
button:
- name: "CW 90°"
command_topic: "esp/stepper/cmd"
payload_press: '{"angle":90,"speed":10}'
unique_id: stepper_cw_90
- name: "CCW 90°"
command_topic: "esp/stepper/cmd"
payload_press: '{"angle":-90,"speed":10}'
unique_id: stepper_ccw_90
保存更改并重新加载配置以应用更改;
进入 HA 概览页面,编辑仪表盘,添加卡片,找到新增的 Step Motor 实体和正反旋转按钮并添加。
流程图

控制面板
确认硬件连接完成且 MQTTX 通信测试无误;
点击 HA 卡片按钮,实现步进电机正反旋转的远程网络控制;

总结
本文介绍了 DFRobot FireBeetle 2 ESP32 P4 开发套件通过无线 WiFi 模块和 MQTT 协议实现 Home Assistant 远程控制步进电机旋转的项目设计,为该开发板在物联网和远程控制领域的应用提供了参考。
无垠的广袤2025.08.08
项目固件及烧录方式详见:https://makelog.dfrobot.com.cn/article-317940.html