BLE Lightning sensor for Nordic NRF51822 based module

Dependencies:   AS3935 AS3935_ext BLE_API mbed nRF51822 nrf51_rtc

Committer:
takafuminaka
Date:
Sat Sep 05 09:53:52 2015 +0000
Revision:
6:273ddd00bd90
Parent:
5:b8961da0d06a
Child:
7:7cf0707ae983
2015/09/05

Who changed what in which revision?

UserRevisionLine numberNew 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 5:b8961da0d06a 69 return "Un known 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