Limit or pullup low voltage from interrupt

Hi.

Im controlling an Adafruit Neotrellis button/led board with Teensy.40

https://learn.adafruit.com/adafruit-neotrellis

I have a 4 x 8 boards grid soldered together.

I have an issue with the interrupt pin.

If I load only 1 board ( thou they are soldered together) it works fine. I messured the interrupt pin voltage and get

Not button pressed     3.26 v
Button pressed             between 3.10 and 3.20 v and goes back to 3.26 v

If I load 32 boards and messure the interrupt pin voltage I get

 Not button pressed     3.26 v
 Button pressed             between 2.40 and 3.13 (mostly below 2.80) and back to 3.26v

But from time to time in this case the voltage goes down to 0.80 and stays there until I press again a few time and goes back up to 3.26v

I try PULL_UP in the code with no luck...

Any Idea?

What do you mean by "load" here. If they are all soldered together how does this differ from the 32 board case?

Did you check each board worked individually before soldering together?

Did you give each board a distinct I2C address?

Did you test regularly as you added more boards, or did you assemble them all before any testing of the multi-board setup [ if the latter, learn your lesson - test often during commissioning of complex systems ]

With "Load" I mean how many boards I activate in the code.

Each board has its individual address

I did not test the boards before soldering......

Isnt it possible to pullup with a resistor?

I gather you can program the interrupt behaviour of these boards - you've done this? I wonder if different boards are different (perhaps because one is faulty), leading to inconsistent behaviour.

I'd never have risked assembling 32 without testing each one first - I'd probably have then build pairs, tested them, then combine them to quads, tested them, then 8, then 16, then 32.

Yes you can add a pullup resistor, but its clearly already pulled up quite well (each board probably has weak pullup on the INT line).

Perhaps close visual inspection of all the connections is a good first step.

You didn't show us your code or a schematic...

It looks like these switches are wired as a matrix so they can't be used in a simple pull-up or pull-down circuit.

And they also use I2C so programming an interrupt probably isn't straightforward. And for more than one panel you might need the "seesaw" board. Do you have that?

From the Adafruit website:

Yes. I cheked all the connections, I dont see a problem. The thing is, loading only one board it works fine.....even thou is the same circuit...

/* This example shows basic usage of the NeoTrellis
  with the interrupt pin.
  The buttons will light up various colors when pressed.
*/

#include "Adafruit_NeoTrellis.h"

Adafruit_NeoTrellis trellis;

#define INT_PIN 8

// Input a value 0 to 255 to get a color value.
// The colors are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
   return trellis.pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return trellis.pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return trellis.pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

//define a callback for key presses
TrellisCallback blink(keyEvent evt){
  
  if(evt.bit.EDGE == SEESAW_KEYPAD_EDGE_RISING)
    trellis.pixels.setPixelColor(evt.bit.NUM, Wheel(map(evt.bit.NUM, 0, trellis.pixels.numPixels(), 0, 255))); //on rising
  else if(evt.bit.EDGE == SEESAW_KEYPAD_EDGE_FALLING)
    trellis.pixels.setPixelColor(evt.bit.NUM, 0); //off falling
    
  trellis.pixels.show();
  return 0;
}

void setup() {
  Serial.begin(9600);
  //while(!Serial);

  pinMode(INT_PIN, INPUT);
  
  if(!trellis.begin()){
    Serial.println("could not start trellis");
    while(1);
  }
  else{
    Serial.println("trellis started");
  }

  //activate all keys and set callbacks
  for(int i=0; i<NEO_TRELLIS_NUM_KEYS; i++){
    trellis.activateKey(i, SEESAW_KEYPAD_EDGE_RISING);
    trellis.activateKey(i, SEESAW_KEYPAD_EDGE_FALLING);
    trellis.registerCallback(i, blink);
  }

  //do a little animation to show we're on
  for(uint16_t i=0; i<trellis.pixels.numPixels(); i++) {
    trellis.pixels.setPixelColor(i, Wheel(map(i, 0, trellis.pixels.numPixels(), 0, 255)));
    trellis.pixels.show();
    delay(50);
  }
  for(uint16_t i=0; i<trellis.pixels.numPixels(); i++) {
    trellis.pixels.setPixelColor(i, 0x000000);
    trellis.pixels.show();
    delay(50);
  }
}

void loop() {
  if(!digitalRead(INT_PIN)){
    Serial.println("Test");
    trellis.read(false);
  }
  delay(2);
}

Cant I put some code after trellis.read(false); to stop the If function no matter what?

Activated is a better term than loaded. You load a board by drawing current from it!!

Does each board work OK when its the only one activated? How many boards do you have to activate to see the issue? Are you setting up the interrupt behaviour when you "activate" a board?

Yes. Every individual board works fine when activated alone.

When I activate about 12-16 the issue appears...

I just use the Adafruit code. I dont do anything alse to the interrupt code