Я пытаюсь использовать несколько чипов mcp23017 параллельно, но не все время буду использовать одинаковое количество чипов. Мой код сделан для одного адреса, по умолчанию один ... но для использования нескольких адресов требуется объявить другой экземпляр mcp, каждый для всех существующих адресов? Потому что таким образом, если я использую 8 чипов, мой код будет очень очень большим ... Я могу каким-то образом использовать цикл, который ищет все адреса (сделано) и использует только один экземпляр mcp для всех адресов?
/*
Name : Program for MCP23017 uC with Arduino Board
Version : v1_01
Date : 26.06.2019
Author :
ALL RIGHTS RESERVED
NOTE : Install the Adafruit MCP23017 library
1. Open the Arduino IDE
2. Select 'Sketch' -> 'Include Library' -> 'Manage Libraries'
3. Search for '23017'
4. Click 'Install' button for the 'Adafruit MCP23017 Arduino Library...'
*/
// v1_02 - change commands handling
// v1_03 - add I2C Scanner
#include "Wire.h"
#include "Adafruit_MCP23017.h"
Adafruit_MCP23017 mcp; // Create mcp0 instance : Chip 0
int dly = 250;
void setup()
{
Serial.begin(9600);
Serial.println("Continental Timisoara - FF PSS ECC IE TE");
Wire.begin();
/// Scan I2C addresses
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.print(address);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
/// -------------------
mcp.begin(0); // Start mcp on Hardware address 0x20 ( all pins LOW )
for(int i = 0; i <= 7; i++)
{
mcp.pinMode(i, OUTPUT);
}
for(int i = 8; i <= 15; i++)
{
mcp.pinMode(i, INPUT);
}
}
void loop() {
if(Serial.available()>0)
{
String letter = "";
while(Serial.available()>0)
{
letter +=char(Serial.read());
delay(100);
}
// =========================================================================================
String Command = "";
Command = letter.substring(2,3);
String Reset = "";
Reset = letter.substring(1,4);
if (Command == "A")
{
String sOutput_Port = "";
sOutput_Port = letter.substring(4,5);
int iOutput_Port = sOutput_Port.toInt();
mcp.digitalWrite(iOutput_Port,HIGH);
int iInput_Port = iOutput_Port + 8;
if(mcp.digitalRead(iInput_Port)==HIGH)
{
String Show = "Channel ";
Show.concat(sOutput_Port);
Show.concat(" is ON");
Serial.println(Show);
}
else
{
Serial.println("NO VALIDATION");
}
}
if (Command == "I")
{
String sOutput_Port = "";
sOutput_Port = letter.substring(4,5);
int iOutput_Port = sOutput_Port.toInt();
mcp.digitalWrite(iOutput_Port,LOW);
int iInput_Port = iOutput_Port + 8;
if(mcp.digitalRead(iInput_Port)==LOW)
{
String Show = "Channel ";
Show.concat(sOutput_Port);
Show.concat(" is OFF");
Serial.println(Show);
}
else
{
Serial.println("NO VALIDATION");
}
}
if (Reset == "RST")
{
for(int i = 0; i <= 7; i++)
{
mcp.digitalWrite(i,LOW); // Set GPA0 to LOW
}
Serial.println("GPA0 is RESET to LOW");
}
// =========================================================================================
} // exit if(Serial.available()>0)
} // exit void loop()