BLE Lightning sensor for Nordic NRF51822 based module
Dependencies: AS3935 AS3935_ext BLE_API mbed nRF51822 nrf51_rtc
main.cpp@7:7cf0707ae983, 2015-09-05 (annotated)
- Committer:
- takafuminaka
- Date:
- Sat Sep 05 13:00:13 2015 +0000
- Revision:
- 7:7cf0707ae983
- Parent:
- 6:273ddd00bd90
- Child:
- 8:e7a6fd7ab067
2015/09/05
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
takafuminaka | 0:371bcac81ea2 | 1 | /* |
takafuminaka | 0:371bcac81ea2 | 2 | |
takafuminaka | 0:371bcac81ea2 | 3 | */ |
takafuminaka | 0:371bcac81ea2 | 4 | |
takafuminaka | 4:8f815f8d804e | 5 | #include "string.h" |
takafuminaka | 4:8f815f8d804e | 6 | |
takafuminaka | 0:371bcac81ea2 | 7 | #include "mbed.h" |
takafuminaka | 0:371bcac81ea2 | 8 | #include "nrf51_rtc.h" |
takafuminaka | 0:371bcac81ea2 | 9 | #include "AS3935_ext.h" |
takafuminaka | 5:b8961da0d06a | 10 | #include <string> |
takafuminaka | 0:371bcac81ea2 | 11 | |
takafuminaka | 3:2ea547dab8a8 | 12 | #define NEED_CONSOLE_OUTPUT 1 // Set this if you need debug messages on the console; |
takafuminaka | 3:2ea547dab8a8 | 13 | #define NEED_BLE_CONSOLE 1 |
takafuminaka | 1:a4119049dd99 | 14 | |
takafuminaka | 1:a4119049dd99 | 15 | #if NEED_CONSOLE_OUTPUT |
takafuminaka | 1:a4119049dd99 | 16 | Serial pc(USBTX, USBRX); |
takafuminaka | 1:a4119049dd99 | 17 | #define DEBUG(...) { pc.printf(__VA_ARGS__); } |
takafuminaka | 1:a4119049dd99 | 18 | #else |
takafuminaka | 1:a4119049dd99 | 19 | #define DEBUG(...) /* nothing */ |
takafuminaka | 1:a4119049dd99 | 20 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
takafuminaka | 1:a4119049dd99 | 21 | |
takafuminaka | 3:2ea547dab8a8 | 22 | #if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 23 | #include "BLE.h" |
takafuminaka | 3:2ea547dab8a8 | 24 | #include "UARTService.h" |
takafuminaka | 3:2ea547dab8a8 | 25 | #define BLEC(...) { char __blecstr[32]; sprintf(__blecstr,__VA_ARGS__); if (uart) uart->write(__blecstr, strlen(__blecstr)); } |
takafuminaka | 3:2ea547dab8a8 | 26 | #else |
takafuminaka | 3:2ea547dab8a8 | 27 | #define BLEC(...) /* nothing */ |
takafuminaka | 3:2ea547dab8a8 | 28 | #endif /* #if NEED_BLE_CONSOLE */ |
takafuminaka | 1:a4119049dd99 | 29 | |
takafuminaka | 3:2ea547dab8a8 | 30 | #if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 31 | // Prepare BLE device |
takafuminaka | 3:2ea547dab8a8 | 32 | const uint8_t DEVICE_NAME[] = "BLE Ligttning Sensor"; |
takafuminaka | 3:2ea547dab8a8 | 33 | #endif // #if NEED_BLE_CONSOLE |
takafuminaka | 1:a4119049dd99 | 34 | |
takafuminaka | 1:a4119049dd99 | 35 | |
takafuminaka | 1:a4119049dd99 | 36 | // Prepare LED device |
takafuminaka | 1:a4119049dd99 | 37 | DigitalOut led1(LED1); |
takafuminaka | 1:a4119049dd99 | 38 | DigitalOut led2(LED2); |
takafuminaka | 1:a4119049dd99 | 39 | |
takafuminaka | 0:371bcac81ea2 | 40 | AS3935_ext Lightning(I2C_SDA0,I2C_SCL0,0x00,P0_23); |
takafuminaka | 0:371bcac81ea2 | 41 | InterruptIn IntLightning(P0_23); //IRQ AS3935 |
takafuminaka | 0:371bcac81ea2 | 42 | |
takafuminaka | 0:371bcac81ea2 | 43 | // used for the example only, not required for rtc use |
takafuminaka | 0:371bcac81ea2 | 44 | DigitalIn button1(BUTTON1); // used to trigger the time report |
takafuminaka | 0:371bcac81ea2 | 45 | InterruptIn button1Press(BUTTON1); |
takafuminaka | 0:371bcac81ea2 | 46 | |
takafuminaka | 3:2ea547dab8a8 | 47 | // event record buffer struct |
takafuminaka | 3:2ea547dab8a8 | 48 | const int s_evrecord=10; |
takafuminaka | 3:2ea547dab8a8 | 49 | struct t_evrecord { |
takafuminaka | 3:2ea547dab8a8 | 50 | public: |
takafuminaka | 3:2ea547dab8a8 | 51 | int event; |
takafuminaka | 3:2ea547dab8a8 | 52 | time_t time; |
takafuminaka | 3:2ea547dab8a8 | 53 | int distance; |
takafuminaka | 3:2ea547dab8a8 | 54 | |
takafuminaka | 3:2ea547dab8a8 | 55 | t_evrecord() { |
takafuminaka | 3:2ea547dab8a8 | 56 | event = 0; |
takafuminaka | 3:2ea547dab8a8 | 57 | time = 0; |
takafuminaka | 3:2ea547dab8a8 | 58 | distance = 0; |
takafuminaka | 3:2ea547dab8a8 | 59 | } |
takafuminaka | 5:b8961da0d06a | 60 | |
takafuminaka | 5:b8961da0d06a | 61 | char * events() { |
takafuminaka | 5:b8961da0d06a | 62 | if ( event & 0x4 ) { |
takafuminaka | 5:b8961da0d06a | 63 | return "Lightning interval"; |
takafuminaka | 5:b8961da0d06a | 64 | } else if ( event & 0x2 ) { |
takafuminaka | 5:b8961da0d06a | 65 | return "Disturber deteced"; |
takafuminaka | 5:b8961da0d06a | 66 | } else if ( event & 0x1 ) { |
takafuminaka | 5:b8961da0d06a | 67 | return "Noise level too high"; |
takafuminaka | 5:b8961da0d06a | 68 | } else { |
takafuminaka | 7:7cf0707ae983 | 69 | return "Unknown event"; |
takafuminaka | 5:b8961da0d06a | 70 | } |
takafuminaka | 5:b8961da0d06a | 71 | } |
takafuminaka | 3:2ea547dab8a8 | 72 | } evrecord[s_evrecord]; |
takafuminaka | 0:371bcac81ea2 | 73 | |
takafuminaka | 0:371bcac81ea2 | 74 | time_t example_time() { |
takafuminaka | 0:371bcac81ea2 | 75 | // set an intial time |
takafuminaka | 0:371bcac81ea2 | 76 | // ...not really necessary for this example, but it beats setting it to 0 or some non-obvious large integer (# of seconds since 1/1/1970) |
takafuminaka | 0:371bcac81ea2 | 77 | time_t rawtime=0; |
takafuminaka | 0:371bcac81ea2 | 78 | |
takafuminaka | 0:371bcac81ea2 | 79 | struct tm * init_timeinfo; |
takafuminaka | 0:371bcac81ea2 | 80 | |
takafuminaka | 0:371bcac81ea2 | 81 | // initialize time |
takafuminaka | 0:371bcac81ea2 | 82 | init_timeinfo = localtime(&rawtime); // note: must initialize the struct with this before trying to set components |
takafuminaka | 0:371bcac81ea2 | 83 | // ...else code goes into the weeds!! |
takafuminaka | 0:371bcac81ea2 | 84 | init_timeinfo->tm_sec = 0; |
takafuminaka | 0:371bcac81ea2 | 85 | init_timeinfo->tm_min = 0; |
takafuminaka | 0:371bcac81ea2 | 86 | init_timeinfo->tm_hour = 0; |
takafuminaka | 0:371bcac81ea2 | 87 | init_timeinfo->tm_mon = 0; |
takafuminaka | 0:371bcac81ea2 | 88 | init_timeinfo->tm_mday = 1; |
takafuminaka | 2:e1e638cbf972 | 89 | init_timeinfo->tm_year = 70; |
takafuminaka | 0:371bcac81ea2 | 90 | |
takafuminaka | 0:371bcac81ea2 | 91 | char date[24]; |
takafuminaka | 6:273ddd00bd90 | 92 | strftime(date,sizeof(date),"%Y/%m/%d %H:%M:%S ",init_timeinfo); |
takafuminaka | 5:b8961da0d06a | 93 | DEBUG("Initial time set as %s.\r\n",date); |
takafuminaka | 0:371bcac81ea2 | 94 | |
takafuminaka | 0:371bcac81ea2 | 95 | // compute the proper value for time in time_t type |
takafuminaka | 0:371bcac81ea2 | 96 | rawtime = mktime(init_timeinfo); |
takafuminaka | 0:371bcac81ea2 | 97 | return rawtime; |
takafuminaka | 0:371bcac81ea2 | 98 | } |
takafuminaka | 1:a4119049dd99 | 99 | |
takafuminaka | 0:371bcac81ea2 | 100 | void print_time() { |
takafuminaka | 0:371bcac81ea2 | 101 | // called when a button is pushed, this prints the current time to the USB-connected console |
takafuminaka | 0:371bcac81ea2 | 102 | |
takafuminaka | 0:371bcac81ea2 | 103 | time_t rawtime=rtc.time(); |
takafuminaka | 0:371bcac81ea2 | 104 | |
takafuminaka | 0:371bcac81ea2 | 105 | // massage the time into a human-friendly format for printing |
takafuminaka | 0:371bcac81ea2 | 106 | struct tm * timeinfo; |
takafuminaka | 0:371bcac81ea2 | 107 | timeinfo = localtime(&rawtime); |
takafuminaka | 0:371bcac81ea2 | 108 | char date[24]; |
takafuminaka | 6:273ddd00bd90 | 109 | strftime(date,sizeof(date),"%Y/%m/%d %H:%M:%S ",timeinfo); |
takafuminaka | 1:a4119049dd99 | 110 | DEBUG("The current time is %s.(%d)\r\n",date,rawtime); |
takafuminaka | 0:371bcac81ea2 | 111 | } |
takafuminaka | 0:371bcac81ea2 | 112 | |
takafuminaka | 1:a4119049dd99 | 113 | void periodic_update() { |
takafuminaka | 0:371bcac81ea2 | 114 | // for use as interrupt routine, to insure that RTC is updated periodically |
takafuminaka | 0:371bcac81ea2 | 115 | // ...if rtc is not read before the underlying counter rolls over (typically 512 seconds), the RTC value will be wrong |
takafuminaka | 0:371bcac81ea2 | 116 | // ...ideally this would be done as part of the nrf51_rtc method, but I couldn't get it to behave (see nrf51_rtc.cpp for details) |
takafuminaka | 0:371bcac81ea2 | 117 | rtc.time(); |
takafuminaka | 1:a4119049dd99 | 118 | Lightning.lightningDistanceKm(); |
takafuminaka | 1:a4119049dd99 | 119 | led1 = !led1; |
takafuminaka | 1:a4119049dd99 | 120 | |
takafuminaka | 0:371bcac81ea2 | 121 | // print_time(); |
takafuminaka | 0:371bcac81ea2 | 122 | } |
takafuminaka | 0:371bcac81ea2 | 123 | |
takafuminaka | 3:2ea547dab8a8 | 124 | #if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 125 | BLEDevice ble; |
takafuminaka | 3:2ea547dab8a8 | 126 | UARTService *uart; |
takafuminaka | 3:2ea547dab8a8 | 127 | static Gap::ConnectionParams_t connectionParams; |
takafuminaka | 3:2ea547dab8a8 | 128 | int buff_flash_flag; |
takafuminaka | 3:2ea547dab8a8 | 129 | |
takafuminaka | 3:2ea547dab8a8 | 130 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) // Mod |
takafuminaka | 3:2ea547dab8a8 | 131 | { |
takafuminaka | 3:2ea547dab8a8 | 132 | DEBUG("Disconnected handle %u!\n\r", handle); |
takafuminaka | 3:2ea547dab8a8 | 133 | DEBUG("Restarting the advertising process\n\r"); |
takafuminaka | 3:2ea547dab8a8 | 134 | led2 = 0; |
takafuminaka | 3:2ea547dab8a8 | 135 | ble.gap().startAdvertising(); |
takafuminaka | 3:2ea547dab8a8 | 136 | |
takafuminaka | 3:2ea547dab8a8 | 137 | |
takafuminaka | 3:2ea547dab8a8 | 138 | } |
takafuminaka | 3:2ea547dab8a8 | 139 | |
takafuminaka | 3:2ea547dab8a8 | 140 | void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params) |
takafuminaka | 3:2ea547dab8a8 | 141 | { |
takafuminaka | 3:2ea547dab8a8 | 142 | DEBUG("connected. Got handle %u\r\n", params->handle); |
takafuminaka | 3:2ea547dab8a8 | 143 | |
takafuminaka | 3:2ea547dab8a8 | 144 | connectionParams.slaveLatency = 1; |
takafuminaka | 3:2ea547dab8a8 | 145 | led2 = 1; |
takafuminaka | 3:2ea547dab8a8 | 146 | if (ble.gap().updateConnectionParams(params->handle, &connectionParams) != BLE_ERROR_NONE) { |
takafuminaka | 3:2ea547dab8a8 | 147 | DEBUG("failed to update connection paramter\r\n"); |
takafuminaka | 3:2ea547dab8a8 | 148 | } |
takafuminaka | 3:2ea547dab8a8 | 149 | buff_flash_flag = 1; |
takafuminaka | 3:2ea547dab8a8 | 150 | |
takafuminaka | 3:2ea547dab8a8 | 151 | } |
takafuminaka | 3:2ea547dab8a8 | 152 | |
takafuminaka | 3:2ea547dab8a8 | 153 | void onDataWritten(const GattWriteCallbackParams *params) |
takafuminaka | 3:2ea547dab8a8 | 154 | { |
takafuminaka | 5:b8961da0d06a | 155 | char buff[24]; |
takafuminaka | 5:b8961da0d06a | 156 | int v; |
takafuminaka | 5:b8961da0d06a | 157 | int afe_gb, nf_lev, wdth, srej; |
takafuminaka | 5:b8961da0d06a | 158 | |
takafuminaka | 5:b8961da0d06a | 159 | int write_param=0; |
takafuminaka | 5:b8961da0d06a | 160 | |
takafuminaka | 3:2ea547dab8a8 | 161 | if ((uart != NULL) && (params->handle == uart->getTXCharacteristicHandle())) { |
takafuminaka | 3:2ea547dab8a8 | 162 | uint16_t bytesRead = params->len; |
takafuminaka | 3:2ea547dab8a8 | 163 | strncpy((char*)buff,(char*)params->data,bytesRead); |
takafuminaka | 5:b8961da0d06a | 164 | buff[bytesRead] = 0x00; |
takafuminaka | 5:b8961da0d06a | 165 | |
takafuminaka | 5:b8961da0d06a | 166 | DEBUG("received %u bytes. String '%s'\n\r", bytesRead,buff); |
takafuminaka | 3:2ea547dab8a8 | 167 | // ble.updateCharacteristicValue(uart->getRXCharacteristicHandle(), params->data, bytesRead); |
takafuminaka | 4:8f815f8d804e | 168 | // ble.updateCharacteristicValue(uart->getRXCharacteristicHandle(), buff, bytesRead); |
takafuminaka | 4:8f815f8d804e | 169 | |
takafuminaka | 4:8f815f8d804e | 170 | if ( strncmp("get time",buff,bytesRead) == 0 ) { |
takafuminaka | 5:b8961da0d06a | 171 | char date[30]; |
takafuminaka | 5:b8961da0d06a | 172 | |
takafuminaka | 4:8f815f8d804e | 173 | time_t rawtime=rtc.time(); |
takafuminaka | 5:b8961da0d06a | 174 | struct tm * timeinfo= localtime(&rawtime); |
takafuminaka | 6:273ddd00bd90 | 175 | strftime(date,sizeof(date),"%Y/%m/%d %H:%M:%S",timeinfo); |
takafuminaka | 5:b8961da0d06a | 176 | DEBUG("Current Time:%d %s\r\n",rawtime,date); |
takafuminaka | 5:b8961da0d06a | 177 | |
takafuminaka | 6:273ddd00bd90 | 178 | strftime(date,sizeof(date),"%Y%m%d%H%M%S",timeinfo); |
takafuminaka | 5:b8961da0d06a | 179 | BLEC("%s\n",date); |
takafuminaka | 5:b8961da0d06a | 180 | |
takafuminaka | 5:b8961da0d06a | 181 | } else if ( strncmp("get record ",buff,strlen("get record ")) == 0 ) { |
takafuminaka | 5:b8961da0d06a | 182 | int i=atoi(&buff[strlen("get record ")]); |
takafuminaka | 4:8f815f8d804e | 183 | if ( i >= 0 && i < s_evrecord ) { |
takafuminaka | 5:b8961da0d06a | 184 | char date[24]; |
takafuminaka | 5:b8961da0d06a | 185 | struct tm * timeinfo = localtime(&evrecord[i].time); |
takafuminaka | 6:273ddd00bd90 | 186 | strftime(date,sizeof(date),"%Y/%m/%d %H:%M:%S",timeinfo); |
takafuminaka | 5:b8961da0d06a | 187 | DEBUG("record %d at %s by %s (%dkm).\r\n",i,date,evrecord[i].events(),evrecord[i].distance); |
takafuminaka | 5:b8961da0d06a | 188 | BLEC("r%1d:%08x:%1x:%02x\n",i,evrecord[i].time,evrecord[i].event,evrecord[i].distance); |
takafuminaka | 4:8f815f8d804e | 189 | } |
takafuminaka | 5:b8961da0d06a | 190 | } else if ( strncmp("st ",buff,strlen("st ")) == 0 ) { |
takafuminaka | 5:b8961da0d06a | 191 | struct tm * init_timeinfo; |
takafuminaka | 5:b8961da0d06a | 192 | time_t rawtime; |
takafuminaka | 5:b8961da0d06a | 193 | |
takafuminaka | 5:b8961da0d06a | 194 | // initialize time |
takafuminaka | 5:b8961da0d06a | 195 | init_timeinfo = localtime(&rawtime); // note: must initialize the struct with this before trying to set components |
takafuminaka | 5:b8961da0d06a | 196 | // ...else code goes into the weeds!! |
takafuminaka | 5:b8961da0d06a | 197 | sscanf(buff,"st %4d%2d%2d%2d%2d%2d",&init_timeinfo->tm_year,&init_timeinfo->tm_mon,&init_timeinfo->tm_mday,&init_timeinfo->tm_hour,&init_timeinfo->tm_min,&init_timeinfo->tm_sec); |
takafuminaka | 5:b8961da0d06a | 198 | init_timeinfo->tm_year -= 1900; |
takafuminaka | 5:b8961da0d06a | 199 | init_timeinfo->tm_mon --; |
takafuminaka | 5:b8961da0d06a | 200 | |
takafuminaka | 5:b8961da0d06a | 201 | char date[24]; |
takafuminaka | 6:273ddd00bd90 | 202 | strftime(date,sizeof(date),"%Y/%m/%d %H:%M:%S",init_timeinfo); |
takafuminaka | 5:b8961da0d06a | 203 | DEBUG("time set is %s.\r\n",date); |
takafuminaka | 5:b8961da0d06a | 204 | |
takafuminaka | 5:b8961da0d06a | 205 | rawtime = mktime(init_timeinfo); |
takafuminaka | 5:b8961da0d06a | 206 | |
takafuminaka | 5:b8961da0d06a | 207 | rtc.set_time(rawtime); |
takafuminaka | 5:b8961da0d06a | 208 | } else if ( strncmp("AFE_GB 0x",buff,strlen("AFE_GB 0x")) == 0 ) { |
takafuminaka | 5:b8961da0d06a | 209 | sscanf(buff,"AFE_GB 0x%2x",&v); |
takafuminaka | 5:b8961da0d06a | 210 | Lightning.registerWrite(AS3935_AFE_GB,v); |
takafuminaka | 5:b8961da0d06a | 211 | write_param = 1; |
takafuminaka | 5:b8961da0d06a | 212 | } else if ( strncmp("NF_LEV 0x",buff,strlen("NF_LEV 0x")) == 0 ) { |
takafuminaka | 5:b8961da0d06a | 213 | sscanf(buff,"NF_LEV 0x%2x",&v); |
takafuminaka | 5:b8961da0d06a | 214 | Lightning.registerWrite(AS3935_NF_LEV,v); |
takafuminaka | 5:b8961da0d06a | 215 | write_param = 1; |
takafuminaka | 5:b8961da0d06a | 216 | } else if ( strncmp("WDTH 0x",buff,strlen("WDTH 0x")) == 0 ) { |
takafuminaka | 5:b8961da0d06a | 217 | sscanf(buff,"WDTH 0x%2x",&v); |
takafuminaka | 5:b8961da0d06a | 218 | Lightning.registerWrite(AS3935_WDTH,v); |
takafuminaka | 5:b8961da0d06a | 219 | write_param = 1; |
takafuminaka | 5:b8961da0d06a | 220 | } else if ( strncmp("SREJ 0x",buff,strlen("SREJ 0x")) == 0 ) { |
takafuminaka | 5:b8961da0d06a | 221 | sscanf(buff,"SREJ 0x%2x",&v); |
takafuminaka | 5:b8961da0d06a | 222 | Lightning.registerWrite(AS3935_SREJ,v); |
takafuminaka | 5:b8961da0d06a | 223 | write_param = 1; |
takafuminaka | 5:b8961da0d06a | 224 | } else if ( strncmp("get param",buff,strlen("get param")) == 0 ) { |
takafuminaka | 5:b8961da0d06a | 225 | write_param = 1; |
takafuminaka | 5:b8961da0d06a | 226 | } |
takafuminaka | 5:b8961da0d06a | 227 | |
takafuminaka | 5:b8961da0d06a | 228 | if ( write_param != 0 ) { |
takafuminaka | 5:b8961da0d06a | 229 | afe_gb = Lightning.registerRead(AS3935_AFE_GB); |
takafuminaka | 5:b8961da0d06a | 230 | nf_lev = Lightning.registerRead(AS3935_NF_LEV); |
takafuminaka | 5:b8961da0d06a | 231 | wdth = Lightning.registerRead(AS3935_WDTH); |
takafuminaka | 5:b8961da0d06a | 232 | srej = Lightning.registerRead(AS3935_SREJ); |
takafuminaka | 5:b8961da0d06a | 233 | DEBUG("AFE_GB=0x%02x,NF_LEV=0x%02x,WDTH=0x%02x,SREJ=0x%02x\r\n",afe_gb, nf_lev, wdth, srej); |
takafuminaka | 5:b8961da0d06a | 234 | BLEC("%02x,%1x,%1x,%1x\n",afe_gb, nf_lev, wdth, srej); |
takafuminaka | 4:8f815f8d804e | 235 | } |
takafuminaka | 3:2ea547dab8a8 | 236 | } |
takafuminaka | 3:2ea547dab8a8 | 237 | } |
takafuminaka | 3:2ea547dab8a8 | 238 | |
takafuminaka | 3:2ea547dab8a8 | 239 | #endif // if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 240 | |
takafuminaka | 0:371bcac81ea2 | 241 | void DetectLightning() |
takafuminaka | 0:371bcac81ea2 | 242 | { |
takafuminaka | 0:371bcac81ea2 | 243 | char OriginInt; |
takafuminaka | 0:371bcac81ea2 | 244 | time_t rawtime=rtc.time(); |
takafuminaka | 0:371bcac81ea2 | 245 | struct tm * timeinfo; |
takafuminaka | 0:371bcac81ea2 | 246 | timeinfo = localtime(&rawtime); |
takafuminaka | 5:b8961da0d06a | 247 | char date[24];// ,sdate[9]; |
takafuminaka | 0:371bcac81ea2 | 248 | int distance; |
takafuminaka | 0:371bcac81ea2 | 249 | |
takafuminaka | 6:273ddd00bd90 | 250 | strftime(date,sizeof(date),"%Y/%m/%d %H:%M:%S",timeinfo); |
takafuminaka | 5:b8961da0d06a | 251 | // strftime(sdate,sizeof(sdate),"%H%M%S",timeinfo); |
takafuminaka | 0:371bcac81ea2 | 252 | |
takafuminaka | 0:371bcac81ea2 | 253 | wait_ms(2); //on attend 2ms préconisation constructeur |
takafuminaka | 0:371bcac81ea2 | 254 | OriginInt = Lightning.interruptSource(); |
takafuminaka | 0:371bcac81ea2 | 255 | distance = Lightning.lightningDistanceKm(); |
takafuminaka | 0:371bcac81ea2 | 256 | |
takafuminaka | 5:b8961da0d06a | 257 | for(int i=s_evrecord-1;i>0;i--) { |
takafuminaka | 4:8f815f8d804e | 258 | evrecord[i] = evrecord[i-1]; |
takafuminaka | 4:8f815f8d804e | 259 | } |
takafuminaka | 4:8f815f8d804e | 260 | evrecord[0].time = rawtime; |
takafuminaka | 4:8f815f8d804e | 261 | evrecord[0].event = OriginInt; |
takafuminaka | 4:8f815f8d804e | 262 | evrecord[0].distance = distance; |
takafuminaka | 4:8f815f8d804e | 263 | |
takafuminaka | 1:a4119049dd99 | 264 | if (OriginInt == 1) { |
takafuminaka | 1:a4119049dd99 | 265 | led2 = !led2; |
takafuminaka | 1:a4119049dd99 | 266 | DEBUG("%24s : Noise level too high. %d km\r\n",date,distance); |
takafuminaka | 0:371bcac81ea2 | 267 | } |
takafuminaka | 0:371bcac81ea2 | 268 | if (OriginInt == 4) { |
takafuminaka | 1:a4119049dd99 | 269 | led2 = !led2; |
takafuminaka | 1:a4119049dd99 | 270 | DEBUG("%24s : Disturber detected. %d km\r\n",date,distance); |
takafuminaka | 0:371bcac81ea2 | 271 | } |
takafuminaka | 0:371bcac81ea2 | 272 | if (OriginInt == 8) { |
takafuminaka | 1:a4119049dd99 | 273 | led2 = !led2; |
takafuminaka | 1:a4119049dd99 | 274 | DEBUG("%24s : Lightning interrupt %d km\r\n",date,distance); |
takafuminaka | 0:371bcac81ea2 | 275 | } |
takafuminaka | 0:371bcac81ea2 | 276 | } |
takafuminaka | 0:371bcac81ea2 | 277 | |
takafuminaka | 0:371bcac81ea2 | 278 | |
takafuminaka | 0:371bcac81ea2 | 279 | int main(void) |
takafuminaka | 0:371bcac81ea2 | 280 | { |
takafuminaka | 3:2ea547dab8a8 | 281 | #if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 282 | ble.init(); |
takafuminaka | 3:2ea547dab8a8 | 283 | ble.gap().onDisconnection(disconnectionCallback); |
takafuminaka | 3:2ea547dab8a8 | 284 | ble.gap().onConnection(onConnectionCallback); |
takafuminaka | 3:2ea547dab8a8 | 285 | ble.gattServer().onDataWritten(onDataWritten); |
takafuminaka | 3:2ea547dab8a8 | 286 | ble.gap().getPreferredConnectionParams(&connectionParams); |
takafuminaka | 3:2ea547dab8a8 | 287 | |
takafuminaka | 3:2ea547dab8a8 | 288 | uart = new UARTService(ble); |
takafuminaka | 3:2ea547dab8a8 | 289 | buff_flash_flag = 0; |
takafuminaka | 3:2ea547dab8a8 | 290 | |
takafuminaka | 3:2ea547dab8a8 | 291 | #endif // if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 292 | |
takafuminaka | 3:2ea547dab8a8 | 293 | |
takafuminaka | 1:a4119049dd99 | 294 | led1=0; |
takafuminaka | 1:a4119049dd99 | 295 | led2=0; |
takafuminaka | 0:371bcac81ea2 | 296 | int hz=0; |
takafuminaka | 0:371bcac81ea2 | 297 | |
takafuminaka | 0:371bcac81ea2 | 298 | //initialisations |
takafuminaka | 2:e1e638cbf972 | 299 | wait(1); |
takafuminaka | 1:a4119049dd99 | 300 | DEBUG("reset\r\n"); |
takafuminaka | 0:371bcac81ea2 | 301 | Lightning.reset(); |
takafuminaka | 1:a4119049dd99 | 302 | DEBUG("setTuneCap as 5\r\n"); |
takafuminaka | 0:371bcac81ea2 | 303 | Lightning.setTuneCap(5); // Tuning Parameter |
takafuminaka | 1:a4119049dd99 | 304 | DEBUG("powerup\r\n"); |
takafuminaka | 0:371bcac81ea2 | 305 | Lightning.powerUp(); |
takafuminaka | 5:b8961da0d06a | 306 | |
takafuminaka | 5:b8961da0d06a | 307 | // AFE Gain (default Inddor:0x12 Outdoor:0x0es) |
takafuminaka | 2:e1e638cbf972 | 308 | DEBUG("set Indoor Mode as 0x0d\r\n"); |
takafuminaka | 2:e1e638cbf972 | 309 | Lightning.registerWrite(AS3935_AFE_GB,0x0d); |
takafuminaka | 5:b8961da0d06a | 310 | |
takafuminaka | 5:b8961da0d06a | 311 | // Set NF_LEV (default = 2) (0..0x07) |
takafuminaka | 5:b8961da0d06a | 312 | DEBUG("set Noise Filter as 0x02\r\n"); |
takafuminaka | 5:b8961da0d06a | 313 | Lightning.registerWrite(AS3935_NF_LEV,0x02); |
takafuminaka | 5:b8961da0d06a | 314 | |
takafuminaka | 5:b8961da0d06a | 315 | // Set WDTH (default = 2) (0..0x0f) |
takafuminaka | 5:b8961da0d06a | 316 | DEBUG("set WDTH as 0x02\r\n"); |
takafuminaka | 5:b8961da0d06a | 317 | Lightning.registerWrite(AS3935_WDTH,0x02); |
takafuminaka | 5:b8961da0d06a | 318 | |
takafuminaka | 2:e1e638cbf972 | 319 | |
takafuminaka | 1:a4119049dd99 | 320 | DEBUG("Auto Calibration Start\r\n"); |
takafuminaka | 0:371bcac81ea2 | 321 | float minerr = 100; |
takafuminaka | 0:371bcac81ea2 | 322 | int fincap = 7; |
takafuminaka | 0:371bcac81ea2 | 323 | for(int i=0;i<16;i++) { |
takafuminaka | 0:371bcac81ea2 | 324 | Lightning.setTuneCap(i); // Tuning Parameter |
takafuminaka | 0:371bcac81ea2 | 325 | hz = Lightning.MeasureLCOFreq(); |
takafuminaka | 0:371bcac81ea2 | 326 | float err = (hz-500000.)/500000.*100.; |
takafuminaka | 1:a4119049dd99 | 327 | DEBUG("%d : hz=%10d Hz (%5.2f%%)\r\n",i,hz,err); |
takafuminaka | 0:371bcac81ea2 | 328 | if ( abs(err) < minerr ) { |
takafuminaka | 0:371bcac81ea2 | 329 | minerr = abs(err); |
takafuminaka | 0:371bcac81ea2 | 330 | fincap = i; |
takafuminaka | 0:371bcac81ea2 | 331 | } |
takafuminaka | 0:371bcac81ea2 | 332 | } |
takafuminaka | 0:371bcac81ea2 | 333 | Lightning.setTuneCap(fincap); // Tuning Parameter |
takafuminaka | 0:371bcac81ea2 | 334 | wait_ms(100); |
takafuminaka | 0:371bcac81ea2 | 335 | hz = Lightning.MeasureLCOFreq(); |
takafuminaka | 0:371bcac81ea2 | 336 | float err = (hz-500000.)/500000.*100.; |
takafuminaka | 1:a4119049dd99 | 337 | DEBUG("Final %d : hz=%10d Hz (%5.2f%%)\r\n",fincap,hz,err); |
takafuminaka | 3:2ea547dab8a8 | 338 | BLEC("%1x:%10dHz:%5.2f:final\n",fincap,hz,err); |
takafuminaka | 0:371bcac81ea2 | 339 | |
takafuminaka | 1:a4119049dd99 | 340 | DEBUG("Auto Calibration finished\r\n"); |
takafuminaka | 0:371bcac81ea2 | 341 | |
takafuminaka | 0:371bcac81ea2 | 342 | // user selectable, any time < 512 seconds is OK |
takafuminaka | 0:371bcac81ea2 | 343 | #define PERIODIC_UPDATE 1 |
takafuminaka | 0:371bcac81ea2 | 344 | Ticker rtc_ticker; |
takafuminaka | 1:a4119049dd99 | 345 | rtc_ticker.attach(&periodic_update, PERIODIC_UPDATE); |
takafuminaka | 0:371bcac81ea2 | 346 | |
takafuminaka | 0:371bcac81ea2 | 347 | time_t initial_time = example_time(); |
takafuminaka | 0:371bcac81ea2 | 348 | rtc.set_time(initial_time); |
takafuminaka | 0:371bcac81ea2 | 349 | |
takafuminaka | 0:371bcac81ea2 | 350 | button1Press.fall(&print_time); // when button1 is pressed, this calls rtc.time() and prints it |
takafuminaka | 0:371bcac81ea2 | 351 | |
takafuminaka | 0:371bcac81ea2 | 352 | IntLightning.rise(&DetectLightning); |
takafuminaka | 0:371bcac81ea2 | 353 | |
takafuminaka | 3:2ea547dab8a8 | 354 | #if NEED_BLE_CONSOLE |
takafuminaka | 1:a4119049dd99 | 355 | /* setup advertising */ |
takafuminaka | 3:2ea547dab8a8 | 356 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
takafuminaka | 3:2ea547dab8a8 | 357 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
takafuminaka | 3:2ea547dab8a8 | 358 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
takafuminaka | 3:2ea547dab8a8 | 359 | DEVICE_NAME, sizeof(DEVICE_NAME) - 1); |
takafuminaka | 3:2ea547dab8a8 | 360 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
takafuminaka | 3:2ea547dab8a8 | 361 | (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
takafuminaka | 1:a4119049dd99 | 362 | |
takafuminaka | 1:a4119049dd99 | 363 | ble.gap().setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
takafuminaka | 1:a4119049dd99 | 364 | ble.gap().startAdvertising(); |
takafuminaka | 3:2ea547dab8a8 | 365 | #endif // #if NEED_BLE_CONSOLE |
takafuminaka | 1:a4119049dd99 | 366 | |
takafuminaka | 0:371bcac81ea2 | 367 | while (true) { |
takafuminaka | 4:8f815f8d804e | 368 | #if NEED_BLE_CONSOLE |
takafuminaka | 4:8f815f8d804e | 369 | ble.waitForEvent(); |
takafuminaka | 4:8f815f8d804e | 370 | #endif // #if NEED_BLE_CONSOLE |
takafuminaka | 0:371bcac81ea2 | 371 | } |
takafuminaka | 0:371bcac81ea2 | 372 | } |
takafuminaka | 1:a4119049dd99 | 373 |