-
Notifications
You must be signed in to change notification settings - Fork 0
/
rf95_server.cpp
220 lines (179 loc) · 6.31 KB
/
rf95_server.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
// rf95_server.cpp
//
// Example program showing how to use RH_RF95 on Raspberry Pi
// Uses the bcm2835 library to access the GPIO pins to drive the RFM95 module
// Requires bcm2835 library to be already installed
// http://www.airspayce.com/mikem/bcm2835/
// Use the Makefile in this directory:
// cd example/raspi/rf95
// make
// sudo ./rf95_server
//
// Contributed by Charles-Henri Hallard based on sample RH_NRF24 by Mike Poublon
// Edited by: Ramin Sangesari
// https://www.hackster.io/idreams/
#include <bcm2835.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <RH_RF69.h>
#include <RH_RF95.h>
// define hardware used change to fit your need
// Uncomment the board you have, if not listed
// uncommment custom board and set wiring tin custom section
// LoRasPi board
// see https://github.com/hallard/LoRasPI
//#define BOARD_LORASPI
// Adafruit RFM95W LoRa Radio Transceiver Breakout
// see https://www.adafruit.com/product/3072
#define BOARD_ADAFRUIT_RFM95W
// iC880A and LinkLab Lora Gateway Shield (if RF module plugged into)
// see https://github.com/ch2i/iC880A-Raspberry-PI
//#define BOARD_IC880A_PLATE
// Raspberri PI Lora Gateway for multiple modules
// see https://github.com/hallard/RPI-Lora-Gateway
//#define BOARD_PI_LORA_GATEWAY
// Dragino Raspberry PI hat
// see https://github.com/dragino/Lora
//#define BOARD_DRAGINO_PIHAT
// Now we include RasPi_Boards.h so this will expose defined
// constants with CS/IRQ/RESET/on board LED pins definition
#include "../RasPiBoards.h"
// Our RFM95 Configuration
#define RF_FREQUENCY 868.00
#define RF_NODE_ID 1
// Create an instance of a driver
RH_RF95 rf95(RF_CS_PIN, RF_IRQ_PIN);
//RH_RF95 rf95(RF_CS_PIN);
//Flag for Ctrl-C
volatile sig_atomic_t force_exit = false;
void sig_handler(int sig)
{
printf("\n%s Break received, exiting!\n", __BASEFILE__);
force_exit=true;
}
//Main Function
int main (int argc, const char* argv[] )
{
unsigned long led_blink = 0;
signal(SIGINT, sig_handler);
//printf( "%s\n", __BASEFILE__);
if (!bcm2835_init()) {
fprintf( stderr, "%s bcm2835_init() Failed\n\n", __BASEFILE__ );
return 1;
}
//printf( "RF95 CS=GPIO%d", RF_CS_PIN);
#ifdef RF_LED_PIN
pinMode(RF_LED_PIN, OUTPUT);
digitalWrite(RF_LED_PIN, HIGH );
#endif
#ifdef RF_IRQ_PIN
//printf( ", IRQ=GPIO%d", RF_IRQ_PIN );
// IRQ Pin input/pull down
pinMode(RF_IRQ_PIN, INPUT);
bcm2835_gpio_set_pud(RF_IRQ_PIN, BCM2835_GPIO_PUD_DOWN);
// Now we can enable Rising edge detection
bcm2835_gpio_ren(RF_IRQ_PIN);
#endif
#ifdef RF_RST_PIN
//printf( ", RST=GPIO%d", RF_RST_PIN );
// Pulse a reset on module
pinMode(RF_RST_PIN, OUTPUT);
digitalWrite(RF_RST_PIN, LOW );
bcm2835_delay(150);
digitalWrite(RF_RST_PIN, HIGH );
bcm2835_delay(100);
#endif
#ifdef RF_LED_PIN
//printf( ", LED=GPIO%d", RF_LED_PIN );
digitalWrite(RF_LED_PIN, LOW );
#endif
if (!rf95.init()) {
fprintf( stderr, "\nRF95 module init failed, Please verify wiring/module\n" );
} else {
// Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on
// The default transmitter power is 13dBm, using PA_BOOST.
// If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then
// you can set transmitter powers from 5 to 23 dBm:
// driver.setTxPower(23, false);
// If you are using Modtronix inAir4 or inAir9,or any other module which uses the
// transmitter RFO pins and not the PA_BOOST pins
// then you can configure the power transmitter power for -1 to 14 dBm and with useRFO true.
// Failure to do that will result in extremely low transmit powers.
// rf95.setTxPower(14, true);
// RF95 Modules don't have RFO pin connected, so just use PA_BOOST
// check your country max power useable, in EU it's +14dB
rf95.setTxPower(14, false);
// You can optionally require this module to wait until Channel Activity
// Detection shows no activity on the channel before transmitting by setting
// the CAD timeout to non-zero:
//rf95.setCADTimeout(10000);
// Adjust Frequency
rf95.setFrequency(RF_FREQUENCY);
// If we need to send something
rf95.setThisAddress(RF_NODE_ID);
rf95.setHeaderFrom(RF_NODE_ID);
// Be sure to grab all node packet
// we're sniffing to display, it's a demo
rf95.setPromiscuous(true);
// We're ready to listen for incoming message
rf95.setModeRx();
//printf( " OK NodeID=%d @ %3.2fMHz\n", RF_NODE_ID, RF_FREQUENCY );
//printf( "Listening packet...\n" );
//Begin the main body of code
while (!force_exit) {
#ifdef RF_IRQ_PIN
// We have a IRQ pin ,pool it instead reading
// Modules IRQ registers from SPI in each loop
// Rising edge fired ?
if (bcm2835_gpio_eds(RF_IRQ_PIN)) {
// Now clear the eds flag by setting it to 1
bcm2835_gpio_set_eds(RF_IRQ_PIN);
//printf("Packet Received, Rising event detect for pin GPIO%d\n", RF_IRQ_PIN);
#endif
if (rf95.available()) {
#ifdef RF_LED_PIN
led_blink = millis();
digitalWrite(RF_LED_PIN, HIGH);
#endif
// Should be a message for us now
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
uint8_t from = rf95.headerFrom();
uint8_t to = rf95.headerTo();
uint8_t id = rf95.headerId();
uint8_t flags= rf95.headerFlags();;
int8_t rssi = rf95.lastRssi();
if (rf95.recv(buf, &len)) {
printf("From: [#%d] => Temperature: ", to);
//printf("Packet[%02d] #%d => #%d %ddB: ", len, from, to, rssi);
printbuffer(buf, len);
printf(" °C");
} else {
Serial.print("receive failed");
}
printf("\n");
}
#ifdef RF_IRQ_PIN
}
#endif
#ifdef RF_LED_PIN
// Led blink timer expiration ?
if (led_blink && millis()-led_blink>200) {
led_blink = 0;
digitalWrite(RF_LED_PIN, LOW);
}
#endif
// Let OS doing other tasks
// For timed critical appliation you can reduce or delete
// this delay, but this will charge CPU usage, take care and monitor
bcm2835_delay(5);
}
}
#ifdef RF_LED_PIN
digitalWrite(RF_LED_PIN, LOW );
#endif
printf( "\n%s Ending\n", __BASEFILE__ );
bcm2835_close();
return 0;
}