This is what I use for multiple sensors on one board. It is connected to a Home Assistant instance and seems to work for me.
(I am not using any radios, the uno is connected via usb to my rpi running HA, so the radio thingies are missing from the sketch)
#define MY_GATEWAY_SERIAL
#include <SPI.h>
#include <MySensors.h>
#include <DHT.h>
#define SN "LivingRoom"
#define SV "2.0"
//Only pins 2 and 3 can be used as motion sensors, because these generate interrupts
const int HCSR501S = 2;
int HCSR501_PINS[HCSR501S] = {2, 3};
int HCSR501_CHILD_IDS[HCSR501S] = {2, 3};
//DHTs
const int DHTS = 5;
int DHT_PINS[DHTS] = {4, 7, 8, 12, 13};
int DHT_TEMP_CHILD_IDS[DHTS] = {4, 5, 6, 7, 8};
int DHT_HUM_CHILD_IDS[DHTS] = {14, 15, 16, 17, 18};
//LED - Mosfet
const int LEDS = 5;
int LED_PINS[LEDS] = {5, 6, 9, 10, 11};
int LED_CHILD_IDS[LEDS] = {31, 32, 33, 34, 35};
#define FADE_DELAY 40 // Delay in ms for each percentage fade up/down (10ms = 1s full-range dim)
int WaitTime = 20;
static int16_t currentLevel[LEDS] = {0, 0, 0, 0, 0};
int requestedLevel[LEDS];
bool metric = true;
// Must be >1000ms for DHT22 and >2000ms for DHT11
//static const uint64_t UPDATE_INTERVAL = 60000;
static const uint64_t UPDATE_INTERVAL = 6000;
static bool first_message_sent = false;
MyMessage moveMsg0(HCSR501_CHILD_IDS[0], V_TRIPPED);
MyMessage moveMsg1(HCSR501_CHILD_IDS[1], V_TRIPPED);
//
MyMessage dimmerMsg0(LED_CHILD_IDS[0], V_DIMMER);
MyMessage lightMsg0(LED_CHILD_IDS[0], V_LIGHT);
MyMessage dimmerMsg1(LED_CHILD_IDS[1], V_DIMMER);
MyMessage lightMsg1(LED_CHILD_IDS[1], V_LIGHT);
MyMessage dimmerMsg2(LED_CHILD_IDS[2], V_DIMMER);
MyMessage lightMsg2(LED_CHILD_IDS[2], V_LIGHT);
MyMessage dimmerMsg3(LED_CHILD_IDS[3], V_DIMMER);
MyMessage lightMsg3(LED_CHILD_IDS[3], V_LIGHT);
MyMessage dimmerMsg4(LED_CHILD_IDS[4], V_DIMMER);
MyMessage lightMsg4(LED_CHILD_IDS[4], V_LIGHT);
//
MyMessage tempMsg0(DHT_TEMP_CHILD_IDS[0], V_TEMP);
MyMessage humMsg0(DHT_HUM_CHILD_IDS[0], V_HUM);
MyMessage tempMsg1(DHT_TEMP_CHILD_IDS[1], V_TEMP);
MyMessage humMsg1(DHT_HUM_CHILD_IDS[1], V_HUM);
MyMessage tempMsg2(DHT_TEMP_CHILD_IDS[2], V_TEMP);
MyMessage humMsg2(DHT_HUM_CHILD_IDS[2], V_HUM);
MyMessage tempMsg3(DHT_TEMP_CHILD_IDS[3], V_TEMP);
MyMessage humMsg3(DHT_HUM_CHILD_IDS[3], V_HUM);
MyMessage tempMsg4(DHT_TEMP_CHILD_IDS[4], V_TEMP);
MyMessage humMsg4(DHT_HUM_CHILD_IDS[4], V_HUM);
//
DHT dht1;
DHT dht2;
DHT dht3;
DHT dht4;
DHT dht5;
void before() {
for (int i = 0; i < HCSR501S; i++) {
pinMode(HCSR501_PINS[i], INPUT);
}
for (int q = 0; q < LEDS; q++) {
pinMode(LED_PINS[q], OUTPUT);
}
}
void setup()
{
dht1.setup(DHT_PINS[0]);
dht2.setup(DHT_PINS[1]);
dht3.setup(DHT_PINS[2]);
dht4.setup(DHT_PINS[3]);
dht5.setup(DHT_PINS[4]);
for (int q = 0; q < LEDS; q++) {
request(LED_CHILD_IDS[q], V_DIMMER);
}
}
void presentation() {
sendSketchInfo(SN, SV);
for (int i = 0; i < HCSR501S; i++) {
present(HCSR501_CHILD_IDS[i], S_MOTION);
wait(WaitTime);
}
for (int q = 0; q < DHTS; q++) {
present(DHT_TEMP_CHILD_IDS[q], S_TEMP);
wait(WaitTime);
present(DHT_HUM_CHILD_IDS[q], S_HUM);
wait(WaitTime);
}
for (int w = 0; w < LEDS; w++) {
present(LED_CHILD_IDS[w], S_DIMMER);
wait(WaitTime);
}
}
void loop() {
dht1.readSensor(true);
dht2.readSensor(true);
dht3.readSensor(true);
dht4.readSensor(true);
dht5.readSensor(true);
//
float temperature[DHTS];
float humidity[DHTS];
temperature[0] = dht1.getTemperature();
humidity[0] = dht1.getHumidity();
temperature[1] = dht2.getTemperature();
humidity[1] = dht2.getHumidity();
temperature[2] = dht3.getTemperature();
humidity[2] = dht3.getHumidity();
temperature[3] = dht4.getTemperature();
humidity[3] = dht4.getHumidity();
temperature[4] = dht5.getTemperature();
humidity[4] = dht5.getHumidity();
//
send(tempMsg0.set(temperature[0], 1));
send(humMsg0.set(humidity[0], 1));
send(tempMsg1.set(temperature[1], 1));
send(humMsg1.set(humidity[1], 1));
send(tempMsg2.set(temperature[2], 1));
send(humMsg2.set(humidity[2], 1));
send(tempMsg3.set(temperature[3], 1));
send(humMsg3.set(humidity[3], 1));
send(tempMsg4.set(temperature[4], 1));
send(humMsg4.set(humidity[4], 1));
int tripped[HCSR501S];
for (int i = 0; i < HCSR501S; i++) {
tripped[i] = digitalRead(HCSR501_PINS[i]) == HIGH;
send(moveMsg0.set(tripped[0] ? 1 : 0));
send(moveMsg1.set(tripped[1] ? 1 : 0));
}
if ( first_message_sent == false ) {
send(lightMsg0.set(currentLevel[0] > 0));
send(dimmerMsg0.set(currentLevel[0]));
send(lightMsg1.set(currentLevel[1] > 0));
send(dimmerMsg1.set(currentLevel[1]));
send(lightMsg2.set(currentLevel[2] > 0));
send(dimmerMsg2.set(currentLevel[2]));
send(lightMsg3.set(currentLevel[3] > 0));
send(dimmerMsg3.set(currentLevel[3]));
send(lightMsg4.set(currentLevel[4] > 0));
send(dimmerMsg4.set(currentLevel[4]));
first_message_sent = true;
}
wait(UPDATE_INTERVAL);
}
void receive(const MyMessage &message) {
int whichPIN = -1;
int whichID = -1;
int whichITEM = -1;
if (message.type == V_LIGHT || message.type == V_DIMMER) {
for (int w = 0; w < LEDS; w++) {
if (message.sensor == LED_CHILD_IDS[w]) {
whichPIN = LED_PINS[w];
whichID = LED_CHILD_IDS[w];
whichITEM = w;
break;
}
}
if (whichITEM > -1) {
requestedLevel[whichITEM] = atoi( message.data );
// Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on]
requestedLevel[whichITEM] *= ( message.type == V_LIGHT ? 0 : 1 );
requestedLevel[whichITEM] = requestedLevel[whichITEM] > 100 ? 100 : requestedLevel[whichITEM];
requestedLevel[whichITEM] = requestedLevel[whichITEM] < 0 ? 0 : requestedLevel[whichITEM];
int delta = ( requestedLevel[whichITEM] - currentLevel[whichITEM] ) < 0 ? -1 : 1;
while ( currentLevel[whichITEM] != requestedLevel[whichITEM] ) {
currentLevel[whichITEM] += delta;
analogWrite( whichPIN, (int)(currentLevel[whichITEM] / 100. * 255) );
delay( FADE_DELAY );
}
if (whichITEM == 0){
send(lightMsg0.set(currentLevel[whichITEM] > 0));
send(dimmerMsg0.set(currentLevel[whichITEM]));
}
if (whichITEM == 1){
send(lightMsg1.set(currentLevel[whichITEM] > 0));
send(dimmerMsg1.set(currentLevel[whichITEM]));
}
if (whichITEM == 2){
send(lightMsg2.set(currentLevel[whichITEM] > 0));
send(dimmerMsg2.set(currentLevel[whichITEM]));
}
if (whichITEM == 3){
send(lightMsg3.set(currentLevel[whichITEM] > 0));
send(dimmerMsg3.set(currentLevel[whichITEM]));
}
if (whichITEM == 4){
send(lightMsg4.set(currentLevel[whichITEM] > 0));
send(dimmerMsg4.set(currentLevel[whichITEM]));
}
}
}
}```
Maybe this helps...
cheers
tom