/**
Author: tiger888
Date: 21/08/2024
Last Update: Initial Version 1.0
Sydney, Australia
******* THE PROJECT *********************************
Simulation: NRF24L01 RF Transceiver (RECEIVER Only)
*****************************************************
Project Components;
1 x Arduino Nano
1 x 5v Power supply but pin to Arduino 3.3v.
Optional use mobile phone power bank instead.
1 x NRF24L01 (RF Transceiver) - Receiver mode only
1 x Capacitors 470 micro farad (white noise filter)
1 x Resistors 220 ohm (LED current limiter)
1 x LED yellow (Rx status indicator: steady ON when received TX, else OFF)
1 x LED red (Rx status indicator: steady ON when no data received, else OFF)
1 x LED blue (Rx is on standby)
1 x LED green (mobile phone power bank battery, ON is charged, OFF is no charge)
Note 1: we used Arduino 5v to monitor the mobile phone pwoer bank status
Note 2: In the case that red & yellow LEDs are ON, Rx received data but data is empty (issue?)
*/
#include <SPI.h>
#include <RF24.h>
// Pin 7, 8 are CE & CSN NFR24L01 default pin config
#define CE_PIN 7
#define CSN_PIN 8
// Monitor LED Rx status
#define LED_RX_PIN 5 // yellow (steady ON when Rx receives data, else OFF)
#define LED_NODATA_PIN 2 // red (Normally OFF, Steady ON when no data received)
#define LED_STANDBY_PIN 6 // blue Rx is on Standby
// RF24 simple constructor
RF24 radio(CE_PIN, CSN_PIN);
// Import: this defined address MUST match its Transmitter pair
const byte thisSlaveAddress[5] = {'R','x','A','A','A'};
char dataReceived[32] = {0};
char testData[32] = {"Hello World testing..."};
void setup() {
Serial.begin(9600);
Serial.flush();
// Default LED Rx status
pinMode(LED_RX_PIN, OUTPUT);
digitalWrite(LED_RX_PIN, LOW);
pinMode(LED_NODATA_PIN, OUTPUT);
digitalWrite(LED_NODATA_PIN, LOW);
pinMode(LED_STANDBY_PIN, OUTPUT);
digitalWrite(LED_STANDBY_PIN, LOW);
// Init RF24 as receiver mode
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.openReadingPipe(1, thisSlaveAddress);
radio.startListening();
Serial.println("Receiver setup completed.");
}
void loop(){
// defualt Rx Standby to OFF
digitalWrite(LED_STANDBY_PIN, LOW); // blue LED OFF
boolean rxStatus = radio.available();
//---------- debug only - done remove it --------------------
rxStatus = true; // check the blue LED (Rx is on standby)
//-----------------------------------------------------------
if (rxStatus){
radio.read(&dataReceived, sizeof(dataReceived));
// Testing only - remove when done
strcpy(dataReceived, testData);
//////////////////////////////////
// Check if dataReceived is empty
if (strlen(dataReceived) == 0) {
// Rx received but data is empty
digitalWrite(LED_RX_PIN, HIGH); // Yellow LED ON
flashingLed(LED_NODATA_PIN, 500); // Red LED flashing
Serial.println("Data received but data is empty");
} else {
// Rx received data that is not empty (all good here.)
digitalWrite(LED_RX_PIN, HIGH); // Yellow LED ON
// flashing yellow LED and Buzzer : we have received Tx meesage
flashingLed(LED_RX_PIN, 500);
digitalWrite(LED_NODATA_PIN, LOW); // Red LED OFF
Serial.print("Data received: ");
Serial.println(dataReceived);
}
} else {
// radio is available but no trasmission ON
digitalWrite(LED_STANDBY_PIN, HIGH); // blue LED ON standby
Serial.println("Receiver is on standby.");
}
}
void flashingLed(int ledPinNbr, int delayTime){
digitalWrite(ledPinNbr, HIGH);
delay(delayTime);
digitalWrite(ledPinNbr, LOW);
delay(delayTime);
}