ESP32 and expander interupt inputs

Hi.

I'm trying to add 8 expander inputs with interupts, but with no luck.
I need to have the interrupts in CHANGE mode.
I use 2 expanders.
the function if(!digitalRead(digitalRead(INT_PIN))){ does not react as i would like it to.
What am i missing?

All the best.


#include <Adafruit_MCP23X17.h>
#include <Wire.h>

#define MCP_INT_ODR    false 

Adafruit_MCP23X17 mcp;
Adafruit_MCP23X17 mcp2;

#define MCP_LED1 0
#define MCP_LED2 1
#define MCP_LED3 2
#define MCP_LED4 3
#define MCP_LED5 4
#define MCP_LED6 5
#define MCP_LED7 6
#define MCP_LED8 7
#define MCP_LED9 8
#define MCP_LED10 9
#define MCP_LED11 10
#define MCP_LED12 11
#define MCP_LED13 12
#define MCP_LED14 13
#define MCP_LED15 14
#define MCP_LED16 15

#define MCP2_Encoder1 0
#define MCP2_Encoder2 1
#define MCP2_Encoder3 2
#define MCP2_Encoder4 3
#define MCP2_Encoder5 4
#define MCP2_Encoder6 5
#define MCP2_Encoder7 6
#define MCP2_Encoder8 7

#define INT_PIN 15 

void setup(){
  Serial.begin(115200);
  
  mcp.begin_I2C(0x20); 
  mcp2.begin_I2C(0x22);  
           
 
  mcp.pinMode(MCP_LED1, OUTPUT); 
  mcp.pinMode(MCP_LED2, OUTPUT); 
  mcp.pinMode(MCP_LED3, OUTPUT); 
  mcp.pinMode(MCP_LED4, OUTPUT); 
  mcp.pinMode(MCP_LED5, OUTPUT); 
  mcp.pinMode(MCP_LED6, OUTPUT); 
  mcp.pinMode(MCP_LED7, OUTPUT); 
  mcp.pinMode(MCP_LED8, OUTPUT); 
  mcp.pinMode(MCP_LED9, OUTPUT); 
  mcp.pinMode(MCP_LED10, OUTPUT); 
  mcp.pinMode(MCP_LED11, OUTPUT); 
  mcp.pinMode(MCP_LED12, OUTPUT); 
  mcp.pinMode(MCP_LED13, OUTPUT); 
  mcp.pinMode(MCP_LED14, OUTPUT); 
  mcp.pinMode(MCP_LED15, OUTPUT); 
  mcp.pinMode(MCP_LED16, OUTPUT); 

  mcp.digitalWrite(MCP_LED1,LOW);
  mcp.digitalWrite(MCP_LED2,LOW);
  mcp.digitalWrite(MCP_LED3,LOW);
  mcp.digitalWrite(MCP_LED4,LOW);
  mcp.digitalWrite(MCP_LED5,LOW);
  mcp.digitalWrite(MCP_LED6,LOW);
  mcp.digitalWrite(MCP_LED7,LOW);
  mcp.digitalWrite(MCP_LED8,HIGH);
  mcp.digitalWrite(MCP_LED9,LOW);
  mcp.digitalWrite(MCP_LED10,LOW);
  mcp.digitalWrite(MCP_LED11,LOW);
  mcp.digitalWrite(MCP_LED12,LOW);
  mcp.digitalWrite(MCP_LED13,LOW);
  mcp.digitalWrite(MCP_LED14,LOW);
  mcp.digitalWrite(MCP_LED15,LOW);
  mcp.digitalWrite(MCP_LED16,LOW);

  mcp2.pinMode(MCP2_Encoder1, INPUT_PULLUP); 
  mcp2.pinMode(MCP2_Encoder2, INPUT_PULLUP); 
  mcp2.pinMode(MCP2_Encoder3, INPUT_PULLUP);  
  mcp2.pinMode(MCP2_Encoder4, INPUT_PULLUP);  
  mcp2.pinMode(MCP2_Encoder5, INPUT_PULLUP); 
  mcp2.pinMode(MCP2_Encoder6, INPUT_PULLUP);  
  mcp2.pinMode(MCP2_Encoder7, INPUT_PULLUP);  
  mcp2.pinMode(MCP2_Encoder8, INPUT_PULLUP); 

  
  mcp.setupInterrupts(true, false, LOW);
  mcp.setupInterruptPin(MCP2_Encoder1, LOW);
}


void loop(){
  Serial.println("23017 Test");
  Serial.println(digitalRead(INT_PIN));
  if(!digitalRead(digitalRead(INT_PIN))){
    mcp.digitalWrite(MCP_LED8,HIGH);
    Serial.println("Interupted");
    Serial.println(mcp2.digitalRead(MCP2_Encoder1));
    mcp2.clearInterrupts();
    
  }
  
  delay(500);
  mcp.digitalWrite(MCP_LED8,LOW);
  delay(500);

}

What do you think this is going to do?

It will read INT_PIN which will result in a 1 or 0. It will then read port 1 or 0 and return the result to use as the if condition. I doubt this is what you intend.

1 Like

No way, a whole day, and i did'nt see that.

I can't wait to get back to it tomorrow afternoon.

Thanks

Well, that did'nt do it!

So it's working now, just some stupid mistakes.
I will put the working code here, if it can help somebody.

#include <Adafruit_MCP23X17.h>
#include <Wire.h>

#define MCP_INT_ODR    false 

Adafruit_MCP23X17 mcp;
Adafruit_MCP23X17 mcp2;

#define MCP_LED1 0
#define MCP_LED2 1
#define MCP_LED3 2
#define MCP_LED4 3
#define MCP_LED5 4
#define MCP_LED6 5
#define MCP_LED7 6
#define MCP_LED8 7
#define MCP_LED9 8
#define MCP_LED10 9
#define MCP_LED11 10
#define MCP_LED12 11
#define MCP_LED13 12
#define MCP_LED14 13
#define MCP_LED15 14
#define MCP_LED16 15

#define MCP2_Encoder1 0
#define MCP2_Encoder2 1
#define MCP2_Encoder3 2
#define MCP2_Encoder4 3
#define MCP2_Encoder5 4
#define MCP2_Encoder6 5
#define MCP2_Encoder7 6
#define MCP2_Encoder8 7

#define INT_PIN 13 

void setup(){
  Serial.begin(115200);
  
  mcp.begin_I2C(0x20); 
  mcp2.begin_I2C(0x22);  
           
 
  mcp.pinMode(MCP_LED1, OUTPUT); 
  mcp.pinMode(MCP_LED2, OUTPUT); 
  mcp.pinMode(MCP_LED3, OUTPUT); 
  mcp.pinMode(MCP_LED4, OUTPUT); 
  mcp.pinMode(MCP_LED5, OUTPUT); 
  mcp.pinMode(MCP_LED6, OUTPUT); 
  mcp.pinMode(MCP_LED7, OUTPUT); 
  mcp.pinMode(MCP_LED8, OUTPUT); 
  mcp.pinMode(MCP_LED9, OUTPUT); 
  mcp.pinMode(MCP_LED10, OUTPUT); 
  mcp.pinMode(MCP_LED11, OUTPUT); 
  mcp.pinMode(MCP_LED12, OUTPUT); 
  mcp.pinMode(MCP_LED13, OUTPUT); 
  mcp.pinMode(MCP_LED14, OUTPUT); 
  mcp.pinMode(MCP_LED15, OUTPUT); 
  mcp.pinMode(MCP_LED16, OUTPUT); 

  mcp.digitalWrite(MCP_LED1,LOW);
  mcp.digitalWrite(MCP_LED2,LOW);
  mcp.digitalWrite(MCP_LED3,LOW);
  mcp.digitalWrite(MCP_LED4,LOW);
  mcp.digitalWrite(MCP_LED5,LOW);
  mcp.digitalWrite(MCP_LED6,LOW);
  mcp.digitalWrite(MCP_LED7,LOW);
  mcp.digitalWrite(MCP_LED8,HIGH);
  mcp.digitalWrite(MCP_LED9,LOW);
  mcp.digitalWrite(MCP_LED10,LOW);
  mcp.digitalWrite(MCP_LED11,LOW);
  mcp.digitalWrite(MCP_LED12,LOW);
  mcp.digitalWrite(MCP_LED13,LOW);
  mcp.digitalWrite(MCP_LED14,LOW);
  mcp.digitalWrite(MCP_LED15,LOW);
  mcp.digitalWrite(MCP_LED16,LOW);

  mcp2.pinMode(MCP2_Encoder1, INPUT_PULLUP); 
  mcp2.pinMode(MCP2_Encoder2, INPUT_PULLUP); 
  mcp2.pinMode(MCP2_Encoder3, INPUT_PULLUP);  
  mcp2.pinMode(MCP2_Encoder4, INPUT_PULLUP);  
  mcp2.pinMode(MCP2_Encoder5, INPUT_PULLUP); 
  mcp2.pinMode(MCP2_Encoder6, INPUT_PULLUP);  
  mcp2.pinMode(MCP2_Encoder7, INPUT_PULLUP);  
  mcp2.pinMode(MCP2_Encoder8, INPUT_PULLUP); 

  pinMode(INT_PIN, INPUT);
  mcp2.readGPIOAB();
  mcp2.setupInterrupts(true, false, LOW);
  mcp2.setupInterruptPin(MCP2_Encoder1, CHANGE);
}


void loop(){
  if(!digitalRead(INT_PIN)){
    mcp.digitalWrite(MCP_LED8,HIGH);
    Serial.println("Interupted");
    Serial.println(mcp2.digitalRead(MCP2_Encoder1));
    mcp2.clearInterrupts();
  }
  
  delay(500);
  mcp.digitalWrite(MCP_LED8,LOW);
  

}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.