零知派ESP32--通过I2C 接口扩展芯片PCF8575使用矩阵键盘控制LED
项目概述本项目以ESP32为主控通过I2C 接口扩展芯片 PCF8575将有限的主控引脚扩展为 16 路数字 I/O并在其上挂载模块作用4×4 矩阵键盘人机输入控制灯效与工作模式2 路高电平 LED状态指示 / 感应联动照明RGB 三色灯模块多色彩显示与颜色轮播SR505 人体感应有人自动开灯、无人自动灭灯ST7789 1.3 寸屏240×240实时显示模式、灯态、感应状态系统上电后默认进入AUTO人体感应模式有人靠近时两路 LED 点亮人离开后熄灭。同时可通过矩阵键盘切换到MANUAL手动模式独立控制 LED、RGB 颜色与轮播。核心目标在一块扩展芯片上同时演示I2C 通信、数字输出驱动、数字输入采集、矩阵键盘扫描、传感器联动与图形界面刷新。项目亮点一芯多用键盘扫描输入、LED/RGB 驱动输出、人体感应采集输入全部走 PCF8575充分展示 I/O 扩展器的双向能力。AUTO / MANUAL 双模式感应自动控灯与按键手动控灯可一键切换互不抢占 RGB。矩阵键盘完整消抖 边沿触发按一下只触发一次不会连发。RGB 独立轮播按键C控制颜色循环与感应模式解耦避免彩灯干扰 PIR。ST7789 卡片式 UI240×240 方形屏上分区显示 MODE / LED / RGB / PIR状态变化即时刷新、不整屏闪烁。接线容错键盘排线反向P17→P10时仅改掩码数组即可适配无需重插线。项目难点及解决方案难点现象解决方案PCF8575 高电平驱动能力弱LED 极暗甚至几乎不亮输出引脚与 VCC 之间加330Ω~1kΩ 上拉电阻写 1 时由电阻供电流写 0 时芯片灌电流关灯矩阵键盘与 LED 同芯片扫描键盘时误把 LED 熄灭所有写端口统一走writePort()始终保留当前ledState/rgbIndexRGB 点亮干扰 SR505开 RGB 后 PIR 一直判“有人”感应模式只控制两路 LED不驱动 RGBRGB 由按键C/0~7独立控制按键连发 / 抖动一次按下触发多次20ms 软件消抖 仅在“按下边沿”调用onKeyPressed()键盘排线方向反了按键识别错位用ROW_MASKS/COL_MASKS映射实际引脚代码适配硬件屏幕频繁全刷闪烁UI 闪、观感差静态背景只画一次drawStaticUI状态区脏标记刷新displayDirtySR505 供电不稳亮灯后 OUT 粘高、关不掉保证模块VCC 接牢 5VGND 共地必要时电源脚加滤波电容一、硬件系统部分1.1 硬件清单名称规格 / 说明数量零知ESP32 开发板带 USB 下载I2C 默认 GPIO21/221零知ESP32 扩展板带屏幕接口方便接线1PCF8575 模块I2C 16 位 I/O 扩展默认地址 0x2014×4 薄膜矩阵键盘8 线排针无源1高电平触发 LED 模块单路信号 VCC/GND2RGB LED 模块R/G/B 三路独立共阴或模块 GND1SR505 人体感应模块工作电压约 4.5~20VOUT 数字输出1ST7789 彩屏240×240SPITFT_eSPI 驱动1杜邦线、面包板—若干1.2 接线方案1ESP32 ↔ PCF8575I2CESP32PCF8575GPIO21SDASDAGPIO22SCLSCL5VVCCGNDGND2PCF8575 外设分配PCF8575 引脚外设方向P00LED1 信号输出P01LED2 信号输出P02RGB-R输出P03RGB-G输出P04RGB-B输出P05SR505 OUT输入P06、P07未用—P17~P14键盘行 R1~R4输出扫描P13~P10键盘列 C1~C4输入读取34×4 键盘排线对应关系本工程实际接法键盘正面朝上、排线朝下从左到右 8 根线排线左 → 右R1 R2 R3 R4 C1 C2 C3 C4 接 PCF8575 P17 P16 P15 P14 P13 P12 P11 P101.3 硬件连接图┌─────────────┐ │ ESP32 │ │ SDAGPIO21 ├──┐ │ SCLGPIO22 ├──┼── I2C 总线 │ SPI → TFT │ │ └──────┬──────┘ │ │ │ ┌────────────┴───┐ │ │ ST7789 240² │ │ │ (TFT_eSPI) │ │ └────────────────┘ │ │ ┌────────────────┴──────┐ │ PCF8575 0x20 │ │ │ P00 ──[上拉]── LED1 │ P01 ──[上拉]── LED2 │ P02 ──[上拉]── RGB R │ P03 ──[上拉]── RGB G │ P04 ──[上拉]── RGB B │ P05 ────────── SR505 OUT (→5V) │ P17..P14 ───── 键盘行 R1..R4 │ P13..P10 ───── 键盘列 C1..C4 │ └───────────────────────┘系统数据流示意1.4 实物连接图二、软件架构设计2.1 系统初始化setup初始化顺序与代码一致打开串口115200tft.init()setRotation()调用drawStaticUI()画静态背景Wire.begin(21, 22)I2C 时钟 100kHz探测 PCF8575 地址0x20是否应答writePort(0xFF00)LED/RGB 灭行列写 1P05~P07 保持输入读取一次 PIR 电平置displayDirty等待主循环刷新动态区2.2 主循环逻辑loop每个循环周期约 5ms 间隔依次执行A[scanMatrix 扫描键盘] -- B[消抖 边沿检测]B --|确认按下| C[onKeyPressed]B -- D{autoMode?}D --|是| E[handleMotion 有人开灯/无人灭灯]D --|否| F[跳过感应]E -- G[handleRgbCycle]F -- GG -- H[每 200ms 采样 PIR 电平]H -- I{displayDirty?}I --|是| J[updateDisplay]I --|否| K[delay 5ms]J -- K设计要点键盘优先先扫键再处理感应保证按键响应及时脏标记刷新只有状态变化才重画动态卡片降低 SPI 负担感应与 RGB 解耦handleMotion只改ledState不改rgbIndex三、代码拆分讲解3.1 底层读写 PCF8575void writePCF8575(uint16_t value); // 先低字节 P00-P07再高字节 P10-P17 uint16_t readPCF8575(); // requestFrom 2 字节拼成 16 位writePort(rowColBits)是关键写出口高字节负责行列扫描低字节始终合并ledBits()LED1/2 RGB 三通道UNUSED_LOWP05~P07 写 1保证 PIR 可被外部驱动3.2 矩阵键盘扫描scanMatrix逐行将对应行掩码拉低其余行/列写 1延时约 500µs 等待稳定读端口列位为 0 表示该键按下扫完后恢复行列全 1并保持 LED/RGB 状态不变消抖在loop中完成电平变化后稳定 ≥20ms且仅在按下瞬间触发事件。3.3 按键事件onKeyPressed按键行为0~7直接设 RGB 颜色关闭轮播A/B切换 LED1 / LED2并退出 AUTOC开关 RGB 轮播开从红色起每秒换色关RGB 熄灭D切换 AUTO / MANUAL#LED 全亮 RGB 白退出 AUTO停轮播*全灭退出 AUTO停轮播3.4 人体感应handleMotion读 P05 → 50ms 消抖得到motionStabletrueledState 0x03两灯亮falseledState 0x00两灯灭不修改 RGB进入 AUTO 时setAutoMode(true)会故意翻转一次稳定态强制按当前传感器电平立刻同步灯态。3.5 RGB 轮播handleRgbCyclergbCycle true时每 1000msrgbIndex在 1~7 循环红→绿→黄→蓝→紫→青→白。3.6 屏幕显示drawStaticUI()背景、顶栏、分区标签只跑一次updateDisplay()刷新 MODE / LED 圆点 / RGB 色点与名称 / PIR 状态与OUT:H/L四、操作过程及数据展示4.1 操作步骤接线检查I2CSDA/SCL、共地LED/RGBIN→P00/P01/P02/P03/P04SR505→5VOUT→P05-→GND键盘左→右接 P17→P10编译烧录开发板选 零知ESP32波特率 115200打开串口监视器应看到PCF8575 OK.与Ready.功能验证步骤操作预期现象①上电默认 AUTO屏显 MODEAUTO挥手 LED 亮离开后灭PIR 显示 MOTION/IDLE②按A/B进入 MANUAL对应 LED 翻转③按1~7RGB 变为对应颜色屏上颜色名同步④按CRGB 开始轮播屏显 CYCLE再按C停止并熄灭⑤按D在 AUTO / MANUAL 间切换⑥按#/*全开白/ 全关屏幕与串口对照屏右上角显示最近按键字符串口打印Key: x LED1:.. LED2:.. RGB:.. Auto:ON/OFF感应动作打印[Auto] Motion - LEDs ON/Idle - LEDs OFF按键速查表[1] [2] [3] [A] 0~7 : RGB 定色停轮播 [4] [5] [6] [B] A/B : LED1 / LED2 切换进 MANUAL [7] [8] [9] [C] C : RGB 轮播开关 [*] [0] [#] [D] D : AUTO / MANUAL #/* : 全开 / 全关4.2 演示视频零知派ESP32--通过PCF8575使用矩阵键盘控制LED五、技术原理5.1 工作原理1PCF8575 准双向口写1引脚为弱上拉/高阻输入态可被外部拉低也可外加上拉电阻对外供电写0强下拉灌电流能力强适合关断高电平 LED因此“高电平点亮 LED”必须外加电阻不能指望芯片内部弱上拉直接点灯2矩阵键盘扫描行列交叉处按下时被拉低的行会把对应列线拉低。MCU 逐行输出低电平并读列即可定位键位再经KEYMAP映射为0‘9’、‘A’D、*、#。3SR505 人体感应热释电传感器检测人体红外变化。检测到运动时 OUT 输出高电平并保持约数秒硬件固定SR505 一般不可调电位器。本工程以该数字电平作为“有人/无人”依据。4I2C 多设备与 SPI 屏PCF8575 独占 I2C本工程地址 0x20ST7789 走 SPI与 I2C 总线分离互不抢总线5.2 工作模式配置模式进入方式LEDRGB说明AUTO上电默认 / 按D切入由 SR505 自动控制不联动仍可用C/0~7手动控屏显绿色 AUTOMANUAL按A/B/#/*或D切出按键手动按键手动屏显橙色 MANUAL相关宏配置可按硬件微调#define PCF8575_ADDR 0x20 // I2C 地址A0/A1/A2 接地时通常为 0x20 #define LED_ACTIVE_LOW 0 // 0高电平亮上拉接法1低电平亮灌电流接法 #define MOTION_ACTIVE_HIGH 1 // 1OUT 高表示有人模块相反则改 0 const uint32_t MOTION_DEBOUNCE_MS 50; const uint32_t DEBOUNCE_MS 20;键盘引脚映射本工程反向排线ROW_MASKS {P17, P16, P15, P14}; COL_MASKS {P13, P12, P11, P10};六、常见问题指引Q1串口提示PCF8575 not found at 0x20检查 SDA/SCL 是否接 GPIO21/22、模块供电与共地用 I2C 扫描确认实际地址若跳线改地址同步改PCF8575_ADDR。Q2按键识别错位按 1 变成别的键排线方向或行列对调。对照本文 1.2 节改线或只改ROW_MASKS/COL_MASKS/KEYMAP。Q3按一下键触发很多次确认使用的是边沿触发消抖逻辑机械抖动过大时可把DEBOUNCE_MS提到 30~50。

相关新闻

构建Codex Harness:驾驭AI代码生成,实现工程化与自动化测试

构建Codex Harness:驾驭AI代码生成,实现工程化与自动化测试

最近在推进一个大型项目的代码生成与自动化测试框架时,团队反复在代码一致性、测试覆盖率和工程规范落地这几个环节上卡壳。零散的脚本和工具链难以形成闭环,导致开发效率提升有限。本文将围绕“Codex Harness”这一工程化实践的核心概念,系统…

2026/10/13 22:01:49 阅读更多 →
AI如何成为调试伙伴:从日志分析到嵌入式开发的脑力延伸实践

AI如何成为调试伙伴:从日志分析到嵌入式开发的脑力延伸实践

1. 从工具到伙伴:重新定义调试中的AI角色最近和几个搞嵌入式、后端和算法的朋友聊天,发现一个挺有意思的现象:大家一提到用AI辅助调试,第一反应要么是“让AI帮我写个bug定位脚本”,要么是“把报错信息丢给ChatGPT让它给…

2026/10/13 22:02:12 阅读更多 →
LlamaIndex实战指南:从RAG原理到智能文档问答系统构建

LlamaIndex实战指南:从RAG原理到智能文档问答系统构建

1. 从“数据孤岛”到“智能问答”:为什么我们需要LlamaIndex?如果你最近在折腾大语言模型(LLM),比如用ChatGPT的API或者本地部署的开源模型,你大概率会遇到一个非常具体且头疼的问题:我有一堆自…

2026/10/3 15:04:34 阅读更多 →

最新新闻

Python Plotly交互式数据可视化:从快速出图到精细定制

Python Plotly交互式数据可视化:从快速出图到精细定制

做数据分析的同学都有一个共同感受:数据算完之后,最头疼的不是处理逻辑,而是怎么把结果变成一张别人一眼能看懂的图。这两年我用得最顺手的工具就是 Plotly,一个典型的 Python 交互式绘图库。用 Plotly 创建交互式图表&#xff0c…

2026/10/13 22:03:47 阅读更多 →
基于Spring Boot和Vue的电影订票管理系统全栈项目

基于Spring Boot和Vue的电影订票管理系统全栈项目

每年做课程设计或者毕业设计的季节,总有人问我"有没有一个既能体现技术栈又不算太复杂、最好还带完整界面的项目"。老实说,这类需求里出镜率最高的就是各种"管理系统",而其中电影订票管理系统又是一直没凉过的经典选题。…

2026/10/13 22:03:47 阅读更多 →
机器学习集成学习实战:三大流派与工程应用

机器学习集成学习实战:三大流派与工程应用

集成学习这几年在机器学习面试和实际工程里都是绕不开的东西。不管你是刚开始学模型,还是已经在跑实验,迟早会遇到一个问题:单个模型的效果到了瓶颈,怎么再往上提一点?很多人第一反应是换更复杂的模型,但更…

2026/10/13 22:03:47 阅读更多 →
WEKA数据挖掘入门:从ARFF格式到J48决策树与交叉验证实战

WEKA数据挖掘入门:从ARFF格式到J48决策树与交叉验证实战

简介:一份面向数据挖掘初学者与课程学习者的WEKA中文详细教程PPT,围绕怀卡托智能分析环境(WEKA)的开源特性、获得ACM SIGKDD奖项的里程碑地位及常见应用场景展开,适合作为高校数据挖掘、机器学习课程的配套讲义或自学入…

2026/10/13 22:03:47 阅读更多 →
支付系统设计与落地:状态机、幂等、对账与避坑指南

支付系统设计与落地:状态机、幂等、对账与避坑指南

线下业务上线支付系统的那段时间,几乎每天都要和数据、异常单、渠道对账单较劲。当时踩过的坑、重构过的状态机、跟渠道商务来回确认的限额规则,后来都沉淀成了这套经验。今天不聊架构图,也不念文档,就实打实拆一下“支付系统”从…

2026/10/13 22:03:47 阅读更多 →
同花顺日线文件解析:从二进制乱码到可回测的OHLCV表

同花顺日线文件解析:从二进制乱码到可回测的OHLCV表

简介:这份资源面向金融数据分析初学者与量化爱好者,聚焦同花顺日线二进制文件(.day)的解析问题。压缩包仅4KB,内含2个文件:一个以600000为代码的日线样本文件,以及一份约20行的Python解析脚本&a…

2026/10/13 22:02:46 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →