This is an example of how to use payloads of a varying (dynamic) size on Arduino.
1
2
3
4
5
6
7
8
14
15#include <SPI.h>
19
20
22
23
24const uint64_t addresses[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
25
26
27
28
29
30
31
32
33const short role_pin = 5;
34typedef enum { role_ping_out = 1,
35 role_pong_back } role_e;
36const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back" };
37role_e role;
38
39
40
41const int min_payload_size = 4;
42const int max_payload_size = 32;
43const int payload_size_increment = 1;
44int send_payload_size = min_payload_size;
45
46char receive_payload[max_payload_size + 1];
47
48void setup(void) {
52
53
54 if (digitalRead(role_pin)) {
55 role = role_ping_out;
56 } else {
57 role = role_pong_back;
58 }
59
60 Serial.begin(115200);
62
63
64 Serial.println(F("RF24/examples/pingpair_dyn/"));
65 Serial.print(F("ROLE: "));
66 Serial.println(role_friendly_name[role]);
67
68
69 radio.begin();
70 radio.enableDynamicPayloads();
71 radio.setRetries(5, 15);
72
73
74 if (role == role_ping_out) {
75 radio.openWritingPipe(addresses[0]);
76 radio.openReadingPipe(1, addresses[1]);
77 } else {
78 radio.openWritingPipe(addresses[1]);
79 radio.openReadingPipe(1, addresses[0]);
80 }
81
82 radio.startListening();
83 radio.printDetails();
84}
85
86void loop() {
87
88
89
90
91 if (role == role_ping_out) {
92
93 static char send_payload[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ789012";
94
95 radio.stopListening();
96
97
98 Serial.print(F("Now sending length "));
99 Serial.println(send_payload_size);
100 radio.write(send_payload, send_payload_size);
101
102 radio.startListening();
103
104 unsigned long started_waiting_at =
millis();
105 bool timeout = false;
106 while (!radio.available() && !timeout)
107 {
108 if (
millis() - started_waiting_at > 500)
109 timeout = true;
110 }
111
112
113 if (timeout) {
114 Serial.println(F("Failed, response timed out."));
115 } else {
116
117
118 uint8_t len = radio.getDynamicPayloadSize();
119
120
121 if (!len)
122 return;
123
124 radio.read(receive_payload, len);
125
126
127 receive_payload[len] = 0;
128
129
130 Serial.print(F("Got response size="));
131 Serial.print(len);
132 Serial.print(F(" value="));
133 Serial.println(receive_payload);
134 }
135
136 send_payload_size += payload_size_increment;
137 if (send_payload_size > max_payload_size)
138 send_payload_size = min_payload_size;
139
141 }
142
143
144
145
146
147 if (role == role_pong_back) {
148 while (radio.available())
149 {
150
151 uint8_t len = radio.getDynamicPayloadSize();
152
153
154 if (!len)
155 continue;
156
157 radio.read(receive_payload, len);
158
159
160 receive_payload[len] = 0;
161
162
163 Serial.print(F("Got response size="));
164 Serial.print(len);
165 Serial.print(F(" value="));
166 Serial.println(receive_payload);
167
168 radio.stopListening();
169
170
171
172
173
175 radio.write(receive_payload, len);
176 Serial.println(F("Sent response."));
177
178 radio.startListening();
179 }
180 }
181}
182
Driver class for nRF24L01(+) 2.4GHz Wireless Transceiver.
#define pinMode(pin, direction)
#define digitalWrite(pin, value)