From cec9f1badb820133b5ecafedc2b1e45c01996600 Mon Sep 17 00:00:00 2001 From: gzafirov Date: Sat, 2 Dec 2023 12:21:00 +0200 Subject: [PATCH] NRf24 demo --- .../GettingStartedRF24Nano.ino | 128 ++++++++++++++++++ .../GettingStartedRF24.ino | 128 ++++++++++++++++++ 2 files changed, 256 insertions(+) create mode 100644 Workshops/NRF24_RX_TX_Simple_demo/GettingStartedRF24Nano_RX/GettingStartedRF24Nano.ino create mode 100644 Workshops/NRF24_RX_TX_Simple_demo/GettingStartedRF24_TX/GettingStartedRF24.ino diff --git a/Workshops/NRF24_RX_TX_Simple_demo/GettingStartedRF24Nano_RX/GettingStartedRF24Nano.ino b/Workshops/NRF24_RX_TX_Simple_demo/GettingStartedRF24Nano_RX/GettingStartedRF24Nano.ino new file mode 100644 index 0000000..a4da003 --- /dev/null +++ b/Workshops/NRF24_RX_TX_Simple_demo/GettingStartedRF24Nano_RX/GettingStartedRF24Nano.ino @@ -0,0 +1,128 @@ +/* + * See documentation at https://nRF24.github.io/RF24 + * See License information at root directory of this library + * Author: Brendan Doherty (2bndy5) + */ + +/** + * A simple example of sending data from 1 nRF24L01 transceiver to another. + * + * This example was written to be used on 2 devices acting as "nodes". + * Use the Serial Monitor to change each node's behavior. + */ +#include +#include "printf.h" +#include "RF24.h" + +#define CE_PIN 8 +#define CSN_PIN 9 +// instantiate an object for the nRF24L01 transceiver +RF24 radio(CE_PIN, CSN_PIN); + +// Let these addresses be used for the pair +uint8_t address[][6] = { "1Node", "2Node" }; +// It is very helpful to think of an address as a path instead of as +// an identifying device destination + +// to use different addresses on a pair of radios, we need a variable to +// uniquely identify which address this radio will use to transmit +bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit + +// Used to control whether this node is sending or receiving +bool role = false; // true = TX role, false = RX role + +// For this example, we'll be using a payload containing +// a single float number that will be incremented +// on every successful transmission +uint16_t payload = 0; + +void setup() { + + pinMode(A5, OUTPUT); + digitalWrite(A5, HIGH); + + pinMode(A3, OUTPUT); + digitalWrite(A3, HIGH); + + Serial.begin(115200); + while (!Serial) { + // some boards need to wait to ensure access to serial over USB + } + + // initialize the transceiver on the SPI bus + if (!radio.begin()) + { + Serial.println(F("radio hardware is not responding!!")); + while (1) {} // hold in infinite loop + } + + // print example's introductory prompt + Serial.println(F("RF24/examples/GettingStarted")); + + // To set the radioNumber via the Serial monitor on startup + // Serial.println(F("Which radio is this? Enter '0' or '1'. Defaults to '0'")); + // while (!Serial.available()) { + // // wait for user input + // } + //char input = Serial.parseInt(); + //radioNumber = input == 1; + Serial.print(F("radioNumber = ")); + Serial.println((int)radioNumber); + + // role variable is hardcoded to RX behavior, inform the user of this + Serial.println(F("*** PRESS 'T' to begin transmitting to the other node")); + + // Set the PA Level low to try preventing power supply related problems + // because these examples are likely run with nodes in close proximity to + // each other. + radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default. + + // save on transmission time by setting the radio to only transmit the + // number of bytes we need to transmit a float + radio.setPayloadSize(sizeof(payload)); // float datatype occupies 4 bytes + + // set the TX address of the RX node into the TX pipe + radio.openWritingPipe(address[radioNumber]); // always uses pipe 0 + + // set the RX address of the TX node into a RX pipe + radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1 + + + radio.startListening(); // put radio in RX mode + + // For debugging info + // printf_begin(); // needed only once for printing details + // radio.printDetails(); // (smaller) function that prints raw register values + // radio.printPrettyDetails(); // (larger) function that prints human readable data + +} // setup + +void loop() +{ + uint8_t pipe; + if (radio.available(&pipe)) + { // is there a payload? get the pipe number that recieved it + uint8_t bytes = radio.getPayloadSize(); // get the size of the payload + radio.read(&payload, bytes); // fetch payload from FIFO + Serial.print(F("Received ")); + Serial.print(bytes); // print the size of the payload + Serial.print(F(" bytes on pipe ")); + Serial.print(pipe); // print the pipe number + Serial.print(F(": ")); + Serial.println(payload); // print the payload's value + + if (payload == 1) + { + digitalWrite(A5, !digitalRead(A5)); + } + + if (payload == 2) + { + digitalWrite(A3, !digitalRead(A3)); + } + + } + + + +} diff --git a/Workshops/NRF24_RX_TX_Simple_demo/GettingStartedRF24_TX/GettingStartedRF24.ino b/Workshops/NRF24_RX_TX_Simple_demo/GettingStartedRF24_TX/GettingStartedRF24.ino new file mode 100644 index 0000000..db2cea9 --- /dev/null +++ b/Workshops/NRF24_RX_TX_Simple_demo/GettingStartedRF24_TX/GettingStartedRF24.ino @@ -0,0 +1,128 @@ +/* + * See documentation at https://nRF24.github.io/RF24 + * See License information at root directory of this library + * Author: Brendan Doherty (2bndy5) + */ + +/** + * A simple example of sending data from 1 nRF24L01 transceiver to another. + * + * This example was written to be used on 2 devices acting as "nodes". + * Use the Serial Monitor to change each node's behavior. + */ +#include +#include "printf.h" +#include "RF24.h" + +#define CE_PIN 8 +#define CSN_PIN 9 +// instantiate an object for the nRF24L01 transceiver +RF24 radio(CE_PIN, CSN_PIN); + +// Let these addresses be used for the pair +uint8_t address[][6] = { "1Node", "2Node" }; +// It is very helpful to think of an address as a path instead of as +// an identifying device destination + +// to use different addresses on a pair of radios, we need a variable to +// uniquely identify which address this radio will use to transmit +bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit + +// Used to control whether this node is sending or receiving +bool role = true; // true = TX role, false = RX role + +// For this example, we'll be using a payload containing +// a single float number that will be incremented +// on every successful transmission +uint16_t payload = 0; + +void setup() +{ + pinMode(A1, INPUT_PULLUP); + pinMode(A2, INPUT_PULLUP); + + Serial.begin(115200); + while (!Serial) { + // some boards need to wait to ensure access to serial over USB + } + + // initialize the transceiver on the SPI bus + if (!radio.begin()) { + Serial.println(F("radio hardware is not responding!!")); + while (1) {} // hold in infinite loop + } + + // print example's introductory prompt + Serial.println(F("RF24/examples/GettingStarted")); + + // To set the radioNumber via the Serial monitor on startup + // while (!Serial.available()) { + // // wait for user input + // } + // char input = Serial.parseInt(); + radioNumber = 0; + Serial.print(F("radioNumber = ")); + Serial.println((int)radioNumber); + + // role variable is hardcoded to RX behavior, inform the user of this + Serial.println(F("*** PRESS 'T' to begin transmitting to the other node")); + + // Set the PA Level low to try preventing power supply related problems + // because these examples are likely run with nodes in close proximity to + // each other. + radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default. + + // save on transmission time by setting the radio to only transmit the + // number of bytes we need to transmit a float + radio.setPayloadSize(sizeof(payload)); // float datatype occupies 4 bytes + + // set the TX address of the RX node into the TX pipe + radio.openWritingPipe(address[radioNumber]); // always uses pipe 0 + + // set the RX address of the TX node into a RX pipe + radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1 + + // additional setup specific to the node's role + + radio.stopListening(); // put radio in TX mode + + + // For debugging info + // printf_begin(); // needed only once for printing details + // radio.printDetails(); // (smaller) function that prints raw register values + // radio.printPrettyDetails(); // (larger) function that prints human readable data + +} // setup + +void loop() { + + if (!digitalRead(A1)) + { + payload = 1; + } else if (!digitalRead(A2)) + { + payload = 2; + } + else { + payload = 0; + } + + unsigned long start_timer = micros(); // start the timer + bool report = radio.write(&payload, sizeof(payload)); // transmit & save the report + unsigned long end_timer = micros(); // end the timer + + if (report) { + Serial.print(F("Transmission successful! ")); // payload was delivered + Serial.print(F("Time to transmit = ")); + Serial.print(end_timer - start_timer); // print the timer result + Serial.print(F(" us. Sent: ")); + Serial.println(payload); // print payload sent + payload += 1; // increment float payload + } else { + Serial.println(F("Transmission failed or timed out")); // payload was not delivered + } + + // to make this example readable in the serial monitor + delay(250); // slow transmissions down by 1 second + +} -- 2.39.5