Example code to create a heartbeat sensor using the Si1146 on Silicon Lab's Biometrics expansion board for the Wonder Gecko

Dependencies:   EFM32_SegmentLCD Si114x mbed

Files at this revision

API Documentation at this revision

Comitter:
Sissors
Date:
Tue Aug 25 19:30:13 2015 +0000
Parent:
0:f3705ec14cf0
Commit message:
Improved heartbeat algorithmes.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r f3705ec14cf0 -r b2b2924c3c48 main.cpp
--- a/main.cpp	Sun Aug 23 17:00:09 2015 +0000
+++ b/main.cpp	Tue Aug 25 19:30:13 2015 +0000
@@ -46,6 +46,8 @@
     int sum;
     int prevtime = 0;
     int timesincelast;
+    float abssum;
+    float abssum_iir = 0.0f;
     
     Timer timey;    
     timey.start();
@@ -58,8 +60,14 @@
         mvingavg[0] = curval - prevval;
         sum = mvingavg[2] + mvingavg[1] + mvingavg[0];
         
-        //Magic number for minimum threshold before it sees something as a heartbeat, adjust if my fingers are special :)
-        if (sum < -50) {
+        //Float val for abs(sum) to calculate threshold dynamically
+        abssum = (float)abs(sum);
+        abssum_iir = abssum_iir * 0.99f + abssum * 0.01f;
+        
+        //Now we know the 'average' absolute 'noise' ( plus some part of the heartbeat)
+        //We multiply this by four (yes randomly chosen) and use it as threshold for heartbeat
+        //Possibly this is too much if you are really excited, but haven't been excited enough to check this
+        if (sum < (int)(-4.0f * abssum_iir)) {
             segmentDisplay.Battery(4);
             timesincelast = timey.read_ms() - prevtime;
             if (timesincelast > 250) {