I think it will work better like this
Rx
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
const byte bin1led = 22;
const byte bin2led = 23;
const byte bin3led = 24;
byte addresses[][6] = {"00001", "00002"};
RF24 radio(7, 8); // CE, CSN
byte bins[3];
void setup() {
pinMode(bin1led, OUTPUT);
pinMode(bin2led, OUTPUT);
pinMode(bin3led, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.setChannel(120);
radio.openWritingPipe(addresses[1]);
radio.openReadingPipe(1, addresses[0]);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
Serial.println(F("setup finished"));
}
void loop() {
if (radio.available()) {
radio.read(bins, sizeof(bins));
if (bins[0] == 1) {
digitalWrite(bin1led, HIGH);
Serial.println(F("bin1 high"));
}
else {
digitalWrite(bin1led, LOW);
Serial.println(F("bin1 low"));
}
if (bins[1] == 1) {
digitalWrite(bin2led, HIGH);
Serial.println(F("bin2 high"));
}
else {
digitalWrite(bin2led, LOW);
Serial.println(F("bin2 low"));
}
if (bins[2] == 1) {
digitalWrite(bin3led, HIGH);
Serial.println(F("bin3 high"));
}
else {
digitalWrite(bin3led, LOW);
Serial.println(F("bin3 low"));
}
Serial.println(F("loop finished"));
}
}
Tx
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
const byte bin1 = 2;
const byte bin2 = 3;
const byte bin3 = 4;
byte bins[3];
byte oldBins[3];
RF24 radio(7, 8); // CE, CSN
byte addresses[][6] = {"00001", "00002"};
unsigned long lastSend;
bool sendAMessage = true;
void setup() {
pinMode (bin1, INPUT);
pinMode (bin2, INPUT);
pinMode (bin3, INPUT);
radio.begin();
radio.setChannel(120);
radio.openWritingPipe(addresses[0]);
radio.openReadingPipe(1, addresses[1]);
radio.setPALevel(RF24_PA_MIN);
Serial.begin(9600);
Serial.println(F("setup finished"));
}
void loop() {
bins[0] = digitalRead(bin1) ? 1 : 0;
bins[1] = digitalRead(bin2) ? 1 : 0;
bins[2] = digitalRead(bin3) ? 1 : 0;
if (millis() - lastSend >= 500) {
sendAMessage = true;
}
if (!memcmp(bins, oldBins, sizeof(bins))) {
memcpy(oldBins, bins, sizeof(bins));
sendAMessage = true;
}
if (sendAMessage) {
sendAMessage = false;
lastSend = millis();
radio.write(bins, sizeof(bins));
Serial.println(F("Data Sent"));
}
}
You should avoid delay and other blocking code when programming any type of communication.
There is no need to use ints for bins, bytes work just the same.
You could even use bits and transmit a single byte with 5 unused bits.
My version sends a new packet when any button changes, or each 500 ms.