MCP23009E Arduino库
完整的Arduino库,用于控制具有GPIO配置、中断和Pin-compatible API的MCP23009E I/O扩展器。
特性
- ✅ 完全GPIO控制:将引脚配置为输入/输出、读/写级别
- ✅ 电阻:内置上拉支撑
- ✅ 中断支持:回调系统的硬件中断
- ✅ 针兼容API:
MCP23009Pin类类似于Arduino的数字引脚 - ✅ 主动低支撑:
MCP23009ActiveLowPin用于LED和类似负载 - ✅ 注册访问权限:用于高级使用的低级注册访问
安装
Arduino 集成开发环境
- 以ZIP格式下载此库
- 在Arduino IDE中: 草图 → 包含库 → 添加。ZIP库
- 选择下载的ZIP文件
平台IO
添加到您的 platformio.ini:
lib_deps =
https://github.com/steamicc/MCP23009E.git快速开始
基本用法
#include
#include
MCP23009E mcp(Wire, MCP23009_I2C_ADDR);
void setup() {
Serial.begin(115200);
mcp.begin(); // Initialize I2C and MCP23009E
// Configure a GPIO as input with pull-up
mcp.setup(7, MCP23009_DIR_INPUT, MCP23009_PULLUP);
// Read the level
uint8_t level = mcp.getLevel(7);
Serial.println(level ? "HIGH" : "LOW");
// Configure a GPIO as output
mcp.setup(0, MCP23009_DIR_OUTPUT);
mcp.setLevel(0, MCP23009_LOGIC_HIGH);
}
void loop() {
// Your code here
}针兼容API
#include
#include
MCP23009E mcp(Wire, MCP23009_I2C_ADDR);
// Create Pin objects (mode will be configured after I2C initialization)
MCP23009Pin button(mcp, 7);
MCP23009Pin led(mcp, 0);
void setup() {
Wire.begin();
mcp.begin();
// Configure pin modes after mcp.begin()
button.pinMode(INPUT_PULLUP);
led.pinMode(OUTPUT);
// Use just like Arduino digital pins!
led.high();
if (button.digitalRead() == LOW) {
led.low();
}
}
void loop() {
led.toggle();
delay(500);
}活动低LED
对于连接在VCC和GPIO之间的LED(推荐配置):
3.3V → [LED] → [Resistor 220-330Ω] → GPIO#include
#include
MCP23009E mcp(Wire, MCP23009_I2C_ADDR);
// Create active-low LED pin (logic is automatically inverted)
MCP23009ActiveLowPin led(mcp, 0);
void setup() {
Wire.begin();
mcp.begin();
// Configure pin mode after mcp.begin()
led.pinMode(OUTPUT);
}
void loop() {
led.high(); // LED turns ON (GPIO goes LOW)
delay(500);
led.low(); // LED turns OFF (GPIO goes HIGH)
delay(500);
}为什么活性低? MCP23009E每个引脚可以吸收25mA的电流,但只能产生约1mA的电流。主动低配置允许适当的LED亮度。
错误处理
所有I2C操作都会自动跟踪错误。关键操作后的检查:
#include
#include
MCP23009E mcp(Wire, MCP23009_I2C_ADDR);
void setup() {
Serial.begin(115200);
mcp.begin();
// Check if device is connected
if (!mcp.isConnected()) {
Serial.println("MCP23009E not found!");
Serial.print("Error code: ");
Serial.println(mcp.getLastError());
while(1); // Halt
}
// Configure GPIO and check for errors
mcp.setup(0, MCP23009_DIR_OUTPUT);
if (mcp.getLastError() != MCP23009_OK) {
Serial.println("Configuration failed!");
}
}
void loop() {
// Read and check for errors
uint8_t value = mcp.getLevel(7);
if (mcp.getLastError() == MCP23009_OK) {
Serial.println(value ? "HIGH" : "LOW");
} else {
Serial.println("Read error!");
}
delay(1000);
}API 参考
MCP23009E级
构造函数
MCP23009E(TwoWire& wire = Wire, uint8_t address = MCP23009_I2C_ADDR)主要方法
void begin(int resetPin = -1, int interruptPin = -1)-初始化设备void reset()-硬件复位(需要复位引脚)void setup(uint8_t gpx, uint8_t direction, uint8_t pullup, uint8_t polarity)-配置GPIOvoid setLevel(uint8_t gpx, uint8_t level)-设置输出电平uint8_t getLevel(uint8_t gpx)-读取输入电平
错误处理方法
MCP23009Error getLastError()-获取最后一个I2C错误代码void clearError()-清除错误状态bool isConnected()-检查设备是否在I2C总线上响应
错误代码:
MCP23009_OK (0)-成功MCP23009_ERROR_I2C_WRITE (1)-I2C写入失败MCP23009_ERROR_I2C_READ (2)-I2C读取失败MCP23009_ERROR_INVALID_PIN (3)-无效的引脚号MCP23009_ERROR_TIMEOUT (4)-I2C超时
中断方法
void interruptOnChange(uint8_t gpx, InterruptCallback callback)-注册更改回调void interruptOnFalling(uint8_t gpx, SimpleCallback callback)-注册下降沿回调void interruptOnRaising(uint8_t gpx, SimpleCallback callback)-注册上升沿回调void disableInterrupt(uint8_t gpx)-禁用GPIO上的中断bool processPendingInterrupts()- 在loop()中调用此函数 处理挂起的中断(如果已处理,则返回true)void handleInterrupt()-低级中断处理程序(通常不直接调用)
注册访问权限
setIODIR(),getIODIR()-I/O方向寄存器setGPPU(),getGPPU()-调出注册表setGPIO(),getGPIO()-GPIO注册- 还有更多。..
MCP23009引脚等级
构造函数
MCP23009Pin(MCP23009E& mcp, uint8_t pinNumber, uint8_t mode = INPUT)方法
void pinMode(uint8_t mode)-设置引脚模式(INPUT、OUTPUT、INPUT_PULLUP)void digitalWrite(uint8_t value)-写高或低uint8_t digitalRead()-读取引脚状态void high()-将引脚设置为高void low()-将引脚设置为低void toggle()-切换引脚状态void attachInterrupt(void (*callback)(), int mode)-附加中断void detachInterrupt()-断开中断
MCP23009有源低引脚类
继承自 MCP23009Pin 具有用于主动低负载的反向逻辑。
构造函数
MCP23009ActiveLowPin(MCP23009E& mcp, uint8_t pinNumber, uint8_t mode = OUTPUT)所有方法均与相同 MCP23009Pin,但逻辑会自动反转。
例子
该库包括几个示例:
基本示例
- 基础 -读取D-PAD按钮并打印状态
- LED_ActiveLow -控制LED处于活动低配置,并具有效果
- 错误处理 -演示I2C错误检测和处理
中断示例
- 中断基本 -使用一个按钮(下降/上升)进行简单的中断处理
- 中断多路按钮 -处理来自多个按钮的中断(CHANGE模式)
- 用Pin中断 -使用带中断和LED控制的Pin API
硬件注意事项
I2C地址
默认地址为 0x20。可以通过硬件引脚A0-A2进行更改。
当前限制
- 吸收电流(IOL):每个引脚最大25mA
- 源电流(IOH):每个引脚约1mA
推荐:对LED使用低电平配置(连接VCC和GPIO之间)。
引体向上
MCP23009E内置100kΩ上拉电阻器,每个引脚都可以启用。
兼容性
- 阿尔杜伊诺:所有支持I2C的板
- ESP32:已测试并正常工作
- ESP8266:已测试并正常工作
- STM32:已测试并正常工作
- 其他:应在任何具有Wire库的平台上工作
许可证
此库根据MIT许可证发布。有关详细信息,请参阅LICENSE文件。
鸣谢
基于MCP23009E的MicroPython驱动程序。
贡献
欢迎投稿!请在GitHub上打开问题或提交拉取请求。
