This is an example of how to user interrupts to interact with the radio, and a demonstration of how to use them to sleep when receiving, and not miss any payloads.
The pingpair_sleepy example expands on sleep functionality with a timed sleep option for the transmitter. Sleep functionality is built directly into my fork of the RF24Network library
1
2
3
4
5
6
7
8
9
10
19
20#include <SPI.h>
24
25
27
28
29static uint32_t message_count = 1;
30
31
32byte address[][5] = { 0xCC, 0xCE, 0xCC, 0xCE, 0xCC, 0xCE, 0xCC, 0xCE, 0xCC, 0xCE };
33
34
35
36
37
38
39
40
41const short role_pin = 5;
42typedef enum { role_sender = 1,
43 role_receiver } role_e;
44const char* role_friendly_name[] = { "invalid", "Sender", "Receiver" };
45role_e role;
46
47
48void setup() {
49
53
54 if (digitalRead(role_pin))
55 role = role_sender;
56 else
57 role = role_receiver;
58
59
60 Serial.begin(115200);
62
63
64 Serial.print(F("\n\rRF24/examples/pingpair_irq\n\rROLE: "));
65 Serial.println(role_friendly_name[role]);
66
67
68
69 radio.begin();
70
71
73 radio.enableAckPayload();
74 radio.enableDynamicPayloads();
75
76
77 if (role == role_sender) {
78 radio.openWritingPipe(address[0]);
79 radio.openReadingPipe(1, address[1]);
80 } else {
81 radio.openWritingPipe(address[1]);
82 radio.openReadingPipe(1, address[0]);
83 radio.startListening();
84
85
86 radio.writeAckPayload(1, &message_count, sizeof(message_count));
87 ++message_count;
88 }
89
90 radio.printDetails();
92
93
94 attachInterrupt(0, check_radio,
LOW);
95}
96
97
98void loop() {
99
100
101
102
103 if (role == role_sender) {
104
105
106 unsigned long time =
millis();
107 Serial.print(F("Now sending "));
108 Serial.println(time);
109 radio.startWrite(&time, sizeof(unsigned long), 0);
111 }
112
113
114
115
116
117 if (role == role_receiver) {}
118
119}
120
121
122
123
124void check_radio(void) {
125
126 bool tx, fail, rx;
127 radio.whatHappened(tx, fail, rx);
128
129 if (tx) {
130 if (role == role_sender)
131 Serial.println(F("Send:OK"));
132 if (role == role_receiver)
133 Serial.println(F("Ack Payload:Sent"));
134 }
135
136 if (fail) {
137 if (role == role_sender)
138 Serial.println(F("Send:Failed"));
139 if (role == role_receiver)
140 Serial.println(F("Ack Payload:Failed"));
141 }
142
143 if (rx || radio.available()) {
144
145
146
147
148
149
150 if (role == role_sender) {
151
152 radio.read(&message_count, sizeof(message_count));
153 Serial.print(F("Ack: "));
154 Serial.println(message_count);
155 }
156
157
158
159
160 if (role == role_receiver) {
161
162
163 static unsigned long got_time;
164 radio.read(&got_time, sizeof(got_time));
165 Serial.print(F("Got payload "));
166 Serial.println(got_time);
167
168
169 radio.writeAckPayload(1, &message_count, sizeof(message_count));
170 ++message_count;
171 }
172 }
173}
Driver class for nRF24L01(+) 2.4GHz Wireless Transceiver.
#define pinMode(pin, direction)
#define digitalWrite(pin, value)