Использование нескольких чипов MCP23017 - решение проблемы - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь использовать несколько чипов 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()

1 Ответ

0 голосов
/ 07 ноября 2019

Решение 1: не используйте библиотеку Adafruit_MCP23017, напишите свою собственную.

Решение 2: добавьте в Adafruit_MCP23017.c (и объявление в Adafruit_MCP23017.h) функцию, которая обновит переменную i2caddr. Примерно так:

void Adafruit_MCP23017::setAddr(uint8_t addr) {
    if (addr < 8) {
      i2caddr = addr;
    }
}

это позволит вам изменить адрес на лету.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...