项目标题:FastBond4挑战部分-基于ATOM Lite的RFID智能插座控制系统
该项目 使用了 M5Stack ATOM Lite开发板、ATOM SOCKET KIT继电器模块和Unit RFID2,__实现了__ 基于RFID身份识别的智能物联网插座控制系统的设计,
它的主要功能为:RFID刷卡控制、继电器控制、自动设备检测、RGB状态指示、物理按键备用控制
项目标签:FastBond ATOM 物联网 智能插座 RFID 身份识别
1.1 项目背景
在智能家居和物联网应用场景中,基于身份识别的设备控制是一个常见需求。传统的插座控制方式需要手动开关或使用遥控器,不够便捷且缺乏身份验证。本项目使用M5Stack ATOM Lite开发板配合ATOM SOCKET KIT和Unit RFID2,实现一款支持RFID身份识别的智能物联网插座控制系统,可通过刷卡方式控制插座通断,为智能家居场景提供安全便捷的电源控制方案。
1.2 项目目标
本项目使用M5Stack ATOM Lite开发板配合ATOM SOCKET KIT继电器模块和Unit RFID2,实现一款智能物联网插座控制器,主要功能如下:
- RFID身份识别:支持Unit RFID2读取ISO/IEC 14443 Type A/B标准卡片
- 多卡片控制:不同RFID卡片执行不同操作(ON卡开启、OFF卡关闭)
- 继电器控制:通过ATOM SOCKET KIT控制插座电源通断
- 自动设备检测:启动时自动检测I2C设备是否连接
- RGB状态指示:实时显示系统状态(绿=开启、红=关闭、蓝=待机、黄=未知卡片)
- 物理按键备用:内置按键可作为备用控制方式
- 防抖处理:按键防抖设计,避免误触发
- 未知卡片识别:自动输出未注册卡片的UID,方便添加新用户
1.3 创新点
- RFID身份识别控制:使用RFID卡片进行身份验证,提高系统安全性
- 多卡片权限管理:不同卡片对应不同操作权限
- 智能降级:RFID模块异常时可使用物理按键作为备用控制
- 模块化设计:代码采用类封装,便于扩展和维护
- 实时反馈:控制台实时显示设备状态、操作日志和未知卡片UID
- RGB状态可视化:通过LED颜色直观显示系统状态
二、硬件介绍
2.1 主控设备
M5Stack ATOM Lite (SKU: K001)
ATOM Lite是一款袖珍型物联网开发板,采用ESP32-PICO-D4作为主控芯片,体积小巧,功能强大。板载RGB LED(WS2812C-2020)和按键,支持Wi-Fi和蓝牙连接,非常适合物联网应用开发。

核心参数
参数 | 规格 |
|---|---|
型号 | K001 (ATOM Lite) |
主控芯片 | ESP32-PICO-D4 |
CPU | 双核 Xtensa LX6,240MHz |
Flash | 4MB |
Wi-Fi | 2.4 GHz Wi-Fi |
蓝牙 | Bluetooth 4.2 |
USB | USB Type-C |
人机交互
参数 | 规格 |
|---|---|
RGB LED | WS2812C-2020 |
按键 | 1个用户按钮 (G39) |
尺寸 | 24 × 24 × 14 mm |
扩展接口
参数 | 规格 |
|---|---|
Grove接口 | 1× HY2.0-4P |
GPIO | 可扩展多个外设 |
2.2 继电器模块
ATOM SOCKET KIT (SKU: K055)
ATOM SOCKET KIT是一款基于HLW8023的智能插座套件,集成了继电器控制功能,可直接控制家用电器的电源通断。

参数 | 规格 |
|---|---|
型号 | K055 |
继电器控制引脚 | G23 |
继电器类型 | 电磁继电器 |
最大负载 | 250VAC/10A |
功率计量芯片 | HLW8023 |
2.3 RFID读写器
Unit RFID2 (SKU: U031-B)
Unit RFID2是一款基于13.56MHz频率的射频识别读写单元。它内置WS1850S芯片,遵循ISO/IEC 14443 Type A/B标准,可支持MIFARE、NTAG等系列RFID卡的数据读写。单元通过I2C接口通信,读写距离小于20mm。

参数 | 规格 |
|---|---|
读写IC | WS1850S |
工作频率 | 13.56MHz |
通信接口 | I2C (地址: 0x28) |
支持协议 | ISO/IEC 14443 Type A/Type B |
读写距离 | < 20mm |
产品尺寸 | 48.0 x 24.0 x 8.0mm |
2.4 硬件连接
ATOM引脚 | 模块引脚 | 功能 |
|---|---|---|
G32 | SCL | I2C时钟线 (RFID2) |
G26 | SDA | I2C数据线 (RFID2) |
G23 | RELAY | 继电器控制 (ATOM SOCKET KIT) |
G39 | BTN | ATOM内置按键 |
G27 | RGB | WS2812 LED |
5V | VCC | 电源正极 |
GND | GND | 电源地 |
2.5 硬件框图
┌─────────────────────────────────────────────────────────────────────────┐
│ ATOM Lite 主控板 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ESP32 │ │RGB LED │ │按键 │ │USB-C │ │Grove │ │
│ │主控芯片 │ │WS2812 │ │G39 │ │接口 │ │I2C接口 │ │
│ │ │ │G27 │ │ │ │ │ │G32/G26 │ │
│ └────┬────┘ └─────────┘ └─────────┘ └─────────┘ └────┬────┘ │
│ │ G23 │ │
│ │ │ │
└───────┼──────────────────────────────────────────────────────┼──────────┘
│ │
│ 继电器控制 │ I2C通信
│ │
▼ ▼
┌───────────────────┐ ┌─────────────────────┐
│ ATOM SOCKET KIT │ │ Unit RFID2 │
│ (继电器模块) │ │ (RFID读写器) │
│ │ │ │
│ ┌─────────────┐ │ │ ┌───────────────┐ │
│ │继电器 │ │ │ │ WS1850S芯片 │ │
│ │HLW8023 │ │ │ │ I2C: 0x28 │ │
│ └─────────────┘ │ │ │ 13.56MHz │ │
└───────────────────┘ │ └───────────────┘ │
│ └─────────────────────┘
│ 控制插座电源 │
▼ │ 刷卡感应
┌───────────────────┐ │
│ 家用电器插座 │ ▼
│ (负载设备) │ ┌───────────────┐
└───────────────────┘ │ RFID卡片 │
│ (MIFARE/NTAG)│
└───────────────┘
三、方案框图和项目设计思路
3.1 系统架构
def handle_unknown_card():
print("=" * 40)
print(">>> UNKNOWN CARD DETECTED <<<")
print(">>> RFID卡号:", current_uid_str, "<<<")
print("=" * 40)
3.2 设备启动流程
def is_pressed(self):
current_state = self.btn.value() == 0
current_time = time.ticks_ms()
if current_state and not self._last_state:
if time.ticks_diff(current_time, self._last_press_time) > self._debounce_ms:
self._last_press_time = current_time
return True
self._last_state = current_state
return False
3.3 RFID卡片识别流程
from base import ATOMSocketBase
class RelayController:
def __init__(self):
self.socket = ATOMSocketBase(1, port=(22, 33), relay=23)
def on(self):
self.socket.set_relay(True)
def off(self):
self.socket.set_relay(False)
3.4 按键防抖算法
采用时间戳防抖算法:
- 防抖间隔:200ms
- 检测逻辑:按键按下时检查距离上次触发的时间间隔
- 触发条件:时间间隔大于防抖间隔才触发动作
四、原理图和PCB展示及介绍
4.1 硬件连接原理图
本项目使用M5Stack官方硬件,设计PCB方便硬件连接,采用I2C总线方式。


# 设备检测
devices = i2c_0.scan()
if 0x28 in devices:
rfid_0 = RFIDUnit(i2c_0)
print("RFID module initialized")
else:
print("RFID module NOT FOUND!")
rgb_led.on_red()
4.2 I2C通信协议
Unit RFID2 I2C通信协议:
参数 | 值 |
|---|---|
I2C地址 | 0x28 |
工作频率 | 13.56MHz |
通信协议 | ISO/IEC 14443 Type A/B |
==================================================
ATOM Lite RFID Relay Control
==================================================
I2C scan: ['0x28']
RFID module initialized
Relay module initialized
Button initialized
--------------------------------------------------
System Ready!
ON Card UID: BCB71007000000000000
OFF Card UID: 1C526C22000000000000
--------------------------------------------------
Card detected: BCB71007000000000000
>>> RELAY ON - Card: BCB71007000000000000
继电器: ON (通电)
Card detected: 1C526C22000000000000
>>> RELAY OFF - Card: 1C526C22000000000000
继电器: OFF (断电)
Card detected: A1B2C3D4000000000000
========================================
>>> UNKNOWN CARD DETECTED <<<
>>> RFID卡号: A1B2C3D4000000000000 <<<
========================================

五、软件流程图和关键代码介绍
5.1 主程序结构
def loop():
# 检测按键(手动切换继电器)
if btn.is_pressed():
relay.toggle()
# 扫描RFID卡片
if time.ticks_diff(current_time, last_scan_time) > SCAN_INTERVAL * 1000:
scan_rfid_card()
5.2 继电器控制器类
class RGBController:
"""ATOM Lite RGB LED控制器类"""
def on_green(self): # 继电器开启
def on_red(self): # 继电器关闭
def on_blue(self): # 待机状态
def on_yellow(self): # 未知卡片
5.3 RFID卡片处理
def handle_card_detected():
"""处理检测到的卡片"""
on_uid_str = uid_to_string(ON_CARD_UID)
off_uid_str = uid_to_string(OFF_CARD_UID)
if current_uid_str == on_uid_str:
handle_on_card() # 开启继电器
elif current_uid_str == off_uid_str:
handle_off_card() # 关闭继电器
else:
handle_unknown_card() # 输出未知卡片UID
5.4 RGB LED状态指示
class RelayController:
"""
使用官方ATOMSocketBase控制ATOM SOCKET KIT继电器模块
"""
def __init__(self, port=(22, 33), relay=23):
self.socket = ATOMSocketBase(1, port=port, relay=relay)
self._state = False
self.off()
def on(self):
"""打开继电器 (通电)"""
self.socket.set_relay(True)
self._state = True
def off(self):
"""关闭继电器 (断电)"""
self.socket.set_relay(False)
self._state = False
5.5 主循环逻辑
"""
@file rfid_atom_relay_control.py
@brief ATOM Lite RFID控制继电器系统
功能:使用不同RFID卡片控制ATOM SOCKET KIT继电器开关
- 卡片A (ON卡): 开启继电器
- 卡片B (OFF卡): 关闭继电器
"""
import M5
from hardware import Pin, I2C
from unit import RFIDUnit
from base import ATOMSocketBase
六、硬件功能展示图及说明

6.1 系统运行日志
# I2C初始化
i2c_0 = I2C(0, scl=Pin(32), sda=Pin(26), freq=100000)
# RFID模块初始化
rfid_0 = RFIDUnit(i2c_0)
# 检测新卡片
if rfid_0.is_new_card_present():
uid = rfid_0.read_card_uid()
6.2 RGB LED状态说明
LED颜色 | 状态 | 说明 |
|---|---|---|
蓝色 | 待机 | 系统正常运行,等待刷卡 |
绿色 | 开启 | 继电器已开启,插座通电 |
红色 | 关闭 | 继电器已关闭,插座断电 |
黄色 | 未知 | 检测到未注册卡片,短暂闪烁 |
6.3 RFID卡片配置
卡片类型 | UID | 功能 |
|---|---|---|
ON卡 | BCB71007000000000000 | 开启继电器 |
OFF卡 | 1C526C22000000000000 | 关闭继电器 |
未知卡 | 输出卡号,不执行操作 |
七、设计中遇到的难题和解决方法
7.1 RFID模块初始化
问题描述:RFID模块初始化失败,无法读取卡片。
解决方案:
- 使用正确的I2C引脚配置 (SCL=G32, SDA=G26)
- 启动时扫描I2C总线检测设备
- 检测失败时通过RGB LED红色报警
ATOM Lite
┌───────────┐
│ │
5V ──────────┤ 5V │
│ │
GND ──────────┤ GND │
│ │
G26 ──────────┤ G26 (SDA) │──────► Unit RFID2 SDA
│ │
G32 ──────────┤ G32 (SCL) │──────► Unit RFID2 SCL
│ │
G23 ──────────┤ G23 │──────► ATOM SOCKET KIT 继电器
│ │
G39 ──────────┤ G39 (BTN) │◄────── 内置按键
│ │
G27 ──────────┤ G27 (RGB) │──────► WS2812 LED
│ │
└───────────┘
│
│ I2C
│
▼
┌───────────┐
│ Unit RFID2│
│ 0x28 │
└───────────┘
7.2 ATOM SOCKET KIT控制
问题描述:直接使用Pin控制继电器可能不稳定。
解决方案:
- 使用官方ATOMSocketBase类控制继电器
- 正确的参数配置:
ATOMSocketBase(1, port=(22, 33), relay=23)
┌─────────────┐
│ 检测到卡片 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 读取卡片UID │
└──────┬──────┘
│
▼
┌─────────────┐
│ UID比对 │
└──────┬──────┘
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ ON卡匹配 │ │ OFF卡匹配 │ │ 未知卡片 │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 继电器开启│ │ 继电器关闭│ │ 输出UID │
│ 绿灯亮 │ │ 红灯亮 │ │ 黄灯闪烁 │
└──────────┘ └──────────┘ └──────────┘
7.3 按键防抖
问题描述:机械按键存在抖动,可能导致多次误触发。
解决方案:
- 采用时间戳防抖算法
- 设置200ms防抖间隔
- 使用ticks_ms进行精确计时
┌─────────────┐
│ 设备启动 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 初始化RGB │
│ LED(蓝色) │
└──────┬──────┘
│
▼
┌─────────────┐
│ 初始化I2C │
│ 总线 │
└──────┬──────┘
│
▼
┌─────────────┐
│ 扫描I2C设备 │
│ 检测RFID2 │
└──────┬──────┘
│
┌──────┴──────┐
│ │
▼ ▼
┌───────────┐ ┌───────────┐
│ RFID2已连 │ │ RFID2未连 │
│ 正常模式 │ │ 错误模式 │
└─────┬─────┘ └─────┬─────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 初始化继电器 │ │ RGB显示红色 │
│ 初始化按键 │ │ 程序退出 │
└──────┬──────┘ └─────────────┘
│
▼
┌─────────────┐
│ 主循环运行 │
│ 扫描RFID卡片 │
│ 检测按键输入 │
│ 控制继电器 │
└─────────────┘
7.4 未知卡片识别
问题描述:需要方便地添加新的RFID卡片。
解决方案:
- 检测到未知卡片时输出完整UID
- 格式化输出,便于复制粘贴
- RGB LED黄色闪烁提示
┌─────────────────┐
│ 用户操作 │
│ (RFID刷卡/按键) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ ATOM Lite │
│ (主控制器) │
└────────┬────────┘
│
┌───────────────┼───────────────┐
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Unit RFID2 │ │ ATOM SOCKET │ │ RGB LED │
│ (身份识别) │ │ KIT │ │ (状态指示) │
└─────────────┘ └──────┬──────┘ └─────────────┘
│
│ 电源控制
▼
┌─────────────────┐
│ 家用电器 │
│ (负载设备) │
└─────────────────┘
八、心得体会
8.1 项目收获
- RFID技术应用:深入理解了RFID身份识别技术在物联网中的应用
- 嵌入式编程:掌握了MicroPython在ESP32上的应用开发
- 模块化设计:学会了使用类封装硬件驱动,提高代码可维护性
- 官方库使用:实践了M5Stack官方驱动库的正确使用方法
8.2 技术亮点
- RFID身份识别:使用RFID卡片进行身份验证,提高系统安全性
- 多卡片权限管理:不同卡片对应不同操作权限
- 智能降级:RFID模块异常时可使用物理按键作为备用控制
- 模块化设计:代码采用类封装,便于扩展和维护
- RGB状态可视化:通过LED颜色直观显示系统状态
- 未知卡片识别:自动输出未注册卡片UID,方便添加新用户
8.3 改进建议
- 网络控制:添加Wi-Fi连接,支持远程控制插座
- 定时功能:实现定时开关功能,自动化控制家电
- 状态保存:断电后保存继电器状态,恢复供电后自动恢复
- OTA升级:支持远程固件升级,便于维护
- 安全加密:添加通信加密,提高系统安全性
- 功耗优化:实现低功耗模式,延长设备寿命
- 多设备支持:扩展支持多个插座同时控制
- 用户管理:实现动态用户添加/删除功能,无需修改代码
- 刷卡记录:记录每次刷卡时间和结果,便于审计
创意方向关联
基于本项目的技术实践,我们可以拓展到以下创意领域:
1. 智能门禁系统
RFID身份识别技术是门禁系统的核心:
- 办公室门禁:员工刷卡进入办公区域
- 家庭安防:家庭成员刷卡开门,陌生人报警
- 仓库管理:授权人员刷卡进入仓库区域
2. 电源 / 高功率应用 / GaN电源技术 / SiC技术
本项目的继电器控制技术是电源管理的核心:
- 高功率应用:继电器控制技术可扩展为工业级电源开关系统
- GaN电源技术:智能插座与GaN充电器结合,实现高效智能充电
- SiC技术应用:高功率智能插座需要SiC器件支持
3. 楼宇自动化
智能插座是楼宇自动化的核心组件:
- 智能家电控制:远程控制家电设备开关
- 能源管理:监测设备能耗,实现智能节能
- 定时控制:按计划自动控制设备运行
技术迁移价值
本项目开发的技术方案可迁移到:
- 门禁系统:RFID身份识别、权限管理、刷卡记录
- 电源应用:高功率开关、GaN/SiC智能控制
- 楼宇自动化:智能家电、能源管理、定时控制
致谢
感谢 DigiKey 和 电子森林 提供的FastBond4活动支持,本次活动链接:https://www.eetree.cn/page/digikey-fastbond