Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API mbed nRF51822
Revision 13:c2ffbb25ed0a, committed 2017-10-28
- Comitter:
- electronichamsters
- Date:
- Sat Oct 28 05:13:58 2017 +0000
- Parent:
- 12:9bb01e063498
- Commit message:
- tested, works.
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Sun Aug 27 05:48:45 2017 +0000
+++ b/main.cpp Sat Oct 28 05:13:58 2017 +0000
@@ -20,6 +20,8 @@
*
* BLE sensor as Beacon advertisements. Intended to function with specific BLE observer.
* Tested on nRF51822 targets on mbed.
+ *
+ * /BEA/0 is fast press, /BEA/1 is slow press
* keywords: todo, tochange
*/
@@ -38,8 +40,9 @@
/*******************************************************************************************
* START tochange: items that may need customization depending on sensors, hardware, and desired behavior
*******************************************************************************************/
-const uint16_t Periodic_Update_Seconds = 20; //number of seconds between periodic I/O status re-transmits 900s =15 min.
+const uint16_t Periodic_Update_Seconds = 900; //number of seconds between periodic I/O status re-transmits 900s =15 min.
#define MyDebugEnb 0 //enables serial output for debug, consumes ~1mA when idle
+#define EnablePeriodic 0
uint8_t magnet_near=0; //this I/O, specifically for reed switch sensor
@@ -47,8 +50,12 @@
*Syntax: Pin "P0.4" on nRF51822 documentation is mbed "p4".
* InterruptIn is pulled-up. GND the pin to activate.
*/
-InterruptIn button1(p0); //nRF51822 P0.0
-InterruptIn button2(p1); //nRF51822 P0.1
+//InterruptIn button1(p0); //nRF51822 P0.0
+//InterruptIn button2(p1); //nRF51822 P0.1
+InterruptIn button1(p28); //nRF51822 P0.28 is beacon button
+//InterruptIn button1(p24); //nRF51822 P0.24 is purple board
+//InterruptIn button1(p1);
+
/******************************************************************************************
* END tochange
*******************************************************************************************/
@@ -171,7 +178,8 @@
//ISR for I/O interrupt
void buttonPressedCallback(void)
{
- Tic_Debounce.attach(debounce_Callback, 1); //ok to attach multiple times, recent one wins
+ //for buttons, make debounce much shorter to make short press and long press easier
+ Tic_Debounce.attach(debounce_Callback, 0.35); //ok to attach multiple times, recent one wins
}
//ISR for I/O interrupt
@@ -311,16 +319,15 @@
NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
NRF_ADC->TASKS_START = 1;
-
//while loop doesn't actually loop until reading comlete, use a wait.
while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {};
- wait_ms(1);
+ wait_ms(2);
//save off RESULT before disabling.
//uint16_t myresult = (uint16_t)NRF_ADC->RESULT;
//disable ADC to lower bat consumption
- NRF_ADC->TASKS_STOP = 1;
+ //NRF_ADC->TASKS_STOP = 1; //perform disable in main loop
//NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled; //disable to shutdown ADC & lower bat consumption
return (uint16_t)NRF_ADC->RESULT; // 10 bit
@@ -357,7 +364,7 @@
//while loop doesn't actually loop until reading comlete, use a wait.
while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {};
- wait_ms(1); //needed because busy while loop doesn't run.
+ //wait_ms(2); //needed because busy while loop doesn't run.
//save off RESULT before disabling.
//uint16_t myresult = (uint16_t)NRF_ADC->RESULT;
@@ -430,7 +437,9 @@
while (ble.hasInitialized() == false) { /* spin loop */ }
//every X seconds, sends period update, up to 1800 (30 minutes)
+ #if Periodic_Update_Seconds
Tic_Periodic.attach(periodic_Callback, Periodic_Update_Seconds); //send updated I/O every x seconds
+ #endif
Tic_Birthday.attach(clock_reset_Callback, Periodicity); //clock algorithm periodicity
@@ -454,65 +463,51 @@
//set both pins to pull-up, so they're not floating when we read state
button1.mode(PullUp);
- button2.mode(PullUp);
+ //button2.mode(PullUp);
+ //for buttons, always wake on press, but not release.
+ button1.fall(buttonReleasedCallback);
//expect either button1 or button2 is grounded, b/c using SPDT reed switch
//the "common" pin on the reed switch should be on GND
uint8_t button1_state = button1.read();
- uint8_t button2_state = button2.read();
+ //uint8_t button2_state = button2.read();
//let's just update the pins on every wake. Insurance against const drain.
//if state == 0, pin is grounded. Unset interrupt and float pin, set the other pin for ISR
- if ( (button1_state == 0) && (button2_state == 1) )
+ //if ( (button1_state == 0) && (button2_state == 1) )
+ if (button1_state == 0)
{
magnet_near = 1;
//button1.disable_irq() //don't know if disables IRQ on port or pin
- button1.fall(NULL); //disable interrupt
- button1.rise(NULL); //disable interrupt
- button1.mode(PullNone); //float pin to save battery
+ //button1.fall(NULL); //disable interrupt
+ //button1.rise(NULL); //disable interrupt
+ //button1.mode(PullNone); //float pin to save battery
//button2.disable_irq() //don't know if disables IRQ on port or pin
- button2.fall(buttonReleasedCallback); //enable interrupt
- button2.rise(buttonReleasedCallback); //enable interrupt
- button2.mode(PullUp); //pull up on pin to get interrupt
+ //button2.fall(buttonReleasedCallback); //enable interrupt
+ //button2.rise(buttonReleasedCallback); //enable interrupt
+ //button2.mode(PullUp); //pull up on pin to get interrupt
#if MyDebugEnb
device.printf("=== button 1! %d seconds=== \r\n", seconds_Old);
#endif
} //end if button2
- else if ( (button1_state == 1) && (button2_state == 0) ) //assume other pin is open circuit
+ else if (button1_state == 1) //assume other pin is open circuit
{
magnet_near = 0;
//button1.disable_irq() //don't know if disables IRQ on port or pin
- button1.fall(buttonReleasedCallback); //enable interrupt
- button1.rise(buttonReleasedCallback); //enable interrupt
- button1.mode(PullUp); //pull up on pin to get interrupt
+ //button1.fall(buttonReleasedCallback); //enable interrupt
+ //button1.rise(buttonReleasedCallback); //enable interrupt
+ //button1.mode(PullUp); //pull up on pin to get interrupt
//button2.disable_irq() //don't know if disables IRQ on port or pin
- button2.fall(NULL); //disable interrupt
- button2.rise(NULL); //disable interrupt
- button2.mode(PullNone); //float pin to save battery
+ //button2.fall(NULL); //disable interrupt
+ //button2.rise(NULL); //disable interrupt
+ //button2.mode(PullNone); //float pin to save battery
#if MyDebugEnb
device.printf("=== button 2! === %d seconds\r\n", seconds_Old);
#endif
} //end if button1
- else //odd state, shouldn't happen, suck battery and pullup both pins
- {
- magnet_near = 2;
- //AdvData[4] = 0x33;
- //button1.disable_irq() //don't know if disables IRQ on port or pin
- button1.fall(buttonReleasedCallback); //disable interrupt
- button1.rise(buttonReleasedCallback); //disable interrupt
- button1.mode(PullUp); //float pin to save battery
-
- //button2.disable_irq() //don't know if disables IRQ on port or pin
- button2.fall(buttonReleasedCallback); //disable interrupt
- button2.rise(buttonReleasedCallback); //disable interrupt
- button2.mode(PullUp); //float pin to save battery
- #if MyDebugEnb
- device.printf("no buttons!! %d seconds\r\n", seconds_Old);
- #endif
- } //end odd state
if (Flag_Update_IO) {
@@ -541,7 +536,7 @@
//read and convert analog voltage. Comment out this section if note needed, saves some battery
NRF_ADC->TASKS_STOP = 1;
float analogreading;
- analogreading = (float)read_ADC_pin();
+ //analogreading = (float)read_ADC_pin(); //comment out for beacon buttons
analogreading = (analogreading * 3.6) / 1024.0;
#if MyDebugEnb
device.printf("separate analog reading: %.02f \r\n", analogreading);
@@ -618,13 +613,13 @@
AdvData[JSON_loc] = 0x22; //ADV_Data[13] = "
JSON_loc++; //14
- AdvData[JSON_loc] = 0x6d; //ADV_Data[14] = m
+ AdvData[JSON_loc] = 'B'; //ADV_Data[14] = B
JSON_loc++; //15
- AdvData[JSON_loc] = 0x61; //ADV_Data[15] = a
+ AdvData[JSON_loc] = 'E'; //ADV_Data[15] = E
JSON_loc++; //16
- AdvData[JSON_loc] = 0x67; //ADV_Data[16] = g
+ AdvData[JSON_loc] = 'A'; //ADV_Data[16] = A
JSON_loc++; //17
//for periodic calls, we want to add an extra mqtt level "p", using "/p"