user3415: I've been going through my program again and again, and I can't figure out what is causing it not to work as intended.  First, the story: I'm trying to use an Arduino to control a bunch of relays which are controlling sockets (8 of them). I want to use an Adafruit Trellis LED panel/switches to do this. Basically, when the button is pressed, the LED lights up and the relay gets tripped.  Pressing it again does the reverse.
I will provide my code for inspection.
#include <Wire.h>
#include "Adafruit_Trellis.h"

/***************************************************
This example shows reading buttons and setting/clearing buttons in a loop
"momentary" mode has the LED light up only when a button is pressed
"latching" mode lets you turn the LED on/off when pressed

Up to 8 matrices can be used but this example will show 4 or 1
****************************************************/

#define MOMENTARY 0
#define LATCHING 1
// set the mode here
#define MODE LATCHING 


Adafruit_Trellis matrix0 = Adafruit_Trellis();

// uncomment the below to add 3 more matrices
/*
Adafruit_Trellis matrix1 = Adafruit_Trellis();
Adafruit_Trellis matrix2 = Adafruit_Trellis();
Adafruit_Trellis matrix3 = Adafruit_Trellis();
// you can add another 4, up to 8
*/

// Just one
Adafruit_TrellisSet trellis = Adafruit_TrellisSet(&matrix0);
// or use the below to select 4, up to 8 can be passed in
//Adafruit_TrellisSet trellis =  Adafruit_TrellisSet(&matrix0, &matrix1, &matrix2, &matrix3);

// set to however many you're working with here, up to 8
#define NUMTRELLIS 1

#define numKeys (NUMTRELLIS * 16)

// Connect Trellis Vin to 5V and Ground to ground.
// Connect the INT wire to pin #A2 (can change later!)
#define INTPIN A2
// relay pins
#define relay1 2
#define relay2 3
#define relay3 4
#define relay4 5
#define relay5 6
#define relay6 7
#define relay7 8
#define relay8 9
int i = 0;


// Connect I2C SDA pin to your Arduino SDA line
// Connect I2C SCL pin to your Arduino SCL line
// All Trellises share the SDA, SCL and INT pin! 
// Even 8 tiles use only 3 wires max


void setup() {
    Serial.begin(115200);
    Serial.println("Trellis on");

    // INT pin requires a pullup
    pinMode(INTPIN, INPUT);
    //relay pins
    pinMode(relay1, OUTPUT);
    pinMode(relay2, OUTPUT);
    pinMode(relay3, OUTPUT); 
    pinMode(relay4, OUTPUT);
    pinMode(relay5, OUTPUT);
    pinMode(relay6, OUTPUT);
    pinMode(relay7, OUTPUT);
    pinMode(relay8, OUTPUT);

    digitalWrite(INTPIN, HIGH);

    // begin() with the addresses of each panel in order
    // I find it easiest if the addresses are in order
    trellis.begin(0x70);  // only one
    // trellis.begin(0x70, 0x71, 0x72, 0x73);  // or four!

    // light up all the LEDs in order
    for (uint8_t i = 0; i < numKeys; i++) {
        trellis.setLED(i);
        trellis.writeDisplay();
        delay(50);
    }
    // then turn them off
    for (uint8_t i = 0; i < numKeys; i++) {
        trellis.clrLED(i);
        trellis.writeDisplay();
        delay(50);
    }
}

void toggleLight(int i){
    if (trellis.isLED(i))
        trellis.clrLED(i);
    else
        trellis.setLED(i);

}

void loop() {
    delay(30); // 30ms delay is required, dont remove me!
    //init relay states
    static int relay1state = 0;
    static int relay2state = 0;
    static int relay3state = 0;
    static int relay4state = 0;
    static int relay5state = 0;
    static int relay6state = 0;
    static int relay7state = 0;
    static int relay8state = 0;

    if (MODE == MOMENTARY) {
        // If a button was just pressed or released...
        if (trellis.readSwitches()) {
            // go through every button
            for (uint8_t i = 0; i < numKeys; i++) {
                // if it was pressed, turn it on
                if (trellis.justPressed(i)) {
                    Serial.print("v"); Serial.println(i);
                    trellis.setLED(i);
                }
                // if it was released, turn it off
                if (trellis.justReleased(i)) {
                    Serial.print("^"); Serial.println(i);
                    trellis.clrLED(i);
                }
            }
            // tell the trellis to set the LEDs we requested
            trellis.writeDisplay();
        }
    }

    if (MODE == LATCHING) {
        // If a button was just pressed or released...
        if (trellis.readSwitches()) {
            // go through every button
            for (i; i < numKeys; i++) {
                // if it was pressed...
                if (trellis.justPressed(i)) {

                    switch (i)
                    {
                    case '0':
                        relay1state ^= 1; // xor current value with 1 (causes value to toggle)
                        if (relay1state) {
                            delay(100);
                            digitalWrite(relay1, HIGH);
                            toggleLight(i);
                            Serial.println("Outlet 1 on");
                            break;
                        }
                        else {
                            delay(100);
                            digitalWrite(relay1, LOW);
                            toggleLight(i);
                            Serial.println("Outlet 1 off");
                            break;
                        }

                    case '1':
                        relay2state ^= 1; // xor current value with 1 (causes value to toggle)
                        if (relay2state) {
                            delay(100);
                            digitalWrite(relay2, HIGH);
                            toggleLight(i);
                            Serial.println("Outlet 2 on");
                            break;
                        }
                        else {
                            delay(100);
                            digitalWrite(relay2, LOW);
                            toggleLight(i);
                            Serial.println("Outlet 2 off");

                            break;
                        }
                        //...add case 3-8 & 9-15
                    }
                    trellis.writeDisplay();
                }
            }
        }

    }
}


user2967: Stepping back from your code problems, why are you using relays? Do you mean electromechanical relays? Those draw a lot of current and you need to wire them with a protection diode so they don't destroy the control circuit when you disconnect the power and the inductive field on the relay coil collapses.
If you're switching AC power, mechanical relays are a reasonable way to go, but for DC like motors/LEDs, etc, it's usually better to use electronic switches of some kind (e.g. transistors).

3415: <p>I've been going through my program again and again, and I can't figure out what is causing it not to work as intended.  First, the story: I'm trying to use an Arduino to control a bunch of relays which are controlling sockets (8 of them). I want to use an Adafruit Trellis LED panel/switches to do this. Basically, when the button is pressed, the LED lights up and the relay gets tripped.  Pressing it again does the reverse.</p>

<p>I will provide my code for inspection.</p>

<pre><code>#include &lt;Wire.h&gt;
#include "Adafruit_Trellis.h"

/***************************************************
This example shows reading buttons and setting/clearing buttons in a loop
"momentary" mode has the LED light up only when a button is pressed
"latching" mode lets you turn the LED on/off when pressed

Up to 8 matrices can be used but this example will show 4 or 1
****************************************************/

#define MOMENTARY 0
#define LATCHING 1
// set the mode here
#define MODE LATCHING 


Adafruit_Trellis matrix0 = Adafruit_Trellis();

// uncomment the below to add 3 more matrices
/*
Adafruit_Trellis matrix1 = Adafruit_Trellis();
Adafruit_Trellis matrix2 = Adafruit_Trellis();
Adafruit_Trellis matrix3 = Adafruit_Trellis();
// you can add another 4, up to 8
*/

// Just one
Adafruit_TrellisSet trellis = Adafruit_TrellisSet(&amp;matrix0);
// or use the below to select 4, up to 8 can be passed in
//Adafruit_TrellisSet trellis =  Adafruit_TrellisSet(&amp;matrix0, &amp;matrix1, &amp;matrix2, &amp;matrix3);

// set to however many you're working with here, up to 8
#define NUMTRELLIS 1

#define numKeys (NUMTRELLIS * 16)

// Connect Trellis Vin to 5V and Ground to ground.
// Connect the INT wire to pin #A2 (can change later!)
#define INTPIN A2
// relay pins
#define relay1 2
#define relay2 3
#define relay3 4
#define relay4 5
#define relay5 6
#define relay6 7
#define relay7 8
#define relay8 9
int i = 0;


// Connect I2C SDA pin to your Arduino SDA line
// Connect I2C SCL pin to your Arduino SCL line
// All Trellises share the SDA, SCL and INT pin! 
// Even 8 tiles use only 3 wires max


void setup() {
    Serial.begin(115200);
    Serial.println("Trellis on");

    // INT pin requires a pullup
    pinMode(INTPIN, INPUT);
    //relay pins
    pinMode(relay1, OUTPUT);
    pinMode(relay2, OUTPUT);
    pinMode(relay3, OUTPUT); 
    pinMode(relay4, OUTPUT);
    pinMode(relay5, OUTPUT);
    pinMode(relay6, OUTPUT);
    pinMode(relay7, OUTPUT);
    pinMode(relay8, OUTPUT);

    digitalWrite(INTPIN, HIGH);

    // begin() with the addresses of each panel in order
    // I find it easiest if the addresses are in order
    trellis.begin(0x70);  // only one
    // trellis.begin(0x70, 0x71, 0x72, 0x73);  // or four!

    // light up all the LEDs in order
    for (uint8_t i = 0; i &lt; numKeys; i++) {
        trellis.setLED(i);
        trellis.writeDisplay();
        delay(50);
    }
    // then turn them off
    for (uint8_t i = 0; i &lt; numKeys; i++) {
        trellis.clrLED(i);
        trellis.writeDisplay();
        delay(50);
    }
}

void toggleLight(int i){
    if (trellis.isLED(i))
        trellis.clrLED(i);
    else
        trellis.setLED(i);

}

void loop() {
    delay(30); // 30ms delay is required, dont remove me!
    //init relay states
    static int relay1state = 0;
    static int relay2state = 0;
    static int relay3state = 0;
    static int relay4state = 0;
    static int relay5state = 0;
    static int relay6state = 0;
    static int relay7state = 0;
    static int relay8state = 0;

    if (MODE == MOMENTARY) {
        // If a button was just pressed or released...
        if (trellis.readSwitches()) {
            // go through every button
            for (uint8_t i = 0; i &lt; numKeys; i++) {
                // if it was pressed, turn it on
                if (trellis.justPressed(i)) {
                    Serial.print("v"); Serial.println(i);
                    trellis.setLED(i);
                }
                // if it was released, turn it off
                if (trellis.justReleased(i)) {
                    Serial.print("^"); Serial.println(i);
                    trellis.clrLED(i);
                }
            }
            // tell the trellis to set the LEDs we requested
            trellis.writeDisplay();
        }
    }

    if (MODE == LATCHING) {
        // If a button was just pressed or released...
        if (trellis.readSwitches()) {
            // go through every button
            for (i; i &lt; numKeys; i++) {
                // if it was pressed...
                if (trellis.justPressed(i)) {

                    switch (i)
                    {
                    case '0':
                        relay1state ^= 1; // xor current value with 1 (causes value to toggle)
                        if (relay1state) {
                            delay(100);
                            digitalWrite(relay1, HIGH);
                            toggleLight(i);
                            Serial.println("Outlet 1 on");
                            break;
                        }
                        else {
                            delay(100);
                            digitalWrite(relay1, LOW);
                            toggleLight(i);
                            Serial.println("Outlet 1 off");
                            break;
                        }

                    case '1':
                        relay2state ^= 1; // xor current value with 1 (causes value to toggle)
                        if (relay2state) {
                            delay(100);
                            digitalWrite(relay2, HIGH);
                            toggleLight(i);
                            Serial.println("Outlet 2 on");
                            break;
                        }
                        else {
                            delay(100);
                            digitalWrite(relay2, LOW);
                            toggleLight(i);
                            Serial.println("Outlet 2 off");

                            break;
                        }
                        //...add case 3-8 &amp; 9-15
                    }
                    trellis.writeDisplay();
                }
            }
        }

    }
}
</code></pre>
 2967: <p>Stepping back from your code problems, why are you using relays? Do you mean electromechanical relays? Those draw a lot of current and you need to wire them with a protection diode so they don't destroy the control circuit when you disconnect the power and the inductive field on the relay coil collapses.</p>

<p>If you're switching AC power, mechanical relays are a reasonable way to go, but for DC like motors/LEDs, etc, it's usually better to use electronic switches of some kind (e.g. transistors).</p>
