Bluetooth Low Energy (BLE) beacon with nRF24L01(+). Data is received and displayed by Android device (Android app source code is attached).

Dependencies:   DS1820 mbed

nRF24L01 as Bluetooth Low Energy (BLE) Broadcaster/Beacon

Temperature measured by a DS1820 sensor is broadcasted by a nRF24L01(+) module as Bluetooth Low Energy signal. Data is then received and displayed on an Android device (smartphone/tablet) with Bluetooth Low Energy (Bluetooth Smart) enabled. In order to have Bluetooth LE available your device should run Android 4.3 or more recent.

Needed parts:

Zoom in /media/uploads/hudakz/img_20150314_115402.jpg
Figure 1: The hookup and the Android app in action

It was Dmitry Grinberg who figured out how to use nRF24L01 for BLE.
Read his amazing "Bit-banging" Bluetooth Low Energy. Thank you Dmitry!
I ported the code to mbed from Lijun's repository. Read his very neat article on the topic. Thank you Lijun!


It takes just few steps to build a Temperature Beacon

  1. Connect the nRF24L01(+) module and the DS1820 sensor to the mbed board according to the pin assignment defined in main.cpp. Don't forget to connect a 4.7k Ohm resistor between the DS1820's data pin and the +3.3V pin.

    /media/uploads/hudakz/nrf24l01.png
    Figure 2: nRF24L01(+) pinout

  2. Compile the project and save the binary file to your mbed module.
  3. Enable Bluetooth on the Android device.
  4. To view the raw data, install Nordic's nRF Master Control Panel (available at Google Play for free) to your Android device. Run the app and wait until a new nRF24L01 device is found. Do not tap the CONNECT button. This device is a broadcaster and enables only one way data flow (from the mbed to the Android). To see more details, tap the found nRF24L01 device on the left side of the screen and then the small RAW button which appears on the right side just below the CONNECT button. Now you should be able to see and check the raw bytes received from the mbed.
  5. Install the Android app:
    - Download the TemperatureBeacon app to your computer's folder of choice.
    - Open the folder and copy (send via Bluetooth or USB cable) the downloaded file to your Android device.
    - To install the app, open the folder on the Android with the file downloaded in the previous step and tap it.
  6. Once the app is installed and running:
    - After a while you should see the temperature displayed on Android (See in Figure 1).
    - Data is periodically updated. To verify that, touch the DS1820 sensor and you should see some new values.

If you'd like to adapt the Android app to your taste

  • Install Android Studio onto your computer (Window, Mac, Linux). It's a fantastic IDE from Google for free.
  • Download the Android app project to your computer's folder of choice and unzip.
  • Start Android Studio, open the project downloaded in the previous step and have fun.

I have learnt a lot about Android and Bluetooth Low Energy here:
https://developer.android.com/guide/topics/connectivity/bluetooth-le.html,
https://thenewcircle.com/s/post/1553/bluetooth_smart_le_android_tutorial

The Android app is based on:
https://github.com/devunwired/accessory-samples/tree/master/BluetoothGatt.
Thank you Dave!

Committer:
hudakz
Date:
Mon Mar 16 08:35:22 2015 +0000
Revision:
4:b3c5c54cfd21
Parent:
3:96153a5d95f6
Child:
5:448e87318747
Added comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:6f3139e3410e 1 /*
hudakz 3:96153a5d95f6 2 Using nRF24L01(+) as a Bluetooth Low Energy Advertiser/Broadcaster/Beacon
hudakz 3:96153a5d95f6 3 by hacking an nRF24L01(+) module (which is under $1 per unit on eBay).
hudakz 0:6f3139e3410e 4
hudakz 3:96153a5d95f6 5 Note: It works with both nRF24L01 and nRF24L01+ modules.
hudakz 0:6f3139e3410e 6
hudakz 1:ef3cc9be1f60 7 In this project we broadcast temperature readings measured by a DS1820 chip.
hudakz 0:6f3139e3410e 8 (You can easily modify the code to broadcast some other custom data.
hudakz 0:6f3139e3410e 9 Only make sure not to exceed the 32 bytes packet length.)
hudakz 2:4f285d1d5c1f 10
hudakz 2:4f285d1d5c1f 11 The data can be received and displayed on an Android device (smartphone/tablet)
hudakz 2:4f285d1d5c1f 12 with Bluetooth Low Energy (Bluetooth Smart) enabled.
hudakz 2:4f285d1d5c1f 13 In order to have Bluetooth 4.0 available (which implements Bluetooth LE)
hudakz 2:4f285d1d5c1f 14 your device should run Android 4.3 or more recent.
hudakz 0:6f3139e3410e 15 */
hudakz 0:6f3139e3410e 16
hudakz 0:6f3139e3410e 17
hudakz 0:6f3139e3410e 18 #include "mbed.h"
hudakz 0:6f3139e3410e 19 #include "DS1820.h"
hudakz 0:6f3139e3410e 20
hudakz 2:4f285d1d5c1f 21 #define DEBUG 1
hudakz 2:4f285d1d5c1f 22
hudakz 2:4f285d1d5c1f 23 #if DEBUG
hudakz 0:6f3139e3410e 24 Serial serial(USBTX, USBRX);
hudakz 2:4f285d1d5c1f 25 #endif
hudakz 0:6f3139e3410e 26
hudakz 0:6f3139e3410e 27 // The MAC address of BLE advertizer -- just make one up
hudakz 0:6f3139e3410e 28 // If you decide to ceate more Beacons make sure that MAC address (MY_MAC) is unique (differs)
hudakz 0:6f3139e3410e 29
hudakz 0:6f3139e3410e 30 #define MY_MAC_0 0x11
hudakz 0:6f3139e3410e 31 #define MY_MAC_1 0x12
hudakz 0:6f3139e3410e 32 #define MY_MAC_2 0x33
hudakz 0:6f3139e3410e 33 #define MY_MAC_3 0x44
hudakz 0:6f3139e3410e 34 #define MY_MAC_4 0x55
hudakz 0:6f3139e3410e 35 #define MY_MAC_5 0x66
hudakz 0:6f3139e3410e 36
hudakz 0:6f3139e3410e 37 #if defined(TARGET_LPC1768)
hudakz 0:6f3139e3410e 38 SPI spi(p11, p12, p13); // MOSI, MISO, SCK
hudakz 0:6f3139e3410e 39 DigitalOut cs(p8); // CSN (select SPI chip/slave)
hudakz 4:b3c5c54cfd21 40 DigitalOut ce(p14); // CE (enable nRF24L01 chip)
hudakz 4:b3c5c54cfd21 41 DS1820 ds1820(p15); // create a ds1820 sensor
hudakz 1:ef3cc9be1f60 42 #elif defined(TARGET_FRDM_KL25Z)
hudakz 1:ef3cc9be1f60 43 SPI spi(PTD2, PTD3, PTD1); // MOSI, MISO, SCK
hudakz 1:ef3cc9be1f60 44 DigitalOut cs(PTD0); // CSN (select SPI chip/slave)
hudakz 4:b3c5c54cfd21 45 DigitalOut ce(PTD5); // CE (enable nRF24L01 chip)
hudakz 4:b3c5c54cfd21 46 DS1820 ds1820(PTA13); // create a ds1820 sensor
hudakz 1:ef3cc9be1f60 47 #elif defined(TARGET_FRDM_KL46Z)
hudakz 1:ef3cc9be1f60 48 SPI spi(PTD2, PTD3, PTD1); // MOSI, MISO, SCK
hudakz 1:ef3cc9be1f60 49 DigitalOut cs(PTD0); // CSN (select SPI chip/slave)
hudakz 4:b3c5c54cfd21 50 DigitalOut ce(PTD5); // CE (enable nRF24L01 chip)
hudakz 4:b3c5c54cfd21 51 DS1820 ds1820(PTA13); // create a ds1820 sensor
hudakz 1:ef3cc9be1f60 52 #elif defined(TARGET_LPC11U24)
hudakz 1:ef3cc9be1f60 53 SPI spi(P16, P15, P13); // MOSI, MISO, SCK
hudakz 1:ef3cc9be1f60 54 DigitalOut cs(P17); // CSN (select SPI chip/slave)
hudakz 4:b3c5c54cfd21 55 DigitalOut ce(P18); // CE (enable nRF24L01 chip)
hudakz 4:b3c5c54cfd21 56 DS1820 ds1820(P10); // create a ds1820 sensor
hudakz 3:96153a5d95f6 57 #elif defined(TARGET_NUCLEO_F030R8)
hudakz 3:96153a5d95f6 58 SPI spi(PB_5, PB_4, PB_3); // MOSI, MISO, SCK
hudakz 3:96153a5d95f6 59 DigitalOut cs(PB_10); // CSN (select SPI chip/slave)
hudakz 3:96153a5d95f6 60 DigitalOut ce(PA_8); // CE (enable nRF24L01+ chip)
hudakz 3:96153a5d95f6 61 DS1820 ds1820(PA_9); // creates a ds1820 sensor
hudakz 3:96153a5d95f6 62 #elif defined(TARGET_NUCLEO_F072RB)
hudakz 3:96153a5d95f6 63 SPI spi(PB_5, PB_4, PB_3); // MOSI, MISO, SCK
hudakz 3:96153a5d95f6 64 DigitalOut cs(PB_10); // CSN (select SPI chip/slave)
hudakz 4:b3c5c54cfd21 65 DigitalOut ce(PA_8); // CE (enable nRF24L01 chip)
hudakz 3:96153a5d95f6 66 DS1820 ds1820(PA_9); // creates a ds1820 sensor
hudakz 0:6f3139e3410e 67 #elif defined(TARGET_NUCLEO_F103RB)
hudakz 0:6f3139e3410e 68 SPI spi(PB_5, PB_4, PB_3); // MOSI, MISO, SCK
hudakz 0:6f3139e3410e 69 DigitalOut cs(PB_10); // CSN (select SPI chip/slave)
hudakz 4:b3c5c54cfd21 70 DigitalOut ce(PA_8); // CE (enable nRF24L01 chip)
hudakz 4:b3c5c54cfd21 71 DS1820 ds1820(PA_9); // create a ds1820 sensor
hudakz 0:6f3139e3410e 72 #elif defined(TARGET_NUCLEO_F401RE)
hudakz 0:6f3139e3410e 73 SPI spi(PB_5, PB_4, PB_3); // MOSI, MISO, SCK
hudakz 0:6f3139e3410e 74 DigitalOut cs(PB_10); // CSN (select SPI chip/slave)
hudakz 4:b3c5c54cfd21 75 DigitalOut ce(PA_8); // CE (enable nRF24L01 chip)
hudakz 3:96153a5d95f6 76 DS1820 ds1820(PA_9); // creates a ds1820 sensor
hudakz 0:6f3139e3410e 77 #elif defined(TARGET_NUCLEO_F411RE)
hudakz 0:6f3139e3410e 78 SPI spi(PB_5, PB_4, PB_3); // MOSI, MISO, SCK
hudakz 0:6f3139e3410e 79 DigitalOut cs(PB_10); // CSN (select SPI chip/slave)
hudakz 4:b3c5c54cfd21 80 DigitalOut ce(PA_8); // CE (enable nRF24L01 chip)
hudakz 3:96153a5d95f6 81 DS1820 ds1820(PA_9); // creates a ds1820 sensor
hudakz 0:6f3139e3410e 82
hudakz 0:6f3139e3410e 83 // If your board/plaform is not present yet then uncomment
hudakz 4:b3c5c54cfd21 84 // the following five lines and replace TARGET_YOUR_BOARD, SPI_MOSI, SPI_MISO, SPI_SCK, SPIS_CS, CE_PIN and DS1820_DATA_PIN as appropriate.
hudakz 0:6f3139e3410e 85
hudakz 0:6f3139e3410e 86 //#elif defined(TARGET_YOUR_BOARD)
hudakz 0:6f3139e3410e 87 //SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK);
hudakz 0:6f3139e3410e 88 //DigitalOut cs(SPI_CS); // CSN (select SPI chip/slave)
hudakz 0:6f3139e3410e 89 //DigitalOut cs(CE_PIN); // CE (enable nRF24L01+ chip)
hudakz 4:b3c5c54cfd21 90 //DS1820 ds1820(DS1820_DATA_PIN);// create a ds1820 sensor
hudakz 0:6f3139e3410e 91
hudakz 0:6f3139e3410e 92 #endif
hudakz 0:6f3139e3410e 93
hudakz 0:6f3139e3410e 94 uint8_t buf[32];
hudakz 0:6f3139e3410e 95
hudakz 0:6f3139e3410e 96 /**
hudakz 4:b3c5c54cfd21 97 * @brief Implements CRC with LFSR
hudakz 0:6f3139e3410e 98 * @note
hudakz 4:b3c5c54cfd21 99 * @param data: packet data
hudakz 4:b3c5c54cfd21 100 * len: packet length
hudakz 4:b3c5c54cfd21 101 * dst: destination/location of CRC
hudakz 0:6f3139e3410e 102 * @retval
hudakz 0:6f3139e3410e 103 */
hudakz 0:6f3139e3410e 104 void bleCRC(const uint8_t* data, uint8_t len, uint8_t* dst) {
hudakz 0:6f3139e3410e 105 uint8_t v, t, d;
hudakz 0:6f3139e3410e 106
hudakz 0:6f3139e3410e 107 while(len--) {
hudakz 0:6f3139e3410e 108 d = *data++;
hudakz 0:6f3139e3410e 109 for(v = 0; v < 8; v++, d >>= 1) {
hudakz 0:6f3139e3410e 110 t = dst[0] >> 7;
hudakz 0:6f3139e3410e 111 dst[0] <<= 1;
hudakz 0:6f3139e3410e 112 if(dst[1] & 0x80)
hudakz 0:6f3139e3410e 113 dst[0] |= 1;
hudakz 0:6f3139e3410e 114 dst[1] <<= 1;
hudakz 0:6f3139e3410e 115 if(dst[2] & 0x80)
hudakz 0:6f3139e3410e 116 dst[1] |= 1;
hudakz 0:6f3139e3410e 117 dst[2] <<= 1;
hudakz 0:6f3139e3410e 118
hudakz 0:6f3139e3410e 119 if(t != (d & 1)) {
hudakz 0:6f3139e3410e 120 dst[2] ^= 0x5B;
hudakz 0:6f3139e3410e 121 dst[1] ^= 0x06;
hudakz 0:6f3139e3410e 122 }
hudakz 0:6f3139e3410e 123 }
hudakz 0:6f3139e3410e 124 }
hudakz 0:6f3139e3410e 125 }
hudakz 0:6f3139e3410e 126
hudakz 0:6f3139e3410e 127 /**
hudakz 4:b3c5c54cfd21 128 * @brief Reverses bit order in a single byte
hudakz 0:6f3139e3410e 129 * @note
hudakz 4:b3c5c54cfd21 130 * @param a: byte to be reveresed
hudakz 4:b3c5c54cfd21 131 * @retval byte with reveresed bit order
hudakz 0:6f3139e3410e 132 */
hudakz 0:6f3139e3410e 133 uint8_t swapBits(uint8_t a) {
hudakz 0:6f3139e3410e 134 uint8_t v = 0;
hudakz 0:6f3139e3410e 135 if(a & 0x80)
hudakz 0:6f3139e3410e 136 v |= 0x01;
hudakz 0:6f3139e3410e 137 if(a & 0x40)
hudakz 0:6f3139e3410e 138 v |= 0x02;
hudakz 0:6f3139e3410e 139 if(a & 0x20)
hudakz 0:6f3139e3410e 140 v |= 0x04;
hudakz 0:6f3139e3410e 141 if(a & 0x10)
hudakz 0:6f3139e3410e 142 v |= 0x08;
hudakz 0:6f3139e3410e 143 if(a & 0x08)
hudakz 0:6f3139e3410e 144 v |= 0x10;
hudakz 0:6f3139e3410e 145 if(a & 0x04)
hudakz 0:6f3139e3410e 146 v |= 0x20;
hudakz 0:6f3139e3410e 147 if(a & 0x02)
hudakz 0:6f3139e3410e 148 v |= 0x40;
hudakz 0:6f3139e3410e 149 if(a & 0x01)
hudakz 0:6f3139e3410e 150 v |= 0x80;
hudakz 0:6f3139e3410e 151 return v;
hudakz 0:6f3139e3410e 152 }
hudakz 0:6f3139e3410e 153
hudakz 0:6f3139e3410e 154 /**
hudakz 4:b3c5c54cfd21 155 * @brief Implements whitening with LFSR
hudakz 0:6f3139e3410e 156 * @note
hudakz 4:b3c5c54cfd21 157 * @param data: location of the data to be whiten
hudakz 4:b3c5c54cfd21 158 * len: data length
hudakz 4:b3c5c54cfd21 159 * whitenCoeff: whitening coefficient
hudakz 0:6f3139e3410e 160 * @retval
hudakz 0:6f3139e3410e 161 */
hudakz 0:6f3139e3410e 162 void bleWhiten(uint8_t* data, uint8_t len, uint8_t whitenCoeff) {
hudakz 0:6f3139e3410e 163 uint8_t m;
hudakz 0:6f3139e3410e 164 while(len--) {
hudakz 0:6f3139e3410e 165 for(m = 1; m; m <<= 1) {
hudakz 0:6f3139e3410e 166 if(whitenCoeff & 0x80) {
hudakz 0:6f3139e3410e 167 whitenCoeff ^= 0x11;
hudakz 0:6f3139e3410e 168 (*data) ^= m;
hudakz 0:6f3139e3410e 169 }
hudakz 0:6f3139e3410e 170
hudakz 0:6f3139e3410e 171 whitenCoeff <<= 1;
hudakz 0:6f3139e3410e 172 }
hudakz 0:6f3139e3410e 173
hudakz 0:6f3139e3410e 174 data++;
hudakz 0:6f3139e3410e 175 }
hudakz 0:6f3139e3410e 176 }
hudakz 0:6f3139e3410e 177
hudakz 0:6f3139e3410e 178 /**
hudakz 4:b3c5c54cfd21 179 * @brief Starts whitening
hudakz 4:b3c5c54cfd21 180 * @note the value we actually use is what BT'd use left shifted one...makes our life easier
hudakz 4:b3c5c54cfd21 181 * @param chan: BT channel
hudakz 4:b3c5c54cfd21 182 * @retval single byte
hudakz 0:6f3139e3410e 183 */
hudakz 0:6f3139e3410e 184 static inline uint8_t bleWhitenStart(uint8_t chan) {
hudakz 0:6f3139e3410e 185 return swapBits(chan) | 2;
hudakz 0:6f3139e3410e 186 }
hudakz 0:6f3139e3410e 187
hudakz 0:6f3139e3410e 188 /**
hudakz 4:b3c5c54cfd21 189 * @brief Assembles the packet to be transmitted
hudakz 0:6f3139e3410e 190 * @note
hudakz 4:b3c5c54cfd21 191 * @param data: packet data
hudakz 4:b3c5c54cfd21 192 * len: packet length
hudakz 4:b3c5c54cfd21 193 * dst: BLE channel
hudakz 0:6f3139e3410e 194 * @retval
hudakz 0:6f3139e3410e 195 */
hudakz 0:6f3139e3410e 196 void blePacketEncode(uint8_t* packet, uint8_t len, uint8_t chan) {
hudakz 0:6f3139e3410e 197 // Length is of packet, including crc. pre-populate crc in packet with initial crc value!
hudakz 0:6f3139e3410e 198 uint8_t i, dataLen = len - 3;
hudakz 0:6f3139e3410e 199 bleCRC(packet, dataLen, packet + dataLen);
hudakz 0:6f3139e3410e 200 for(i = 0; i < 3; i++, dataLen++)
hudakz 0:6f3139e3410e 201 packet[dataLen] = swapBits(packet[dataLen]);
hudakz 0:6f3139e3410e 202 bleWhiten(packet, len, bleWhitenStart(chan));
hudakz 0:6f3139e3410e 203 for(i = 0; i < len; i++)
hudakz 0:6f3139e3410e 204 packet[i] = swapBits(packet[i]); // the byte order of the packet should be reversed as well
hudakz 0:6f3139e3410e 205 }
hudakz 0:6f3139e3410e 206
hudakz 0:6f3139e3410e 207 /**
hudakz 4:b3c5c54cfd21 208 * @brief Sends cmommand to nRF24L01
hudakz 0:6f3139e3410e 209 * @note
hudakz 4:b3c5c54cfd21 210 * @param cmd: Command
hudakz 4:b3c5c54cfd21 211 * data: Data associated with the command
hudakz 0:6f3139e3410e 212 * @retval
hudakz 0:6f3139e3410e 213 */
hudakz 0:6f3139e3410e 214 void nrfCmd(uint8_t cmd, uint8_t data) {
hudakz 0:6f3139e3410e 215
hudakz 0:6f3139e3410e 216 // Write to nRF24's register
hudakz 0:6f3139e3410e 217
hudakz 0:6f3139e3410e 218 cs = 0;
hudakz 0:6f3139e3410e 219 spi.write(cmd);
hudakz 0:6f3139e3410e 220 spi.write(data);
hudakz 0:6f3139e3410e 221 cs = 1;
hudakz 0:6f3139e3410e 222 }
hudakz 0:6f3139e3410e 223
hudakz 0:6f3139e3410e 224 /**
hudakz 4:b3c5c54cfd21 225 * @brief Transfers one byte to nRF24L01
hudakz 0:6f3139e3410e 226 * @note
hudakz 4:b3c5c54cfd21 227 * @param cmd: the byte to be transferred
hudakz 0:6f3139e3410e 228 * @retval
hudakz 0:6f3139e3410e 229 */
hudakz 0:6f3139e3410e 230 void nrfWriteByte(uint8_t cmd) {
hudakz 0:6f3139e3410e 231 // transfer only one byte
hudakz 0:6f3139e3410e 232 cs = 0;
hudakz 0:6f3139e3410e 233 spi.write(cmd);
hudakz 0:6f3139e3410e 234 cs = 1;
hudakz 0:6f3139e3410e 235 }
hudakz 0:6f3139e3410e 236
hudakz 0:6f3139e3410e 237 /**
hudakz 4:b3c5c54cfd21 238 * @brief Transfers several bytes to nRF24L01
hudakz 0:6f3139e3410e 239 * @note
hudakz 4:b3c5c54cfd21 240 * @param data: location of bytes to be transferred
hudakz 4:b3c5c54cfd21 241 * len: number of bytes to be transferred
hudakz 0:6f3139e3410e 242 * @retval
hudakz 0:6f3139e3410e 243 */
hudakz 0:6f3139e3410e 244 void nrfWriteBytes(uint8_t* data, uint8_t len) {
hudakz 0:6f3139e3410e 245 // transfer several bytes in a row
hudakz 0:6f3139e3410e 246 cs = 0;
hudakz 0:6f3139e3410e 247 do
hudakz 0:6f3139e3410e 248 {
hudakz 0:6f3139e3410e 249 spi.write(*data++);
hudakz 0:6f3139e3410e 250 } while(--len);
hudakz 0:6f3139e3410e 251 cs = 1;
hudakz 0:6f3139e3410e 252 }
hudakz 0:6f3139e3410e 253
hudakz 0:6f3139e3410e 254 int main() {
hudakz 0:6f3139e3410e 255 uint8_t data[4];
hudakz 0:6f3139e3410e 256 float* temp = reinterpret_cast < float * > (&data[0]);
hudakz 0:6f3139e3410e 257
hudakz 0:6f3139e3410e 258 // Chip must be deselected
hudakz 0:6f3139e3410e 259 cs = 1;
hudakz 0:6f3139e3410e 260
hudakz 0:6f3139e3410e 261 // Setup the spi for 8 bit data, high steady state clock,
hudakz 0:6f3139e3410e 262 // second edge capture, with a 10MHz clock rate
hudakz 0:6f3139e3410e 263 spi.format(8,0);
hudakz 0:6f3139e3410e 264 spi.frequency(10000000);
hudakz 0:6f3139e3410e 265
hudakz 0:6f3139e3410e 266 ce = 0;
hudakz 0:6f3139e3410e 267
hudakz 0:6f3139e3410e 268 // Initialize nRF24L01+, setting general parameters
hudakz 0:6f3139e3410e 269 nrfCmd(0x20, 0x12); // on, no crc, int on RX/TX done
hudakz 0:6f3139e3410e 270 nrfCmd(0x21, 0x00); // no auto-acknowledge
hudakz 0:6f3139e3410e 271 nrfCmd(0x22, 0x00); // no RX
hudakz 0:6f3139e3410e 272 nrfCmd(0x23, 0x02); // 4-byte address
hudakz 0:6f3139e3410e 273 nrfCmd(0x24, 0x00); // no auto-retransmit
hudakz 0:6f3139e3410e 274 nrfCmd(0x26, 0x06); // 1MBps at 0dBm
hudakz 0:6f3139e3410e 275 nrfCmd(0x27, 0x3E); // clear various flags
hudakz 0:6f3139e3410e 276 nrfCmd(0x3C, 0x00); // no dynamic payloads
hudakz 0:6f3139e3410e 277 nrfCmd(0x3D, 0x00); // no features
hudakz 0:6f3139e3410e 278 nrfCmd(0x31, 32); // always RX 32 bytes
hudakz 0:6f3139e3410e 279 nrfCmd(0x22, 0x01); // RX on pipe 0
hudakz 0:6f3139e3410e 280
hudakz 0:6f3139e3410e 281 // Set access addresses (TX address in nRF24L01) to BLE advertising 0x8E89BED6
hudakz 0:6f3139e3410e 282 // Remember that both bit and byte orders are reversed for BLE packet format
hudakz 0:6f3139e3410e 283 buf[0] = 0x30;
hudakz 0:6f3139e3410e 284 buf[1] = swapBits(0x8E);
hudakz 0:6f3139e3410e 285 buf[2] = swapBits(0x89);
hudakz 0:6f3139e3410e 286 buf[3] = swapBits(0xBE);
hudakz 0:6f3139e3410e 287 buf[4] = swapBits(0xD6);
hudakz 0:6f3139e3410e 288 nrfWriteBytes(buf, 5);
hudakz 0:6f3139e3410e 289 buf[0] = 0x2A; // set RX address in nRF24L01, doesn't matter because RX is ignored in this case
hudakz 0:6f3139e3410e 290 nrfWriteBytes(buf, 5);
hudakz 4:b3c5c54cfd21 291
hudakz 3:96153a5d95f6 292 if(!ds1820.begin()) {
hudakz 3:96153a5d95f6 293 #if DEBUG
hudakz 3:96153a5d95f6 294 serial.printf("No DS1820 sensor found!\r\n");
hudakz 3:96153a5d95f6 295 #endif
hudakz 4:b3c5c54cfd21 296 return 1;
hudakz 3:96153a5d95f6 297 }
hudakz 0:6f3139e3410e 298
hudakz 4:b3c5c54cfd21 299 ds1820.startConversion(); // Start temperature conversion
hudakz 4:b3c5c54cfd21 300 wait(1.0); // let DS1820 complete the temperature conversion
hudakz 4:b3c5c54cfd21 301
hudakz 0:6f3139e3410e 302 while(1) {
hudakz 0:6f3139e3410e 303 static const uint8_t chRf[] = { 2, 26, 80 };
hudakz 0:6f3139e3410e 304 static const uint8_t chLe[] = { 37, 38, 39 };
hudakz 0:6f3139e3410e 305 uint8_t i = 0;
hudakz 0:6f3139e3410e 306 uint8_t j = 0;
hudakz 0:6f3139e3410e 307 uint8_t ch = 0;
hudakz 0:6f3139e3410e 308
hudakz 0:6f3139e3410e 309 *temp = ds1820.read();
hudakz 2:4f285d1d5c1f 310
hudakz 2:4f285d1d5c1f 311 #if DEBUG
hudakz 2:4f285d1d5c1f 312 serial.printf("temp = %3.1f'C\r\n", *temp);
hudakz 2:4f285d1d5c1f 313 #endif
hudakz 0:6f3139e3410e 314
hudakz 0:6f3139e3410e 315 buf[i++] = 0x42; // PDU type, given address is random; 0x42 for Android and 0x40 for iPhone
hudakz 0:6f3139e3410e 316 buf[i++] = 25; // number of following data bytes, max 29 (CRC is not included)
hudakz 0:6f3139e3410e 317
hudakz 0:6f3139e3410e 318 //----------------------------
hudakz 0:6f3139e3410e 319 buf[i++] = MY_MAC_0;
hudakz 0:6f3139e3410e 320 buf[i++] = MY_MAC_1;
hudakz 0:6f3139e3410e 321 buf[i++] = MY_MAC_2;
hudakz 0:6f3139e3410e 322 buf[i++] = MY_MAC_3;
hudakz 0:6f3139e3410e 323 buf[i++] = MY_MAC_4;
hudakz 0:6f3139e3410e 324 buf[i++] = MY_MAC_5;
hudakz 0:6f3139e3410e 325
hudakz 0:6f3139e3410e 326 buf[i++] = 2; // flags (LE-only, limited discovery mode)
hudakz 0:6f3139e3410e 327 buf[i++] = 0x01;
hudakz 0:6f3139e3410e 328 buf[i++] = 0x05;
hudakz 0:6f3139e3410e 329
hudakz 0:6f3139e3410e 330 buf[i++] = 9; // length of the name, including type byte
hudakz 0:6f3139e3410e 331 buf[i++] = 0x08; // TYPE_NAME_SHORT
hudakz 0:6f3139e3410e 332 buf[i++] = 'n';
hudakz 0:6f3139e3410e 333 buf[i++] = 'R';
hudakz 0:6f3139e3410e 334 buf[i++] = 'F';
hudakz 0:6f3139e3410e 335 buf[i++] = '2';
hudakz 0:6f3139e3410e 336 buf[i++] = '4';
hudakz 0:6f3139e3410e 337 buf[i++] = 'L';
hudakz 0:6f3139e3410e 338 buf[i++] = '0';
hudakz 0:6f3139e3410e 339 buf[i++] = '1';
hudakz 0:6f3139e3410e 340
hudakz 0:6f3139e3410e 341 buf[i++] = 5; // length of custom data, including type byte
hudakz 0:6f3139e3410e 342 buf[i++] = 0xff; // TYPE_CUSTOMDATA
hudakz 0:6f3139e3410e 343
hudakz 0:6f3139e3410e 344 buf[i++] = data[0]; // temperature floating point value (four bytes)
hudakz 0:6f3139e3410e 345 buf[i++] = data[1];
hudakz 0:6f3139e3410e 346 buf[i++] = data[2];
hudakz 0:6f3139e3410e 347 buf[i++] = data[3];
hudakz 0:6f3139e3410e 348 //----------------------------
hudakz 0:6f3139e3410e 349
hudakz 0:6f3139e3410e 350 buf[i++] = 0x55; // CRC start value: 0x555555
hudakz 0:6f3139e3410e 351 buf[i++] = 0x55;
hudakz 0:6f3139e3410e 352 buf[i++] = 0x55;
hudakz 0:6f3139e3410e 353
hudakz 0:6f3139e3410e 354 // Channel hopping
hudakz 0:6f3139e3410e 355 if(++ch == sizeof(chRf))
hudakz 0:6f3139e3410e 356 ch = 0;
hudakz 0:6f3139e3410e 357 nrfCmd(0x25, chRf[ch]);
hudakz 0:6f3139e3410e 358 nrfCmd(0x27, 0x6E); // Clear flags
hudakz 0:6f3139e3410e 359 blePacketEncode(buf, i, chLe[ch]);
hudakz 0:6f3139e3410e 360 nrfWriteByte(0xE2); // Clear RX Fifo
hudakz 0:6f3139e3410e 361 nrfWriteByte(0xE1); // Clear TX Fifo
hudakz 2:4f285d1d5c1f 362
hudakz 0:6f3139e3410e 363 cs = 0;
hudakz 0:6f3139e3410e 364 spi.write(0xA0);
hudakz 0:6f3139e3410e 365 for(j = 0; j < i; j++)
hudakz 0:6f3139e3410e 366 spi.write(buf[j]);
hudakz 0:6f3139e3410e 367 cs = 1;
hudakz 0:6f3139e3410e 368
hudakz 0:6f3139e3410e 369 nrfCmd(0x20, 0x12); // TX on
hudakz 0:6f3139e3410e 370 ce = 1; // Enable Chip
hudakz 0:6f3139e3410e 371 wait_ms(50);
hudakz 0:6f3139e3410e 372 ce = 0; // (in preparation of switching to RX quickly)
hudakz 0:6f3139e3410e 373 ds1820.startConversion(); // Start temperature conversion
hudakz 4:b3c5c54cfd21 374 wait(1.0); // Broadcasting interval (shall be > DS1820 temperture converion time)
hudakz 0:6f3139e3410e 375 }
hudakz 0:6f3139e3410e 376 }