如何在 adafruit mcp23017.h 库中使用多个 mcp23017 芯片

How to use Multiple mcp23017 chips with the adafruit mcp23017.h library

我一直在为我的 arduino ATMega2560 试验 I2C 和 mcp23017 IO 扩展器芯片,因为我宁愿将 arduino 上的 IO 用于其他事情我只是弄清楚如何使用 adafruit mcp23017.h 库,无法弄清楚如何解决多个 mcp23017 芯片以及如何单独使用这些引脚这是我编辑的按钮库中的代码。

我希望能够对单个芯片和引脚进行寻址我不太确定在设置中如果连接了多个芯片并在代码中寻址,IO 的引脚模式是否从 0 到 15 按顺序上升.例如,如果第一个芯片被寻址为 0x20 并且 IO 编号计数为 0 - 15,如果我添加另一个芯片并将其寻址为 0x21,那么计数将从 0 - 15 变为 0 - 31。

#include <Wire.h>
#include "Adafruit_MCP23017.h"

//pin 1 and 0 are mcp pins not arduino IO pins

Adafruit_MCP23017 mcp;

void setup() {  
mcp.begin();      // use default address 0

mcp.pinMode(0, INPUT);
mcp.pinMode(1, OUTPUT);
Serial.begin(9600);

pinMode(13, OUTPUT);  // use the p13 LED as debugging
}



void loop() {
// The LED will 'echo' the button
digitalWrite(13, mcp.digitalRead(0)); //Writes pin 13 to the reading of pin    0
mcp.digitalWrite(1, mcp.digitalRead(0)); //Writes pin 1 to the reading of 0
if(mcp.digitalRead(1) == HIGH){ //if pin 1 == high serialprint led whent   high
Serial.println("Led whent HIGH");
}
}

每个芯片都必须有唯一的地址,根据 Microchip's manual 第 8 页,这是可行的。因此,首先,您应该在硬件布局中设置不同的地址。

您还应该为每个要使用的芯片创建一个 Adafruit_MCP23017 对象,并在您的代码中设置相应的地址。

在这种情况下,所有芯片的引脚地址都在 0-15 范围内。要更改 pin 的状态,您应该参考特定实例。


更新

这是你的起点

#include "Adafruit_MCP23017.h"
Adafruit_MCP23017 mcp1;
Adafruit_MCP23017 mcp2;
Adafruit_MCP23017 mcp3;
#define addr1 0x00
#define addr2 0x01
#define addr3 0x02
void setup() {
 mcp1.begin(addr1);
 mcp2.begin(addr2);
 mcp3.begin(addr3);
}

void loop() {


}

我终于可以使用我的代码了!最后它比我更简单,我可能没有给出足够好的解释来说明我的代码应该实现什么这是我的代码。

#include "Adafruit_MCP23017.h"
Adafruit_MCP23017 mcp1;
Adafruit_MCP23017 mcp2;
void setup() {
mcp1.begin(0);
mcp2.begin(1);

mcp1.pinMode(0, INPUT);
mcp1.pinMode(1, OUTPUT);
mcp2.pinMode(1, OUTPUT);
Serial.begin(9600);
pinMode(13, OUTPUT);
}

void loop() {
mcp2.digitalWrite(1, mcp1.digitalRead(0));
digitalWrite(13, mcp1.digitalRead(0));
mcp1.digitalWrite(1, mcp1.digitalRead(0));
if(mcp1.digitalRead(1) == HIGH){
Serial.println("Led whent HIGH");
}
}

问题是我只声明了 1 个 mcp,感谢 Vladimir Tsykunov 我现在知道我需要一个 mcp1 和 mcp2,现在可以在我的功能代码中看到我可能 运行 遇到问题未来我没有修改过的东西但是对于这个项目它现在正在工作。

我与 7 MCP23017 chip , 7x14 pins=98 pins using adafruit library 分享我的解决方案。

连接:

addr 0 = A2 low , A1 low , A0 low  000
addr 1 = A2 low , A1 low , A0 high 001
addr 2 = A2 low , A1 high , A0 low  010
addr 3 = A2 low , A1 high , A0 high  011
addr 4 = A2 high , A1 low , A0 low  100
addr 5 = A2 high , A1 low , A0 high  101
addr 6 = A2 high , A1 high , A0 low  110
addr 7 = A2 high, A1 high, A0 high 111

Connect pin #12 of the expander to Analog 5 (i2c clock)
Connect pin #13 of the expander to Analog 4 (i2c data)
Connect pins #15, 16 and 17 of the expander to ground (address selection)
Connect pin #9 of the expander to 5V (power) // operation voltage is 1.8 to 5.5
Connect pin #10 of the expander to ground (common ground)
Connect pin #18 through a ~10kohm resistor to 5V (reset pin, active low)

Input #0 is on pin 21 so connect a button or switch from there to ground

代码:

#include <Adafruit_MCP23017.h>


Adafruit_MCP23017 mcp1; // chip 1
Adafruit_MCP23017 mcp2; // chip 2

#define addr1 7 // 7 = A2 high, A1 high, A0 high
#define addr2 0 // 0 = A2 low, A1 low, A0 low
void setup() 
  {
    Serial.begin(9600); 
    mcp1.begin(addr1);
    mcp2.begin(addr2);

    mcp1.pinMode(0, INPUT); //pin 21 on chip
    mcp2.pinMode(0, INPUT); //pin 21 on chip

  } 

  void loop()
  { 
      if(mcp1.digitalRead(0)== HIGH )
      Serial.println("HIGH"); 
      delay(1000);

      if(mcp2.digitalRead(0)== HIGH )
      Serial.println("HIGH 2"); 
      delay(1000);
  }