1
2
3
4
5
6
7
8
9
10
11
12
26
27#include <SPI.h>
28#include <avr/sleep.h>
29#include <avr/power.h>
33
34
35
37
38
39
40const int role_pin = 5;
41
42const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
43
44
45
46
47
48
49
50typedef enum { role_ping_out = 1,
51 role_pong_back } role_e;
52
53
54const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back" };
55
56
57role_e role;
58
59
60
61typedef enum { wdt_16ms = 0,
62 wdt_32ms,
63 wdt_64ms,
64 wdt_128ms,
65 wdt_250ms,
66 wdt_500ms,
67 wdt_1s,
68 wdt_2s,
69 wdt_4s,
70 wdt_8s } wdt_prescalar_e;
71
72void setup_watchdog(uint8_t prescalar);
73void do_sleep(void);
74
75const short sleep_cycles_per_transmission = 4;
76volatile short sleep_cycles_remaining = sleep_cycles_per_transmission;
77
78
79
80void setup() {
81
82
86
87
88 if (digitalRead(role_pin))
89 role = role_ping_out;
90 else
91 role = role_pong_back;
92
93 Serial.begin(115200);
95 Serial.print(F("\n\rRF24/examples/pingpair_sleepy/\n\rROLE: "));
96 Serial.println(role_friendly_name[role]);
97
98
99
100
101 setup_watchdog(wdt_4s);
102
103
104
105 radio.begin();
106
107
108
109
110
111
112
113
114 if (role == role_ping_out) {
115 radio.openWritingPipe(pipes[0]);
116 radio.openReadingPipe(1, pipes[1]);
117 } else {
118 radio.openWritingPipe(pipes[1]);
119 radio.openReadingPipe(1, pipes[0]);
120 }
121
122
123 radio.startListening();
124
125
126
127}
128
129void loop() {
130
131
132 if (role == role_ping_out) {
133 radio.powerUp();
134 radio.stopListening();
135
136 unsigned long time =
millis();
137 Serial.print(F("Now sending... "));
138 Serial.println(time);
139
140 radio.write(&time, sizeof(unsigned long));
141
142 radio.startListening();
143
144 unsigned long started_waiting_at =
millis();
145 bool timeout = false;
146 while (!radio.available()) {
147 if (
millis() - started_waiting_at > 250) {
148 timeout = true;
149 break;
150 }
151 }
152
153 if (timeout) {
154 Serial.println(F("Failed, response timed out."));
155 } else {
156 unsigned long got_time;
157 radio.read(&got_time, sizeof(unsigned long));
158
159 printf(
"Got response %lu, round-trip delay: %lu\n\r", got_time,
millis() - got_time);
160 }
161
162
164
165 radio.powerDown();
166
167
168 do_sleep();
169 }
170
171
172
173 if (role == role_pong_back) {
174
175 if (radio.available()) {
176
177 unsigned long got_time;
178 while (radio.available()) {
179 radio.read(&got_time, sizeof(unsigned long));
180
181 printf(
"Got payload %lu @ %lu...", got_time,
millis());
182 }
183
184 radio.stopListening();
185 radio.write(&got_time, sizeof(unsigned long));
186 Serial.println(F("Sent response."));
187 radio.startListening();
188 } else {
189 Serial.println(F("Sleeping"));
191 do_sleep();
192 }
193 }
194}
195
196void wakeUp() {
197 sleep_disable();
198}
199
200
201
202
203
204
205
206void setup_watchdog(uint8_t prescalar) {
207
208 uint8_t wdtcsr = prescalar & 7;
209 if (prescalar & 8)
212 WDTCSR =
_BV(WDCE) |
_BV(WDE);
213 WDTCSR =
_BV(WDCE) | wdtcsr |
_BV(WDIE);
214}
215
216ISR(WDT_vect) {
217
218 Serial.println(F("WDT"));
219}
220
221void do_sleep(void) {
222 set_sleep_mode(SLEEP_MODE_PWR_DOWN);
223 sleep_enable();
224 attachInterrupt(0, wakeUp,
LOW);
226 sleep_mode();
227
228 sleep_disable();
229 detachInterrupt(0);
230 WDTCSR &=
~_BV(WDIE);
231}
Driver class for nRF24L01(+) 2.4GHz Wireless Transceiver.
#define pinMode(pin, direction)
#define digitalWrite(pin, value)