BLE sensor for temperature and humidity using Si7021 and photocell.

Dependencies:   BLE_API mbed nRF51822

Committer:
electronichamsters
Date:
Sun Sep 24 06:42:25 2017 +0000
Revision:
13:64601d952fe4
Parent:
12:45c2bb8231bf
tested. works

Who changed what in which revision?

UserRevisionLine numberNew contents of line
electronichamsters 12:45c2bb8231bf 1 /*
electronichamsters 12:45c2bb8231bf 2 * Copyright (c) Eric Tsai 2017
electronichamsters 12:45c2bb8231bf 3 *
electronichamsters 12:45c2bb8231bf 4 *
electronichamsters 12:45c2bb8231bf 5 * Licensed under the Apache License, Version 2.0 (the "License");
electronichamsters 12:45c2bb8231bf 6 * you may not use this file except in compliance with the License.
electronichamsters 12:45c2bb8231bf 7 * You may obtain a copy of the License at
electronichamsters 12:45c2bb8231bf 8 *
electronichamsters 12:45c2bb8231bf 9 * http://www.apache.org/licenses/LICENSE-2.0
electronichamsters 12:45c2bb8231bf 10 *
electronichamsters 12:45c2bb8231bf 11 * Unless required by applicable law or agreed to in writing, software
electronichamsters 12:45c2bb8231bf 12 * distributed under the License is distributed on an "AS IS" BASIS,
electronichamsters 12:45c2bb8231bf 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
electronichamsters 12:45c2bb8231bf 14 * See the License for the specific language governing permissions and
electronichamsters 12:45c2bb8231bf 15 * limitations under the License.
electronichamsters 12:45c2bb8231bf 16 *
electronichamsters 12:45c2bb8231bf 17 *
electronichamsters 12:45c2bb8231bf 18 * Credit: started with the basic BLE Temperature Beacon code from mbed Bluetooth Low Energy team
electronichamsters 12:45c2bb8231bf 19 * https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_TemperatureBeacon/file/0a8bbb6dea16/main.cpp
electronichamsters 12:45c2bb8231bf 20 *
electronichamsters 12:45c2bb8231bf 21 * BLE sensor as Beacon advertisements. Intended to function with specific BLE observer.
electronichamsters 12:45c2bb8231bf 22 * Tested on nRF51822 targets on mbed.
electronichamsters 12:45c2bb8231bf 23 * keywords: todo, tochange
electronichamsters 12:45c2bb8231bf 24 */
electronichamsters 8:46c5e0bfab05 25
sunsmile2015 0:3dc6e424dba0 26
electronichamsters 8:46c5e0bfab05 27 extern "C"
electronichamsters 8:46c5e0bfab05 28 {
electronichamsters 12:45c2bb8231bf 29 #include "nrf_ecb.h" //required to call the ecb functions for encryption
electronichamsters 8:46c5e0bfab05 30 }
electronichamsters 8:46c5e0bfab05 31
sunsmile2015 0:3dc6e424dba0 32 #include "mbed.h"
rgrover1 5:f4d74a8cad43 33 #include "toolchain.h"
sunsmile2015 0:3dc6e424dba0 34 #include "ble/BLE.h"
electronichamsters 12:45c2bb8231bf 35 #include "Si7021.h" //credit for library @irsanjul: https://os.mbed.com/users/irsanjul/code/Si7021/
electronichamsters 10:79e8f92ef156 36
electronichamsters 11:4f925834167d 37
electronichamsters 8:46c5e0bfab05 38
electronichamsters 12:45c2bb8231bf 39 /*******************************************************************************************
electronichamsters 12:45c2bb8231bf 40 * START tochange: items that may need customization depending on sensors, hardware, and desired behavior
electronichamsters 12:45c2bb8231bf 41 *******************************************************************************************/
electronichamsters 12:45c2bb8231bf 42 const uint16_t Periodic_Update_Seconds = 15; //number of seconds between periodic I/O status re-transmits 900s =15 min.
electronichamsters 12:45c2bb8231bf 43 #define MyDebugEnb 0 //enables serial output for debug, consumes ~1mA when idle
electronichamsters 12:45c2bb8231bf 44 //uint8_t magnet_near=0; //this I/O, specifically for reed switch sensor
electronichamsters 12:45c2bb8231bf 45
electronichamsters 12:45c2bb8231bf 46 //set I2C pins
electronichamsters 12:45c2bb8231bf 47 Si7021 tempI2C(p9, p11); //sda=p0.9, scl=p.11, for bart boards
electronichamsters 12:45c2bb8231bf 48 //Si7021 tempI2C(p0, p1); //sda=p0.0, scl=p0.1
electronichamsters 12:45c2bb8231bf 49
electronichamsters 13:64601d952fe4 50 DigitalOut sensorPwr(p0); //digital output on P0.00, for light sensor, bart board
electronichamsters 13:64601d952fe4 51
electronichamsters 12:45c2bb8231bf 52
electronichamsters 12:45c2bb8231bf 53 //depending on how many sensor values you have, change this and examine Flag_Update_ADV_01
electronichamsters 12:45c2bb8231bf 54 const uint8_t Max_Sensor_Num = 3; //set to the number of advertisements (temp, humidity, lumins = 3)
electronichamsters 12:45c2bb8231bf 55
electronichamsters 12:45c2bb8231bf 56 //Set beacon rate behavior. If 4 Seconds_Per_Advertisement @ 300ms ADV_Interval_ms
electronichamsters 12:45c2bb8231bf 57 // then you have about 4 / 0.3 = 13 advertisements for each sensor data. Probably excessive.
electronichamsters 12:45c2bb8231bf 58 const uint8_t Seconds_Per_Advertisement = 2; //for each sensor, adverise for this seconds
electronichamsters 12:45c2bb8231bf 59 const uint16_t ADV_Interval_ms = 900; //ms between advertisements. Lower means more beacons. set >=10ms
electronichamsters 12:45c2bb8231bf 60
electronichamsters 12:45c2bb8231bf 61 //sensor data.
electronichamsters 12:45c2bb8231bf 62 char json_char_01[6] = {0, 0, 0, 0, 0, 0}; //hold json for temperature
electronichamsters 12:45c2bb8231bf 63 char json_char_02[6] = {0, 0, 0, 0, 0, 0}; //hold json for humidity
electronichamsters 12:45c2bb8231bf 64 char json_char_03[6] = {0, 0, 0, 0, 0, 0}; //hold json for next sensor
electronichamsters 12:45c2bb8231bf 65 uint8_t json_len_01;
electronichamsters 12:45c2bb8231bf 66 uint8_t json_len_02;
electronichamsters 12:45c2bb8231bf 67 uint8_t json_len_03;
electronichamsters 12:45c2bb8231bf 68
electronichamsters 12:45c2bb8231bf 69 //ADC_CONFIG_PSEL_AnalogInput4 = AIN4 = P0.03 = nRF Pin 7
electronichamsters 12:45c2bb8231bf 70 //ADC_CONFIG_PSEL_AnalogInput2 = AIN2 = P0.01 = nRF Pin 5
electronichamsters 12:45c2bb8231bf 71 #define MyAnalogPin ADC_CONFIG_PSEL_AnalogInput2
electronichamsters 12:45c2bb8231bf 72
electronichamsters 12:45c2bb8231bf 73 /******************************************************************************************
electronichamsters 12:45c2bb8231bf 74 * END tochange
electronichamsters 12:45c2bb8231bf 75 *******************************************************************************************/
electronichamsters 12:45c2bb8231bf 76
electronichamsters 12:45c2bb8231bf 77
electronichamsters 8:46c5e0bfab05 78 #if MyDebugEnb
electronichamsters 12:45c2bb8231bf 79 // if you see ~1mA consumption during sleep, that's because MyDebugEnb==1, it's enabled.
electronichamsters 8:46c5e0bfab05 80 Serial device(p9, p11); //nRF51822 uart : TX=p9. RX=p11
electronichamsters 8:46c5e0bfab05 81 #endif
electronichamsters 8:46c5e0bfab05 82
electronichamsters 12:45c2bb8231bf 83 static Ticker Tic_Stop_Adv; //used to stop advertising after X seconds
electronichamsters 12:45c2bb8231bf 84 static Ticker Tic_Debounce; //debounce I/O
electronichamsters 12:45c2bb8231bf 85 static Ticker Tic_Periodic; //transmit sensor data on a periodic basis outside I/O events
electronichamsters 8:46c5e0bfab05 86
electronichamsters 12:45c2bb8231bf 87 const uint16_t Periodicity = 1800; //birthday periodicity used for spoof checking, must match gateway. Should be 1800 seconds for 30minutes
electronichamsters 12:45c2bb8231bf 88 static Timer Tmr_From_Birthday; //holds number of seconds since birthday, for spoof detection
electronichamsters 12:45c2bb8231bf 89 static Ticker Tic_Birthday; //resets Tmr_From_Birthday every Periodicity seconds, for spoof detection
electronichamsters 12:45c2bb8231bf 90
electronichamsters 12:45c2bb8231bf 91
electronichamsters 12:45c2bb8231bf 92 static bool Flag_Update_IO = false; //flag to indicate event is hardware interrupt
electronichamsters 12:45c2bb8231bf 93 static bool Flag_Periodic_Call = false; //flag to indicate event is periodic callback
electronichamsters 12:45c2bb8231bf 94 static bool Flag_Detach_Adv_Tic = false; //flag to stop advertising
electronichamsters 12:45c2bb8231bf 95 static uint8_t Flag_Update_ADV_01 = 1; //flag for which sensor data to advertise; 1, 2, 3, etc...
electronichamsters 8:46c5e0bfab05 96
electronichamsters 12:45c2bb8231bf 97 /* Optional: Device Name, add for human read-ability */
electronichamsters 12:45c2bb8231bf 98 const static char DEVICE_NAME[] = "LOL";
electronichamsters 12:45c2bb8231bf 99
electronichamsters 12:45c2bb8231bf 100
electronichamsters 12:45c2bb8231bf 101 //Advertisement Data
electronichamsters 12:45c2bb8231bf 102 //note: AdvData[] holds bytes [5] to byte [30] of entire advertising data. The user content part after ADV flag and header
electronichamsters 12:45c2bb8231bf 103 static uint8_t AdvData[] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}; //26 Bytes manufacturer specific data
electronichamsters 12:45c2bb8231bf 104 char buffer[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //hold I/O reading json
electronichamsters 12:45c2bb8231bf 105 char bat_volt_char[6] = {0, 0, 0, 0, 0, 0}; //hold json for battery reading
electronichamsters 12:45c2bb8231bf 106 uint8_t Adv_First_Section[10]; //holds the first several bytes with a pattern indicating this sensor is "one of ours"
electronichamsters 12:45c2bb8231bf 107 uint8_t mac_reverse[6] = {0x0,0x0,0x0,0x0,0x0,0x0}; //mac address for this module
electronichamsters 8:46c5e0bfab05 108
electronichamsters 8:46c5e0bfab05 109
electronichamsters 12:45c2bb8231bf 110 /***** Advertisement structure is 31 Bytes ****************
rgrover1 5:f4d74a8cad43 111
electronichamsters 12:45c2bb8231bf 112 https://docs.mbed.com/docs/ble-intros/en/latest/Advanced/CustomGAP/
electronichamsters 8:46c5e0bfab05 113
electronichamsters 12:45c2bb8231bf 114 Full Advertisement:
electronichamsters 12:45c2bb8231bf 115 First 5 bytes are set by stack according to flag and header parameters.
electronichamsters 12:45c2bb8231bf 116 Last 26 bytes are user data
electronichamsters 12:45c2bb8231bf 117 -- tabbed --
electronichamsters 12:45c2bb8231bf 118 Byte 0 | AD1 Length | 0x02 | AD1 is 2 bytes long
electronichamsters 12:45c2bb8231bf 119 Byte 1 | AD1 Type | 0x01 | AD1 Data interpreted as flag
electronichamsters 12:45c2bb8231bf 120 Byte 2 | AD1 Data 0 | 0x06 | AD1 Data flag mean "00000110"
electronichamsters 12:45c2bb8231bf 121 Byte 3 | AD2 Length | 0x1B | AD2 is 27 bytes (0x1B) long (rest of this data)
electronichamsters 12:45c2bb8231bf 122 Byte 4 | AD2 Type | 0xFF | 0xFF mean Manufacturer Specific Data
electronichamsters 12:45c2bb8231bf 123 Byte 5 | AD2 Data 0 | ADV_Data[0] | "our device" flag, MAC[3]
electronichamsters 12:45c2bb8231bf 124 Byte 6 | AD2 Data 1 | ADV_Data[1] | "out device" flag, MAC[2]
electronichamsters 12:45c2bb8231bf 125 Byte 7 | AD2 Data 2 | ADV_Data[2] | "out device" flag, MAC[1]
electronichamsters 12:45c2bb8231bf 126 Byte 8 | AD2 Data 3 | ADV_Data[3] | "out device" flag, MAC[0]
electronichamsters 12:45c2bb8231bf 127 Byte 9 | AD2 Data 4 | ADV_Data[4] | battery voltage json MSB, ie 3 in 3.14
electronichamsters 12:45c2bb8231bf 128 Byte 10 | AD2 Data 5 | ADV_Data[5] | battery voltage json
electronichamsters 12:45c2bb8231bf 129 Byte 11 | AD2 Data 6 | ADV_Data[6] | battery voltage json
electronichamsters 12:45c2bb8231bf 130 Byte 12 | AD2 Data 7 | ADV_Data[7] | battery voltage json LSB, ie 4 in 3.14
electronichamsters 12:45c2bb8231bf 131 Byte 13 | AD2 Data 8 | ADV_Data[8] | reserved
electronichamsters 12:45c2bb8231bf 132 Byte 14 | AD2 Data 9 | ADV_Data[9] | reserved
electronichamsters 12:45c2bb8231bf 133 Byte 15 | AD2 Data 10 | ADV_Data[10] Encrypted | spoof - clock high byte, range 0 to 1800 seconds
electronichamsters 12:45c2bb8231bf 134 Byte 16 | AD2 Data 11 | ADV_Data[11] Encrypted | spoof - clock low byte
electronichamsters 12:45c2bb8231bf 135 Byte 17 | AD2 Data 12 | ADV_Data[12] Encrypted | Xmit_Cnt - increments per transmit event, 0-255
electronichamsters 12:45c2bb8231bf 136 Byte 18 | AD2 Data 13 | ADV_Data[13] Encrypted | JSON[0]
electronichamsters 12:45c2bb8231bf 137 Byte 19 | AD2 Data 14 | ADV_Data[14] Encrypted | JSON[1]
electronichamsters 12:45c2bb8231bf 138 Byte 20 | AD2 Data 15 | ADV_Data[15] Encrypted | JSON[2]
electronichamsters 12:45c2bb8231bf 139 Byte 21 | AD2 Data 16 | ADV_Data[16] Encrypted | JSON[3]
electronichamsters 12:45c2bb8231bf 140 Byte 22 | AD2 Data 17 | ADV_Data[17] Encrypted | JSON[4]
electronichamsters 12:45c2bb8231bf 141 Byte 23 | AD2 Data 18 | ADV_Data[18] Encrypted | JSON[5]
electronichamsters 12:45c2bb8231bf 142 Byte 24 | AD2 Data 19 | ADV_Data[19] Encrypted | JSON[6]
electronichamsters 12:45c2bb8231bf 143 Byte 25 | AD2 Data 20 | ADV_Data[20] Encrypted | JSON[7]
electronichamsters 12:45c2bb8231bf 144 Byte 26 | AD2 Data 21 | ADV_Data[21] Encrypted | JSON[8]
electronichamsters 12:45c2bb8231bf 145 Byte 27 | AD2 Data 22 | ADV_Data[22] Encrypted | JSON[9]
electronichamsters 12:45c2bb8231bf 146 Byte 28 | AD2 Data 23 | ADV_Data[23] Encrypted | JSON[10]
electronichamsters 12:45c2bb8231bf 147 Byte 29 | AD2 Data 24 | ADV_Data[24] Encrypted | JSON[11]
electronichamsters 12:45c2bb8231bf 148 Byte 30 | AD2 Data 25 | ADV_Data[25] Encrypted | JSON[12]
electronichamsters 8:46c5e0bfab05 149
electronichamsters 12:45c2bb8231bf 150 ***************************************************/
electronichamsters 8:46c5e0bfab05 151
electronichamsters 8:46c5e0bfab05 152
electronichamsters 8:46c5e0bfab05 153 static uint8_t key[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 8:46c5e0bfab05 154 //26 bytes adv data
electronichamsters 8:46c5e0bfab05 155 static uint8_t encrypted[26] = {0x0,0x0,0x0,0x1,0x1,0x1,0x2,0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x4,0x5,0x5,0x5,0x6,0x6,0x6,0x7,0x7,0x7,0x8,0x8}; /* Example of hex data */
electronichamsters 8:46c5e0bfab05 156 //static uint8_t key_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 8:46c5e0bfab05 157 static uint8_t key_buf[16] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x1, 0x2};
electronichamsters 8:46c5e0bfab05 158 static uint8_t src_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 8:46c5e0bfab05 159 static uint8_t des_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 8:46c5e0bfab05 160
electronichamsters 10:79e8f92ef156 161 uint8_t Xmit_Cnt = 1;
electronichamsters 8:46c5e0bfab05 162
electronichamsters 8:46c5e0bfab05 163
electronichamsters 8:46c5e0bfab05 164
electronichamsters 8:46c5e0bfab05 165 /* **** NOT USED **** */
electronichamsters 8:46c5e0bfab05 166 //16byte UUID loading happens here
electronichamsters 8:46c5e0bfab05 167 //Look at <GapAdvertisingData.h> for rest of definition
sunsmile2015 4:e5fa4c8838db 168 struct ApplicationData_t {
electronichamsters 8:46c5e0bfab05 169 //Byte 0: AppID High Byte
electronichamsters 8:46c5e0bfab05 170 //Byte 1: AppID Low Byte
electronichamsters 8:46c5e0bfab05 171 //Byte 2: sensor High Word
electronichamsters 8:46c5e0bfab05 172 //Byte 3:
electronichamsters 8:46c5e0bfab05 173 //Byte 4:
electronichamsters 8:46c5e0bfab05 174 //Byte 5: sensor Low Byte
electronichamsters 8:46c5e0bfab05 175
electronichamsters 8:46c5e0bfab05 176
electronichamsters 8:46c5e0bfab05 177 //app ID is 16 bit, (0xFEFE)
electronichamsters 8:46c5e0bfab05 178 uint16_t applicationSpecificId; /* An ID used to identify temperature value in the manufacture specific AD data field */
electronichamsters 8:46c5e0bfab05 179
electronichamsters 12:45c2bb8231bf 180 //TMP_nrf51::TempSensorValue_t tmpSensorValue; /* this is a float (32-bit), user data */
rgrover1 5:f4d74a8cad43 181 } PACKED;
sunsmile2015 0:3dc6e424dba0 182
electronichamsters 8:46c5e0bfab05 183
electronichamsters 8:46c5e0bfab05 184
electronichamsters 8:46c5e0bfab05 185 void debounce_Callback(void)
electronichamsters 8:46c5e0bfab05 186 {
electronichamsters 12:45c2bb8231bf 187 Tic_Debounce.detach();
electronichamsters 12:45c2bb8231bf 188 Flag_Update_IO = true; //start advertising
electronichamsters 8:46c5e0bfab05 189 /* Note that the buttonPressedCallback() executes in interrupt context, so it is safer to access
electronichamsters 8:46c5e0bfab05 190 * BLE device API from the main thread. */
electronichamsters 8:46c5e0bfab05 191
electronichamsters 8:46c5e0bfab05 192 }
electronichamsters 8:46c5e0bfab05 193
electronichamsters 8:46c5e0bfab05 194
electronichamsters 8:46c5e0bfab05 195
electronichamsters 12:45c2bb8231bf 196 void stop_adv_Callback(void)
electronichamsters 12:45c2bb8231bf 197 {
electronichamsters 12:45c2bb8231bf 198 /*stops advertising after X seconds or after all sensor data advertisements iterated through
electronichamsters 12:45c2bb8231bf 199 * flow:
electronichamsters 12:45c2bb8231bf 200 * set Flag_Update_ADV_01 = 1, 1st advertisement sent
electronichamsters 12:45c2bb8231bf 201 * set Flag_Update_ADV_01 = 2, 2nd advertisement sent
electronichamsters 12:45c2bb8231bf 202 * set Flag_Update_ADV_01 = 3, 3rd advertisement sent
electronichamsters 12:45c2bb8231bf 203 * now Flag_Update_ADV_01 is 3, stop.
electronichamsters 12:45c2bb8231bf 204 */
electronichamsters 12:45c2bb8231bf 205
electronichamsters 12:45c2bb8231bf 206 if (Flag_Update_ADV_01 >= Max_Sensor_Num) //set to the number of advertisements (temp, humidity, lumins = 3)
electronichamsters 12:45c2bb8231bf 207 {
electronichamsters 12:45c2bb8231bf 208 Flag_Detach_Adv_Tic = true; //flag to stop advertising
electronichamsters 12:45c2bb8231bf 209 Flag_Update_ADV_01=0; //reset so we start at the first sensor in the group on next periodic update trigger
electronichamsters 12:45c2bb8231bf 210 Flag_Periodic_Call = false;
electronichamsters 12:45c2bb8231bf 211 }
electronichamsters 12:45c2bb8231bf 212 else
electronichamsters 12:45c2bb8231bf 213 {
electronichamsters 12:45c2bb8231bf 214 Flag_Update_ADV_01++;
electronichamsters 12:45c2bb8231bf 215 Xmit_Cnt++; //increment transmit counter when updating I/O
electronichamsters 12:45c2bb8231bf 216 }
electronichamsters 12:45c2bb8231bf 217 }
electronichamsters 8:46c5e0bfab05 218
electronichamsters 8:46c5e0bfab05 219
electronichamsters 12:45c2bb8231bf 220
electronichamsters 12:45c2bb8231bf 221 /* ****************************************
electronichamsters 12:45c2bb8231bf 222 * Decides what actions need to be performed on periodic basis
electronichamsters 12:45c2bb8231bf 223 *******************************************/
electronichamsters 8:46c5e0bfab05 224 void periodic_Callback(void)
electronichamsters 8:46c5e0bfab05 225 {
electronichamsters 12:45c2bb8231bf 226 Flag_Update_IO = true;
electronichamsters 12:45c2bb8231bf 227 Flag_Update_ADV_01 = 1; //flag for advertising first sensor
electronichamsters 12:45c2bb8231bf 228 Flag_Periodic_Call = true; //adds the "p" in topic name
electronichamsters 12:45c2bb8231bf 229
electronichamsters 12:45c2bb8231bf 230 Xmit_Cnt++; //increment transmit counter when updating I/O
sunsmile2015 4:e5fa4c8838db 231 }
sunsmile2015 4:e5fa4c8838db 232
electronichamsters 12:45c2bb8231bf 233
electronichamsters 12:45c2bb8231bf 234 /* ****************************************
electronichamsters 12:45c2bb8231bf 235 * No RTC available, tickers only have a 35 minute range.
electronichamsters 12:45c2bb8231bf 236 * So periodicity for spoof avoidance is set to 30 minutes
electronichamsters 12:45c2bb8231bf 237 *******************************************/
electronichamsters 10:79e8f92ef156 238 void clock_reset_Callback(void)
electronichamsters 10:79e8f92ef156 239 {
electronichamsters 10:79e8f92ef156 240 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 241 device.printf("===== reset timer =====");
electronichamsters 10:79e8f92ef156 242 device.printf("\r\n");
electronichamsters 10:79e8f92ef156 243 #endif
electronichamsters 12:45c2bb8231bf 244 Tmr_From_Birthday.reset();
electronichamsters 10:79e8f92ef156 245 };
electronichamsters 10:79e8f92ef156 246
electronichamsters 12:45c2bb8231bf 247
rgrover1 5:f4d74a8cad43 248 void setupApplicationData(ApplicationData_t &appData)
sunsmile2015 4:e5fa4c8838db 249 {
electronichamsters 8:46c5e0bfab05 250 // two byte ID: 0xFEFE
electronichamsters 8:46c5e0bfab05 251 static const uint16_t APP_SPECIFIC_ID_TEST = 0xFEFE; //2 byte application ID
andresag 7:0a8bbb6dea16 252
sunsmile2015 4:e5fa4c8838db 253 appData.applicationSpecificId = APP_SPECIFIC_ID_TEST;
sunsmile2015 0:3dc6e424dba0 254 }
sunsmile2015 0:3dc6e424dba0 255
electronichamsters 8:46c5e0bfab05 256
electronichamsters 8:46c5e0bfab05 257
andresag 7:0a8bbb6dea16 258 /**
andresag 7:0a8bbb6dea16 259 * This function is called when the ble initialization process has failled
andresag 7:0a8bbb6dea16 260 */
andresag 7:0a8bbb6dea16 261 void onBleInitError(BLE &ble, ble_error_t error)
andresag 7:0a8bbb6dea16 262 {
andresag 7:0a8bbb6dea16 263 /* Initialization error handling should go here */
andresag 7:0a8bbb6dea16 264 }
andresag 7:0a8bbb6dea16 265
electronichamsters 12:45c2bb8231bf 266
electronichamsters 12:45c2bb8231bf 267
andresag 7:0a8bbb6dea16 268 /**
andresag 7:0a8bbb6dea16 269 * Callback triggered when the ble initialization process has finished
andresag 7:0a8bbb6dea16 270 */
andresag 7:0a8bbb6dea16 271 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
sunsmile2015 2:b935358da5ba 272 {
andresag 7:0a8bbb6dea16 273 BLE& ble = params->ble;
andresag 7:0a8bbb6dea16 274 ble_error_t error = params->error;
andresag 7:0a8bbb6dea16 275
andresag 7:0a8bbb6dea16 276 if (error != BLE_ERROR_NONE) {
andresag 7:0a8bbb6dea16 277 /* In case of error, forward the error handling to onBleInitError */
andresag 7:0a8bbb6dea16 278 onBleInitError(ble, error);
andresag 7:0a8bbb6dea16 279 return;
andresag 7:0a8bbb6dea16 280 }
andresag 7:0a8bbb6dea16 281
andresag 7:0a8bbb6dea16 282 /* Ensure that it is the default instance of BLE */
andresag 7:0a8bbb6dea16 283 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
andresag 7:0a8bbb6dea16 284 return;
andresag 7:0a8bbb6dea16 285 }
electronichamsters 8:46c5e0bfab05 286
electronichamsters 8:46c5e0bfab05 287 /* Set device name characteristic data */
electronichamsters 8:46c5e0bfab05 288 ble.gap().setDeviceName((const uint8_t *) DEVICE_NAME);
andresag 7:0a8bbb6dea16 289
rgrover1 5:f4d74a8cad43 290 /* Setup advertising payload */
electronichamsters 8:46c5e0bfab05 291 //set modes "no EDR", "discoverable" for beacon type advertisements
rgrover1 5:f4d74a8cad43 292 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
electronichamsters 8:46c5e0bfab05 293
electronichamsters 11:4f925834167d 294
electronichamsters 8:46c5e0bfab05 295 //from GAP example
electronichamsters 8:46c5e0bfab05 296 /* Sacrifice 2B of 31B to AdvType overhead, rest goes to AdvData array you define */
electronichamsters 8:46c5e0bfab05 297 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, AdvData, sizeof(AdvData));
electronichamsters 8:46c5e0bfab05 298
electronichamsters 8:46c5e0bfab05 299 /* Setup advertising parameters: not connectable */
electronichamsters 8:46c5e0bfab05 300 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
electronichamsters 12:45c2bb8231bf 301 ble.gap().setAdvertisingInterval(ADV_Interval_ms); //one advertisment every X ms. Self tickers, so you don't have to worry.
electronichamsters 8:46c5e0bfab05 302
electronichamsters 12:45c2bb8231bf 303 }
electronichamsters 8:46c5e0bfab05 304
electronichamsters 8:46c5e0bfab05 305
electronichamsters 11:4f925834167d 306 //not needed anymore
electronichamsters 8:46c5e0bfab05 307 void my_analogin_init(void)
electronichamsters 8:46c5e0bfab05 308 {
electronichamsters 10:79e8f92ef156 309
electronichamsters 8:46c5e0bfab05 310 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
electronichamsters 8:46c5e0bfab05 311 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 312 //(ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 8:46c5e0bfab05 313 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
electronichamsters 8:46c5e0bfab05 314 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 315 //(ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos) |
electronichamsters 8:46c5e0bfab05 316 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
electronichamsters 10:79e8f92ef156 317 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
electronichamsters 8:46c5e0bfab05 318 }
sunsmile2015 2:b935358da5ba 319
electronichamsters 12:45c2bb8231bf 320
electronichamsters 12:45c2bb8231bf 321 /* ****************************************
electronichamsters 12:45c2bb8231bf 322 * Read battery voltage using bandgap reference
electronichamsters 12:45c2bb8231bf 323 * shunt Vdd to ADC, thanks to Marcelo Salazar's notes here:
electronichamsters 12:45c2bb8231bf 324 * https://developer.mbed.org/users/MarceloSalazar/notebook/measuring-battery-voltage-with-nordic-nrf51x/
electronichamsters 12:45c2bb8231bf 325 *******************************************/
electronichamsters 12:45c2bb8231bf 326 uint16_t read_bat_volt(void)
electronichamsters 8:46c5e0bfab05 327 {
electronichamsters 10:79e8f92ef156 328 //10 bit resolution, route Vdd as analog input, set ADC ref to VBG band gap
electronichamsters 10:79e8f92ef156 329 //disable analog pin select "PSEL" because we're using Vdd as analog input
electronichamsters 10:79e8f92ef156 330 //no external voltage reference
electronichamsters 10:79e8f92ef156 331 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
electronichamsters 10:79e8f92ef156 332 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 333 //(ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 334 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
electronichamsters 10:79e8f92ef156 335 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 336 //(ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 337 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
electronichamsters 10:79e8f92ef156 338
electronichamsters 10:79e8f92ef156 339 //NRF_ADC->CONFIG &= ~ADC_CONFIG_PSEL_Msk;
electronichamsters 10:79e8f92ef156 340 //NRF_ADC->CONFIG |= ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos;
electronichamsters 10:79e8f92ef156 341 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
electronichamsters 10:79e8f92ef156 342 NRF_ADC->TASKS_START = 1;
electronichamsters 10:79e8f92ef156 343
electronichamsters 10:79e8f92ef156 344
electronichamsters 10:79e8f92ef156 345 //while loop doesn't actually loop until reading comlete, use a wait.
electronichamsters 10:79e8f92ef156 346 while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {};
electronichamsters 12:45c2bb8231bf 347 wait_ms(1);
electronichamsters 10:79e8f92ef156 348
electronichamsters 10:79e8f92ef156 349 //save off RESULT before disabling.
electronichamsters 10:79e8f92ef156 350 //uint16_t myresult = (uint16_t)NRF_ADC->RESULT;
electronichamsters 10:79e8f92ef156 351
electronichamsters 10:79e8f92ef156 352 //disable ADC to lower bat consumption
electronichamsters 10:79e8f92ef156 353 NRF_ADC->TASKS_STOP = 1;
electronichamsters 10:79e8f92ef156 354 //NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled; //disable to shutdown ADC & lower bat consumption
electronichamsters 10:79e8f92ef156 355
electronichamsters 10:79e8f92ef156 356 return (uint16_t)NRF_ADC->RESULT; // 10 bit
electronichamsters 10:79e8f92ef156 357 //return myresult;
electronichamsters 12:45c2bb8231bf 358 } //end read_bat_volt
electronichamsters 12:45c2bb8231bf 359
electronichamsters 12:45c2bb8231bf 360
electronichamsters 10:79e8f92ef156 361
electronichamsters 12:45c2bb8231bf 362 /* ****************************************
electronichamsters 12:45c2bb8231bf 363 * Read battery voltage using bandgap reference
electronichamsters 12:45c2bb8231bf 364 * shunt analog pin to ADC, from API here
electronichamsters 12:45c2bb8231bf 365 * https://developer.mbed.org/users/mbed_official/code/mbed-src/file/cb4253f91ada/targets/hal/TARGET_NORDIC/TARGET_NRF51822/analogin_api.c
electronichamsters 12:45c2bb8231bf 366 *******************************************/
electronichamsters 12:45c2bb8231bf 367 uint16_t read_ADC_pin(void)
electronichamsters 10:79e8f92ef156 368 {
electronichamsters 10:79e8f92ef156 369
electronichamsters 10:79e8f92ef156 370 //10 bit resolution, route PSEL pin as 1/3 input sel,
electronichamsters 10:79e8f92ef156 371 //set ADC ref to VBG band gap
electronichamsters 10:79e8f92ef156 372 //set AnalogInput4 as input pin (this is P0.03)
electronichamsters 10:79e8f92ef156 373 //no external voltage reference
electronichamsters 10:79e8f92ef156 374 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
electronichamsters 10:79e8f92ef156 375 //(ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 376 (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 377 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
electronichamsters 10:79e8f92ef156 378 //ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
electronichamsters 12:45c2bb8231bf 379 (MyAnalogPin << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 380 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
electronichamsters 10:79e8f92ef156 381 //set pin select to AnalogInput4 = pin 7 = p0.03 = AIN4
electronichamsters 10:79e8f92ef156 382 //NRF_ADC->CONFIG &= ~ADC_CONFIG_PSEL_Msk;
electronichamsters 10:79e8f92ef156 383 //NRF_ADC->CONFIG |= ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos;
electronichamsters 10:79e8f92ef156 384 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
electronichamsters 8:46c5e0bfab05 385 NRF_ADC->TASKS_START = 1;
electronichamsters 8:46c5e0bfab05 386
electronichamsters 8:46c5e0bfab05 387
electronichamsters 8:46c5e0bfab05 388 //while loop doesn't actually loop until reading comlete, use a wait.
electronichamsters 8:46c5e0bfab05 389 while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {};
electronichamsters 12:45c2bb8231bf 390 wait_ms(1); //needed because busy while loop doesn't run.
electronichamsters 8:46c5e0bfab05 391
electronichamsters 8:46c5e0bfab05 392 //save off RESULT before disabling.
electronichamsters 8:46c5e0bfab05 393 //uint16_t myresult = (uint16_t)NRF_ADC->RESULT;
electronichamsters 8:46c5e0bfab05 394
electronichamsters 8:46c5e0bfab05 395 //disable ADC to lower bat consumption
electronichamsters 8:46c5e0bfab05 396 //NRF_ADC->TASKS_STOP = 1;
electronichamsters 8:46c5e0bfab05 397 //NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled; //disable to shutdown ADC & lower bat consumption
electronichamsters 8:46c5e0bfab05 398
electronichamsters 8:46c5e0bfab05 399 return (uint16_t)NRF_ADC->RESULT; // 10 bit
electronichamsters 8:46c5e0bfab05 400 //return myresult;
electronichamsters 12:45c2bb8231bf 401 } //end read_ADC_pin
sunsmile2015 4:e5fa4c8838db 402
electronichamsters 10:79e8f92ef156 403
electronichamsters 12:45c2bb8231bf 404 /* ****************************************
electronichamsters 12:45c2bb8231bf 405 * Pattern scheme indicating "one of ours"
electronichamsters 12:45c2bb8231bf 406 * generate first part of ADV data so that observer can recognize it as "one of ours".
electronichamsters 12:45c2bb8231bf 407 * use specific schema to decide how we're recognizing our sensor ADV
electronichamsters 12:45c2bb8231bf 408 *******************************************/
electronichamsters 10:79e8f92ef156 409 void hash_first_section(uint8_t * dest, const uint8_t * mac_addr, const char * bat_volt_str)
electronichamsters 10:79e8f92ef156 410 {
electronichamsters 10:79e8f92ef156 411 dest[0] = mac_addr[3];
electronichamsters 10:79e8f92ef156 412 dest[1] = mac_addr[2];
electronichamsters 10:79e8f92ef156 413 dest[2] = mac_addr[1];
electronichamsters 10:79e8f92ef156 414 dest[3] = mac_addr[0];
electronichamsters 10:79e8f92ef156 415 dest[4] = bat_volt_str[0];
electronichamsters 10:79e8f92ef156 416 dest[5] = bat_volt_str[1];
electronichamsters 10:79e8f92ef156 417 dest[6] = bat_volt_str[2];
electronichamsters 10:79e8f92ef156 418 dest[7] = bat_volt_str[3];
electronichamsters 10:79e8f92ef156 419 dest[8] = 0x10;
electronichamsters 10:79e8f92ef156 420 dest[9] = 0x11;
electronichamsters 12:45c2bb8231bf 421 #if MyDebugEnb
electronichamsters 12:45c2bb8231bf 422
electronichamsters 12:45c2bb8231bf 423 device.printf("hash array: ");
electronichamsters 12:45c2bb8231bf 424 for (int i=0; i<10; i++)
electronichamsters 12:45c2bb8231bf 425 {
electronichamsters 12:45c2bb8231bf 426 device.printf("%x ", dest[i]);
electronichamsters 12:45c2bb8231bf 427 }
electronichamsters 12:45c2bb8231bf 428 device.printf("\r\n");
electronichamsters 12:45c2bb8231bf 429 #endif
electronichamsters 10:79e8f92ef156 430 }
electronichamsters 10:79e8f92ef156 431
electronichamsters 10:79e8f92ef156 432
electronichamsters 12:45c2bb8231bf 433 /* ****************************************
electronichamsters 12:45c2bb8231bf 434 *
electronichamsters 12:45c2bb8231bf 435 * Main Loop
electronichamsters 12:45c2bb8231bf 436 *
electronichamsters 12:45c2bb8231bf 437 *******************************************/
sunsmile2015 2:b935358da5ba 438 int main(void)
sunsmile2015 2:b935358da5ba 439 {
electronichamsters 8:46c5e0bfab05 440
electronichamsters 12:45c2bb8231bf 441 #if MyDebugEnb
electronichamsters 12:45c2bb8231bf 442 device.baud(9600);
electronichamsters 12:45c2bb8231bf 443 device.printf("started sensor node 36 ");
electronichamsters 12:45c2bb8231bf 444 device.printf("\r\n");
electronichamsters 12:45c2bb8231bf 445 #endif
electronichamsters 8:46c5e0bfab05 446
electronichamsters 8:46c5e0bfab05 447
electronichamsters 12:45c2bb8231bf 448 Tmr_From_Birthday.start(); //tracks # sec since birthday
electronichamsters 8:46c5e0bfab05 449
sunsmile2015 0:3dc6e424dba0 450
andresag 7:0a8bbb6dea16 451 BLE &ble = BLE::Instance();
andresag 7:0a8bbb6dea16 452 ble.init(bleInitComplete);
electronichamsters 8:46c5e0bfab05 453
electronichamsters 8:46c5e0bfab05 454 float bat_reading; //hold battery voltage reading (Vbg/Vcc)
electronichamsters 8:46c5e0bfab05 455
electronichamsters 8:46c5e0bfab05 456 my_analogin_init();//routes band-gap to analog input
andresag 7:0a8bbb6dea16 457
andresag 7:0a8bbb6dea16 458 /* SpinWait for initialization to complete. This is necessary because the
andresag 7:0a8bbb6dea16 459 * BLE object is used in the main loop below. */
electronichamsters 8:46c5e0bfab05 460 while (ble.hasInitialized() == false) { /* spin loop */ }
electronichamsters 8:46c5e0bfab05 461
electronichamsters 8:46c5e0bfab05 462 //every X seconds, sends period update, up to 1800 (30 minutes)
electronichamsters 12:45c2bb8231bf 463 Tic_Periodic.attach(periodic_Callback, Periodic_Update_Seconds); //send updated I/O every x seconds
electronichamsters 12:45c2bb8231bf 464 Tic_Birthday.attach(clock_reset_Callback, Periodicity); //clock algorithm periodicity
rgrover1 5:f4d74a8cad43 465
electronichamsters 10:79e8f92ef156 466
electronichamsters 12:45c2bb8231bf 467 //ble.getAddress(0,mac_reverse); //last byte of MAC (as shown on phone app) is at mac[0], not mac[6];
electronichamsters 12:45c2bb8231bf 468 ble.gap().getAddress(0,mac_reverse); //last byte of MAC (as shown on phone app) is at mac[0], not mac[6];
electronichamsters 12:45c2bb8231bf 469 #if MyDebugEnb
electronichamsters 12:45c2bb8231bf 470 device.printf("mac = ");
electronichamsters 12:45c2bb8231bf 471 for (int i=0; i<6; i++) //prints out MAC address in reverse order; opps.
electronichamsters 8:46c5e0bfab05 472 {
electronichamsters 12:45c2bb8231bf 473 device.printf("%x:", mac_reverse[i]);
electronichamsters 8:46c5e0bfab05 474 }
electronichamsters 12:45c2bb8231bf 475 device.printf("\r\n");
electronichamsters 12:45c2bb8231bf 476 #endif
electronichamsters 12:45c2bb8231bf 477 while (true)
electronichamsters 12:45c2bb8231bf 478 { //Main Loop
electronichamsters 12:45c2bb8231bf 479
electronichamsters 12:45c2bb8231bf 480 uint16_t seconds_Old =(uint16_t)(Tmr_From_Birthday.read_ms()/1000); // 0-1800 seconds (30 minutes)
electronichamsters 12:45c2bb8231bf 481
electronichamsters 12:45c2bb8231bf 482 #if MyDebugEnb
electronichamsters 12:45c2bb8231bf 483 device.printf("current time in seconds: %d \r\n", seconds_Old);
electronichamsters 12:45c2bb8231bf 484 #endif
electronichamsters 12:45c2bb8231bf 485
electronichamsters 8:46c5e0bfab05 486
electronichamsters 12:45c2bb8231bf 487 //Update variables holding sensor readings, in preparation for advertisement.
electronichamsters 12:45c2bb8231bf 488 if (Flag_Update_IO) {
andresag 7:0a8bbb6dea16 489 /* Do blocking calls or whatever hardware-specific action is
andresag 7:0a8bbb6dea16 490 * necessary to poll the sensor. */
electronichamsters 8:46c5e0bfab05 491
electronichamsters 12:45c2bb8231bf 492 //call attach again on periodic update to reset ticker
electronichamsters 12:45c2bb8231bf 493 //next periodic updates happens Perioidc_Update_Seconds after I/O events
electronichamsters 12:45c2bb8231bf 494 Tic_Periodic.attach(periodic_Callback, Periodic_Update_Seconds);
electronichamsters 12:45c2bb8231bf 495 //Xmit_Cnt++; //increment transmit counter when updating I/O
electronichamsters 12:45c2bb8231bf 496
electronichamsters 10:79e8f92ef156 497
electronichamsters 10:79e8f92ef156 498
electronichamsters 12:45c2bb8231bf 499 //read and convert battery voltage
electronichamsters 12:45c2bb8231bf 500 bat_reading = (float)read_bat_volt();
electronichamsters 8:46c5e0bfab05 501 bat_reading = (bat_reading * 3.6) / 1024.0;
electronichamsters 12:45c2bb8231bf 502 #if MyDebugEnb
electronichamsters 8:46c5e0bfab05 503 device.printf("bat reading: %f \r\n", bat_reading);
electronichamsters 12:45c2bb8231bf 504 #endif
electronichamsters 12:45c2bb8231bf 505 //write battery voltage
electronichamsters 12:45c2bb8231bf 506 uint8_t total_chars;
electronichamsters 12:45c2bb8231bf 507 memset(&bat_volt_char[0], 0, sizeof(bat_volt_char)); //clear out buffer
electronichamsters 12:45c2bb8231bf 508 //convert battery voltage float value to string reprsentation to 2 decimal places, and save the size of string.
electronichamsters 12:45c2bb8231bf 509 total_chars = sprintf (bat_volt_char, "%.2f", bat_reading);
electronichamsters 8:46c5e0bfab05 510
electronichamsters 13:64601d952fe4 511 sensorPwr = 1; //turn on power to light sensor
electronichamsters 12:45c2bb8231bf 512 //read and convert analog voltage. Comment out this section if note needed, saves some battery
electronichamsters 10:79e8f92ef156 513 NRF_ADC->TASKS_STOP = 1;
electronichamsters 10:79e8f92ef156 514 float analogreading;
electronichamsters 12:45c2bb8231bf 515 analogreading = (float)read_ADC_pin();
electronichamsters 10:79e8f92ef156 516 analogreading = (analogreading * 3.6) / 1024.0;
electronichamsters 12:45c2bb8231bf 517 memset(&json_char_03[0], 0, sizeof(json_char_03)); //clear out buffer
electronichamsters 12:45c2bb8231bf 518 json_len_03 = sprintf (json_char_03, "%.2f", analogreading);
electronichamsters 12:45c2bb8231bf 519
electronichamsters 10:79e8f92ef156 520 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 521 device.printf("separate analog reading: %.02f \r\n", analogreading);
electronichamsters 10:79e8f92ef156 522 #endif
electronichamsters 10:79e8f92ef156 523
electronichamsters 12:45c2bb8231bf 524 //disable ADC to save power
electronichamsters 8:46c5e0bfab05 525 NRF_ADC->TASKS_STOP = 1;
electronichamsters 8:46c5e0bfab05 526 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled; //disable to shutdown ADC & lower bat consumption
electronichamsters 8:46c5e0bfab05 527
electronichamsters 13:64601d952fe4 528 sensorPwr = 0; //turn off power to light sensor
electronichamsters 8:46c5e0bfab05 529
electronichamsters 12:45c2bb8231bf 530 //read temperature of Si7021
electronichamsters 12:45c2bb8231bf 531 tempI2C.measure();
electronichamsters 12:45c2bb8231bf 532 float temptemp = (tempI2C.get_temperature()/1000.00);
electronichamsters 12:45c2bb8231bf 533 float temphum = (tempI2C.get_humidity()/1000.00);
electronichamsters 12:45c2bb8231bf 534 temptemp = temptemp*((float)9.0/5.0) + 32;
electronichamsters 8:46c5e0bfab05 535
electronichamsters 12:45c2bb8231bf 536 memset(&json_char_01[0], 0, sizeof(json_char_01)); //clear out buffer
electronichamsters 12:45c2bb8231bf 537 memset(&json_char_02[0], 0, sizeof(json_char_02)); //clear out buffer
electronichamsters 12:45c2bb8231bf 538 json_len_01 = sprintf (json_char_01, "%.2f", temptemp);
electronichamsters 12:45c2bb8231bf 539 json_len_02 = sprintf (json_char_02, "%.1f", temphum);
electronichamsters 8:46c5e0bfab05 540
electronichamsters 12:45c2bb8231bf 541 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 542 device.printf("char buff: %c%c%c%c \r\n", bat_volt_char[0], bat_volt_char[1], bat_volt_char[2], bat_volt_char[3]);
electronichamsters 8:46c5e0bfab05 543 device.printf("num chars: %d \r\n", total_chars);
electronichamsters 12:45c2bb8231bf 544 #endif
electronichamsters 12:45c2bb8231bf 545
electronichamsters 12:45c2bb8231bf 546 Flag_Update_IO = false; //all needed variables for advertisement of sensor data has been updated in memory
electronichamsters 12:45c2bb8231bf 547 }//end Flag_Update_IO
electronichamsters 8:46c5e0bfab05 548
electronichamsters 12:45c2bb8231bf 549
electronichamsters 12:45c2bb8231bf 550 //compose the correct JSON portion of advertisement sensor data
electronichamsters 12:45c2bb8231bf 551 if (Flag_Update_ADV_01 > 0)
electronichamsters 12:45c2bb8231bf 552 {
electronichamsters 12:45c2bb8231bf 553 //Generate "First Section" for ADV_Data so gateway will recognize our advertisement pattern
electronichamsters 12:45c2bb8231bf 554 hash_first_section(Adv_First_Section, mac_reverse, bat_volt_char);
electronichamsters 10:79e8f92ef156 555
electronichamsters 10:79e8f92ef156 556
electronichamsters 12:45c2bb8231bf 557 /* ****************************************
electronichamsters 12:45c2bb8231bf 558 * start writing out ADVData array
electronichamsters 12:45c2bb8231bf 559 * todo: this is easy to write but hard to read. Maybe make it easy to read and hard to write?
electronichamsters 12:45c2bb8231bf 560 ******************************************/
electronichamsters 12:45c2bb8231bf 561 memset(&AdvData[0], 0, sizeof(AdvData)); //put nulls into adv data
electronichamsters 10:79e8f92ef156 562 uint8_t JSON_loc=0; //AdvData[0]
electronichamsters 10:79e8f92ef156 563
electronichamsters 12:45c2bb8231bf 564 AdvData[0] = Adv_First_Section[0]; //"our device" flag, MAC[3]
electronichamsters 12:45c2bb8231bf 565 JSON_loc++; //JSON_loc == 1
electronichamsters 12:45c2bb8231bf 566 AdvData[1] = Adv_First_Section[1]; //"out device" flag, MAC[2]...
electronichamsters 12:45c2bb8231bf 567 JSON_loc++; //JSON_loc == 2
electronichamsters 12:45c2bb8231bf 568 AdvData[2] = Adv_First_Section[2];
electronichamsters 12:45c2bb8231bf 569 JSON_loc++; //JSON_loc == 3
electronichamsters 12:45c2bb8231bf 570 AdvData[3] = Adv_First_Section[3];
electronichamsters 12:45c2bb8231bf 571 JSON_loc++; //JSON_loc == 4
electronichamsters 12:45c2bb8231bf 572 AdvData[4] = Adv_First_Section[4];
electronichamsters 12:45c2bb8231bf 573 JSON_loc++; //JSON_loc == 5
electronichamsters 12:45c2bb8231bf 574 AdvData[5] = Adv_First_Section[5];
electronichamsters 12:45c2bb8231bf 575 JSON_loc++; //JSON_loc == 6
electronichamsters 12:45c2bb8231bf 576 AdvData[6] = Adv_First_Section[6];
electronichamsters 10:79e8f92ef156 577 JSON_loc++;
electronichamsters 12:45c2bb8231bf 578 AdvData[7] = Adv_First_Section[7];
electronichamsters 10:79e8f92ef156 579 JSON_loc++;
electronichamsters 12:45c2bb8231bf 580 AdvData[8] = Adv_First_Section[8];
electronichamsters 10:79e8f92ef156 581 JSON_loc++;
electronichamsters 12:45c2bb8231bf 582 AdvData[9] = Adv_First_Section[9];
electronichamsters 8:46c5e0bfab05 583 JSON_loc++;
electronichamsters 10:79e8f92ef156 584
electronichamsters 12:45c2bb8231bf 585 #if MyDebugEnb
electronichamsters 12:45c2bb8231bf 586 device.printf("ADV first 10 array: ");
electronichamsters 12:45c2bb8231bf 587 for (int i=0; i<10; i++)
electronichamsters 12:45c2bb8231bf 588 {
electronichamsters 12:45c2bb8231bf 589 device.printf("%x ", AdvData[i]);
electronichamsters 12:45c2bb8231bf 590 }
electronichamsters 12:45c2bb8231bf 591 device.printf("\r\n");
electronichamsters 12:45c2bb8231bf 592 #endif
electronichamsters 10:79e8f92ef156 593
electronichamsters 10:79e8f92ef156 594
electronichamsters 10:79e8f92ef156 595 JSON_loc = 10;
electronichamsters 12:45c2bb8231bf 596 //Start of encrypted user data
electronichamsters 12:45c2bb8231bf 597
electronichamsters 12:45c2bb8231bf 598 //[10] and [11] hold 2 bytes for how many seconds since birthday, little endian
electronichamsters 12:45c2bb8231bf 599 AdvData[10] = seconds_Old & 0xFF;
electronichamsters 8:46c5e0bfab05 600 JSON_loc++;
electronichamsters 12:45c2bb8231bf 601 AdvData[11] = (seconds_Old >> 8) & 0xFF;
electronichamsters 10:79e8f92ef156 602 JSON_loc++;
electronichamsters 12:45c2bb8231bf 603
electronichamsters 10:79e8f92ef156 604 AdvData[12] = Xmit_Cnt;
electronichamsters 8:46c5e0bfab05 605 JSON_loc++;
electronichamsters 8:46c5e0bfab05 606
electronichamsters 8:46c5e0bfab05 607
electronichamsters 8:46c5e0bfab05 608
electronichamsters 8:46c5e0bfab05 609
electronichamsters 12:45c2bb8231bf 610 //------ START JASON Flag_Update_ADV_01
electronichamsters 12:45c2bb8231bf 611 //start of jason data
electronichamsters 12:45c2bb8231bf 612 if (Flag_Update_ADV_01 == 1) //temperature
electronichamsters 12:45c2bb8231bf 613 {
electronichamsters 12:45c2bb8231bf 614 JSON_loc = 13;
electronichamsters 12:45c2bb8231bf 615 AdvData[JSON_loc] = 0x22; //ADV_Data[13] = "
electronichamsters 12:45c2bb8231bf 616 JSON_loc++; //14
electronichamsters 12:45c2bb8231bf 617
electronichamsters 12:45c2bb8231bf 618 AdvData[JSON_loc] = 0x54; //ADV_Data[14] = t
electronichamsters 12:45c2bb8231bf 619 JSON_loc++; //15
electronichamsters 12:45c2bb8231bf 620
electronichamsters 12:45c2bb8231bf 621 AdvData[JSON_loc] = 0x4D; //ADV_Data[15] = m
electronichamsters 12:45c2bb8231bf 622 JSON_loc++; //16
electronichamsters 12:45c2bb8231bf 623
electronichamsters 12:45c2bb8231bf 624 AdvData[JSON_loc] = 0x50; //ADV_Data[16] = p
electronichamsters 12:45c2bb8231bf 625 JSON_loc++; //17
electronichamsters 12:45c2bb8231bf 626
electronichamsters 12:45c2bb8231bf 627 //for periodic calls, we want to add an extra mqtt level "p", using "/p"
electronichamsters 12:45c2bb8231bf 628 //to delineate between MQTT publishes from real world I/O interrupts vs timer interrupts
electronichamsters 12:45c2bb8231bf 629 if (Flag_Periodic_Call)
electronichamsters 12:45c2bb8231bf 630 {
electronichamsters 12:45c2bb8231bf 631 AdvData[JSON_loc] = 0x2f; // ADV_Data[17] = /
electronichamsters 12:45c2bb8231bf 632 JSON_loc++; //18
electronichamsters 12:45c2bb8231bf 633 AdvData[JSON_loc] = 0x70; // ADV_Data[18] =p
electronichamsters 12:45c2bb8231bf 634 JSON_loc++; //19
electronichamsters 12:45c2bb8231bf 635 }
electronichamsters 12:45c2bb8231bf 636
electronichamsters 12:45c2bb8231bf 637 AdvData[JSON_loc] = 0x22; //ADV_Data[17 or 19] = "
electronichamsters 12:45c2bb8231bf 638 JSON_loc++; //20
electronichamsters 12:45c2bb8231bf 639 AdvData[JSON_loc] = 0x3a; //ADV_Data[18 or 20] = :
electronichamsters 12:45c2bb8231bf 640 JSON_loc++; //21
electronichamsters 12:45c2bb8231bf 641
electronichamsters 12:45c2bb8231bf 642 //convert magnet variable to string, for magnet sensor, this is easy
electronichamsters 12:45c2bb8231bf 643 //since we only have 1 or 0, but this also works for analog values
electronichamsters 12:45c2bb8231bf 644 /*
electronichamsters 12:45c2bb8231bf 645 memset(&buffer[0], 0, sizeof(buffer)); //clear out buffer
electronichamsters 12:45c2bb8231bf 646 total_chars = sprintf (buffer, "%d", magnet_near); //returns total number of characters, which is 1 character.
electronichamsters 12:45c2bb8231bf 647 for (int i=0; i < total_chars; i++)
electronichamsters 12:45c2bb8231bf 648 {
electronichamsters 12:45c2bb8231bf 649 AdvData[JSON_loc] = buffer[i];
electronichamsters 12:45c2bb8231bf 650 JSON_loc++; //23
electronichamsters 12:45c2bb8231bf 651 } //JSON_loc left at location of next character
electronichamsters 12:45c2bb8231bf 652 */
electronichamsters 12:45c2bb8231bf 653
electronichamsters 12:45c2bb8231bf 654 //convert sensor data to string
electronichamsters 12:45c2bb8231bf 655 for (int i=0; i < json_len_01; i++)
electronichamsters 12:45c2bb8231bf 656 {
electronichamsters 12:45c2bb8231bf 657 AdvData[JSON_loc] = json_char_01[i];
electronichamsters 12:45c2bb8231bf 658 JSON_loc++;
electronichamsters 12:45c2bb8231bf 659 } //JSON_loc left at location of next character
electronichamsters 12:45c2bb8231bf 660
electronichamsters 12:45c2bb8231bf 661 //AdvData[JSON_loc] = 0x0; //since AdvData was cleared to start with, we don't need to null term
electronichamsters 12:45c2bb8231bf 662 }//end Flag_Update_ADV_01==1
electronichamsters 12:45c2bb8231bf 663 if (Flag_Update_ADV_01 == 2) //humidity
electronichamsters 12:45c2bb8231bf 664 {
electronichamsters 12:45c2bb8231bf 665 JSON_loc = 13;
electronichamsters 12:45c2bb8231bf 666 AdvData[JSON_loc] = 0x22; //ADV_Data[13] = "
electronichamsters 12:45c2bb8231bf 667 JSON_loc++; //14
electronichamsters 12:45c2bb8231bf 668
electronichamsters 12:45c2bb8231bf 669 AdvData[JSON_loc] = 0x48; //ADV_Data[14] = H = 0x48
electronichamsters 12:45c2bb8231bf 670 JSON_loc++; //15
electronichamsters 12:45c2bb8231bf 671
electronichamsters 12:45c2bb8231bf 672 AdvData[JSON_loc] = 0x55; //ADV_Data[15] = U = 0x55
electronichamsters 12:45c2bb8231bf 673 JSON_loc++; //16
electronichamsters 12:45c2bb8231bf 674
electronichamsters 12:45c2bb8231bf 675 AdvData[JSON_loc] = 0x4d; //ADV_Data[16] = M = 0x4d
electronichamsters 12:45c2bb8231bf 676 JSON_loc++; //17
electronichamsters 12:45c2bb8231bf 677
electronichamsters 12:45c2bb8231bf 678 //for periodic calls, we want to add an extra mqtt level "p", using "/p"
electronichamsters 12:45c2bb8231bf 679 //to delineate between MQTT publishes from real world I/O interrupts vs timer interrupts
electronichamsters 12:45c2bb8231bf 680 if (Flag_Periodic_Call)
electronichamsters 12:45c2bb8231bf 681 {
electronichamsters 12:45c2bb8231bf 682 AdvData[JSON_loc] = 0x2f; // ADV_Data[17] = /
electronichamsters 12:45c2bb8231bf 683 JSON_loc++; //18
electronichamsters 12:45c2bb8231bf 684 AdvData[JSON_loc] = 0x70; // ADV_Data[18] =p
electronichamsters 12:45c2bb8231bf 685 JSON_loc++; //19
electronichamsters 12:45c2bb8231bf 686 }
electronichamsters 12:45c2bb8231bf 687
electronichamsters 12:45c2bb8231bf 688 AdvData[JSON_loc] = 0x22; //ADV_Data[17 or 19] = "
electronichamsters 12:45c2bb8231bf 689 JSON_loc++; //20
electronichamsters 12:45c2bb8231bf 690 AdvData[JSON_loc] = 0x3a; //ADV_Data[18 or 20] = :
electronichamsters 12:45c2bb8231bf 691 JSON_loc++; //21
electronichamsters 12:45c2bb8231bf 692
electronichamsters 8:46c5e0bfab05 693
electronichamsters 12:45c2bb8231bf 694 //convert sensor data to string
electronichamsters 12:45c2bb8231bf 695 //memset(&buffer[0], 0, sizeof(buffer)); //clear out buffer
electronichamsters 12:45c2bb8231bf 696 for (int i=0; i < json_len_02; i++)
electronichamsters 12:45c2bb8231bf 697 {
electronichamsters 12:45c2bb8231bf 698 AdvData[JSON_loc] = json_char_02[i];
electronichamsters 12:45c2bb8231bf 699 JSON_loc++;
electronichamsters 12:45c2bb8231bf 700 } //JSON_loc left at location of next character
electronichamsters 12:45c2bb8231bf 701
electronichamsters 12:45c2bb8231bf 702 //AdvData[JSON_loc] = 0x0; //since AdvData was cleared to start with, we don't need to null term
electronichamsters 12:45c2bb8231bf 703
electronichamsters 12:45c2bb8231bf 704 } //end if (Flag_Update_ADV_01 == 2)
electronichamsters 12:45c2bb8231bf 705 if (Flag_Update_ADV_01 == 3) //light sensor
electronichamsters 12:45c2bb8231bf 706 {
electronichamsters 12:45c2bb8231bf 707 JSON_loc = 13;
electronichamsters 12:45c2bb8231bf 708 AdvData[JSON_loc] = 0x22; //ADV_Data[13] = "
electronichamsters 12:45c2bb8231bf 709 JSON_loc++; //14
electronichamsters 12:45c2bb8231bf 710
electronichamsters 12:45c2bb8231bf 711 AdvData[JSON_loc] = 0x4C; //ADV_Data[14] = L = 0x4C, as in lumin
electronichamsters 12:45c2bb8231bf 712 JSON_loc++; //15
electronichamsters 12:45c2bb8231bf 713
electronichamsters 12:45c2bb8231bf 714 AdvData[JSON_loc] = 0x55; //ADV_Data[15] = U = 0x55
electronichamsters 12:45c2bb8231bf 715 JSON_loc++; //16
electronichamsters 12:45c2bb8231bf 716
electronichamsters 12:45c2bb8231bf 717 AdvData[JSON_loc] = 0x4d; //ADV_Data[16] = M = 0x4d
electronichamsters 12:45c2bb8231bf 718 JSON_loc++; //17
electronichamsters 12:45c2bb8231bf 719
electronichamsters 12:45c2bb8231bf 720 //for periodic calls, we want to add an extra mqtt level "p", using "/p"
electronichamsters 12:45c2bb8231bf 721 //to delineate between MQTT publishes from real world I/O interrupts vs timer interrupts
electronichamsters 12:45c2bb8231bf 722 if (Flag_Periodic_Call)
electronichamsters 12:45c2bb8231bf 723 {
electronichamsters 12:45c2bb8231bf 724 AdvData[JSON_loc] = 0x2f; // ADV_Data[17] = /
electronichamsters 12:45c2bb8231bf 725 JSON_loc++; //18
electronichamsters 12:45c2bb8231bf 726 AdvData[JSON_loc] = 0x70; // ADV_Data[18] =p
electronichamsters 12:45c2bb8231bf 727 JSON_loc++; //19
electronichamsters 12:45c2bb8231bf 728 }
electronichamsters 12:45c2bb8231bf 729
electronichamsters 12:45c2bb8231bf 730 AdvData[JSON_loc] = 0x22; //ADV_Data[17 or 19] = "
electronichamsters 12:45c2bb8231bf 731 JSON_loc++; //20
electronichamsters 12:45c2bb8231bf 732 AdvData[JSON_loc] = 0x3a; //ADV_Data[18 or 20] = :
electronichamsters 12:45c2bb8231bf 733 JSON_loc++; //21
electronichamsters 12:45c2bb8231bf 734
electronichamsters 12:45c2bb8231bf 735
electronichamsters 12:45c2bb8231bf 736 //convert sensor data to string
electronichamsters 12:45c2bb8231bf 737 //memset(&buffer[0], 0, sizeof(buffer)); //clear out buffer
electronichamsters 12:45c2bb8231bf 738 for (int i=0; i < json_len_03; i++)
electronichamsters 12:45c2bb8231bf 739 {
electronichamsters 12:45c2bb8231bf 740 AdvData[JSON_loc] = json_char_03[i];
electronichamsters 12:45c2bb8231bf 741 JSON_loc++;
electronichamsters 12:45c2bb8231bf 742 } //JSON_loc left at location of next character
electronichamsters 12:45c2bb8231bf 743
electronichamsters 12:45c2bb8231bf 744 //AdvData[JSON_loc] = 0x0; //since AdvData was cleared to start with, we don't need to null term
electronichamsters 12:45c2bb8231bf 745
electronichamsters 12:45c2bb8231bf 746 } //end if (Flag_Update_ADV_01 == 3)
electronichamsters 12:45c2bb8231bf 747
electronichamsters 12:45c2bb8231bf 748
rgrover1 5:f4d74a8cad43 749 ApplicationData_t appData;
rgrover1 5:f4d74a8cad43 750 setupApplicationData(appData);
electronichamsters 8:46c5e0bfab05 751
electronichamsters 12:45c2bb8231bf 752 /*********************
electronichamsters 12:45c2bb8231bf 753 * start encrypting last 16 bytes of ADV_Data
electronichamsters 12:45c2bb8231bf 754 *********************/
electronichamsters 8:46c5e0bfab05 755 for (int i=0; i<16; i++)
electronichamsters 8:46c5e0bfab05 756 {
electronichamsters 10:79e8f92ef156 757 src_buf[i] = AdvData[i+10]; //start of encrypted section is at AdvData[10]
electronichamsters 8:46c5e0bfab05 758 }
electronichamsters 8:46c5e0bfab05 759 nrf_ecb_init();
electronichamsters 8:46c5e0bfab05 760 nrf_ecb_set_key(key_buf);
electronichamsters 8:46c5e0bfab05 761 bool successful_ecb = nrf_ecb_crypt(des_buf, src_buf);
electronichamsters 12:45c2bb8231bf 762 #if MyDebugEnb
electronichamsters 12:45c2bb8231bf 763 device.printf("success ecb = %d \r\n", successful_ecb);
electronichamsters 12:45c2bb8231bf 764 device.printf("src_buf: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \r\n", src_buf[0], src_buf[1], src_buf[2], src_buf[3], src_buf[4], src_buf[5], src_buf[6], src_buf[7], src_buf[8], src_buf[9], src_buf[10], src_buf[11], src_buf[12], src_buf[13], src_buf[14], src_buf[15]);
electronichamsters 12:45c2bb8231bf 765 device.printf("des_buf: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \r\n", des_buf[0], des_buf[1], des_buf[2], des_buf[3], des_buf[4], des_buf[5], des_buf[6], des_buf[7], des_buf[8], des_buf[9], des_buf[10], des_buf[11], des_buf[12], des_buf[13], des_buf[14], des_buf[15]);
electronichamsters 12:45c2bb8231bf 766 #endif
electronichamsters 12:45c2bb8231bf 767 for (int i=0; i<16; i++) //replace last 16 bytes with encrypted 16 bytes
electronichamsters 8:46c5e0bfab05 768 {
electronichamsters 10:79e8f92ef156 769 AdvData[i+10] = des_buf[i];
electronichamsters 8:46c5e0bfab05 770 }
electronichamsters 8:46c5e0bfab05 771
electronichamsters 12:45c2bb8231bf 772 //set payload for advertisement to our custom manufactured data. First 5 bytes is BLE standard, last 26 bytes is our array
electronichamsters 8:46c5e0bfab05 773 //ble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *) &appData, sizeof(ApplicationData_t));
electronichamsters 8:46c5e0bfab05 774 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, AdvData, sizeof(AdvData));
electronichamsters 8:46c5e0bfab05 775
electronichamsters 12:45c2bb8231bf 776
electronichamsters 12:45c2bb8231bf 777 ble.gap().startAdvertising();
electronichamsters 8:46c5e0bfab05 778
electronichamsters 12:45c2bb8231bf 779 //Advertise THIS data for X seconds, then advertisement the next sensor, etc...
electronichamsters 12:45c2bb8231bf 780 Tic_Stop_Adv.attach(stop_adv_Callback, Seconds_Per_Advertisement);
electronichamsters 12:45c2bb8231bf 781
electronichamsters 12:45c2bb8231bf 782 }//end Flag_Update_ADV_##
electronichamsters 8:46c5e0bfab05 783
electronichamsters 8:46c5e0bfab05 784
electronichamsters 12:45c2bb8231bf 785 if (Flag_Detach_Adv_Tic == true) //ticker callback flag to stop advertising
electronichamsters 8:46c5e0bfab05 786 {
electronichamsters 8:46c5e0bfab05 787 ble.gap().stopAdvertising(); //may be safer to execute BLE operations in main
electronichamsters 12:45c2bb8231bf 788 Tic_Stop_Adv.detach();
electronichamsters 12:45c2bb8231bf 789 Flag_Detach_Adv_Tic = false;
electronichamsters 8:46c5e0bfab05 790 }
electronichamsters 8:46c5e0bfab05 791
electronichamsters 12:45c2bb8231bf 792 ble.waitForEvent(); //sleeps until interrupt form ticker or I/O
electronichamsters 8:46c5e0bfab05 793 }//end forever while
electronichamsters 8:46c5e0bfab05 794 }//end main