I am using below sketch; make sure that number of relays matches number of relayPins and buttonPins.
//MultiRelayButton Sketch, MySensors 1.6, toggle switch
#define MY_RADIO_NRF24
#define MY_REPEATER_FEATURE
//Set Static node id
//#define MY_NODE_ID 250
#include <MySensors.h>
#include <SPI.h>
#include <Bounce2.h>
#define RELAY_ON 0 // switch around for ACTIVE LOW / ACTIVE HIGH relay
#define RELAY_OFF 1
//
#define noRelays 2 //2-4
const int relayPin[] = {14,15}; // switch around pins to your desire
const int buttonPin[] = {3,4}; // switch around pins to your desire
class Relay // relay class, store all relevant data (equivalent to struct)
{
public:
int buttonPin; // physical pin number of button
int relayPin; // physical pin number of relay
boolean relayState; // relay status (also stored in EEPROM)
};
Relay Relays[noRelays];
Bounce debouncer[noRelays];
MyMessage msg[noRelays];
void setup(){
sendHeartbeat();
wait(100);
// Initialize Relays with corresponding buttons
for (int i = 0; i < noRelays; i++){
Relays[i].buttonPin = buttonPin[i]; // assign physical pins
Relays[i].relayPin = relayPin[i];
msg[i].sensor = i; // initialize messages
msg[i].type = V_LIGHT;
pinMode(Relays[i].buttonPin, INPUT_PULLUP);
wait(100);
pinMode(Relays[i].relayPin, OUTPUT);
Relays[i].relayState = loadState(i); // retrieve last values from EEPROM
digitalWrite(Relays[i].relayPin, Relays[i].relayState? RELAY_ON:RELAY_OFF); // and set relays accordingly
send(msg[i].set(Relays[i].relayState? true : false)); // make controller aware of last status
wait(50);
debouncer[i] = Bounce(); // initialize debouncer
debouncer[i].attach(buttonPin[i]);
debouncer[i].interval(20);
wait(50);
}
}
void presentation() {
sendSketchInfo("MultiRelayButton", "1.0");
wait(100);
for (int i = 0; i < noRelays; i++)
present(i, S_LIGHT); // present sensor to gateway
wait(100);
}
void loop()
{
for (byte i = 0; i < noRelays; i++) {
if (debouncer[i].update()) {
Relays[i].relayState = !Relays[i].relayState;
digitalWrite(Relays[i].relayPin, Relays[i].relayState?RELAY_ON:RELAY_OFF);
send(msg[i].set(Relays[i].relayState? true : false));
// save sensor state in EEPROM (location == sensor number)
saveState( i, Relays[i].relayState );
}
}
wait(20);
}
// process incoming message
void receive(const MyMessage &message){
if (message.type == V_LIGHT){
if (message.sensor <noRelays){ // check if message is valid for relays..... previous line [[[ if (message.sensor <=noRelays){ ]]]
Relays[message.sensor].relayState = message.getBool();
digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState? RELAY_ON:RELAY_OFF); // and set relays accordingly
saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
}
}
wait(20);
}