小企业智能化
小微企业用 Wiegand 读卡器 + ESP32 搭建门禁考勤台账:刷卡上报、后台统计与异常告警
2026年9月28日
ESP32 接 Wiegand 读卡器上报刷卡记录,落库生成考勤台账并微信告警。
小微企业用 Wiegand 读卡器 + ESP32 搭建门禁考勤台账:刷卡上报、后台统计与异常告警
摘要:用 ESP32 接 Wiegand 26 读卡器读取工牌卡号,经 MQTT 上报到后台落库,自动生成考勤台账并在异常刷卡时微信告警,一套几百元就能落地的轻量门禁考勤方案。
一、场景与架构
小微企业常面临两件事:一是车间/仓库门禁谁进谁出说不清,二是考勤还停留在人工签到或昂贵的人脸机。其实一套 Wiegand 读卡器(几十元)+ ESP32(二十元)+ 一台云服务器,就能把"刷卡—上报—台账—告警"闭环做出来。架构很简单:读卡器吐 Wiegand 时序 → ESP32 解码出卡号 → 通过 MQTT 发到后台 → 后台写库并判断考勤状态 → 异常(非白名单、非工时刷卡)推企业微信。
二、硬件清单
- ESP32 开发板(带 Wi-Fi,推荐 ESP32-DevKitC)。
- Wiegand 26 读卡器(常见 13.56MHz IC 卡或 ID 卡读头,D0/D1 两线输出)。
- 5V 电源、防水接线盒、电磁锁/出门按钮(门禁联动时用)。
- 一台能跑 MQTT Broker 和 Web 后台的服务器(1 核 1G 足够)。
三、Wiegand 协议解析
Wiegand 用两根数据线 D0、D1,平时高电平。每 bit:D0 拉低表示 0,D1 拉低表示 1,脉冲宽约 50µs,bit 间隔至少 1ms。26 位格式为:1 位偶校验 + 8 位站点码 + 16 位卡号 + 1 位偶校验。实际取中间 16~24 位即可拿到卡号。解码核心是用中断捕获 GPIO 下降沿并按时间差拼位,超过 50ms 无新 bit 认为一帧结束。
四、ESP32 固件要点
用 Arduino 框架,把 D0、D1 配置为 INPUT_PULLUP 并挂中断。维护一个 bit 缓冲,每来一个下降沿根据引脚记录 0/1,用定时器(或 loop 里判断 millis 差值)在静默超时后组帧。示例片段:
volatile uint8_t buf[34]; volatile int cnt=0; unsigned long last=0;
void IRAM_ATTR onD0(){ if(cnt<34) buf[cnt++]=0; last=millis(); }
void IRAM_ATTR onD1(){ if(cnt<34) buf[cnt++]=1; last=millis(); }
// loop: if(cnt>0 && millis()-last>50){ 组帧; 解析卡号; cnt=0; }
得到卡号后用 PubSubClient 连 MQTT,主题 access/scan,payload 含 {"device":"door1","card":"123456","ts":1695000000}。建议给 ESP32 配固定 AP 或 Wi-Fi 断线自动重连,并在 MQTT 里用 Last-Will 标记设备离线。
五、MQTT 上报与后台落库
后台(Node.js/Python 均可)订阅 access/#,收到消息后:先查卡号是否在员工白名单;在则写 attendance 表(员工ID、刷卡时间、设备、方向);不在则写 unknown_card 表并触发告警。用 mosquitto 或 EMQX 作 broker,开启 auth 避免匿名写入。落库表结构至少含索引:卡号、时间,方便按日/月聚合。
六、考勤台账与异常告警
考勤逻辑:以上班 09:00、下班 18:00 为例,首刷记为上班、末刷记为下班,中间为在岗。后台定时(如每天 19:00)跑统计,输出每人出勤/迟到/缺勤日报。异常用企业微信群机器人 webhook 推送:陌生卡号、非工时(如凌晨)刷卡、同一卡号 1 分钟内重复刷,都即时告警并附设备位置。注意隐私合规:只存卡号不采人脸,台账本地留存并做好访问权限。
七、部署注意
- 读卡器线长别超建议距离(一般 30~50m),超长要加屏蔽和终端电阻,否则误码率高。
- ESP32 用看门狗定时复位,防止 Wi-Fi 假死。
- 门禁联动电磁锁务必加出门按钮和断电开锁,符合消防要求,别把人锁在里面。
小结
这条路子的好处是成本极低、协议开放、可自己改逻辑。核心难点在 Wiegand 时序解码的鲁棒性——务必处理好静默超时和帧校验,避免偶发卡号错乱。落库后考勤统计和告警都是标准 CRUD,配合企业微信机器人即可让老板随时收到异常提醒。