Heart rate too low

Posted on
of 2
/ 2
  • Hi. I got my banglejs 2 about a week ago. The measured heart rate seems to be very low, approximately 75% of what I measure fingers on pulse. And this is pretty consistent, at rest the watch measures way below 50, when exercising not above 80. I fiddled with the settings also in different apps, pushed the watch on the skin but it's rarely showing the correct rate.

    Does anyone have a similar experience? Any ideas what to try out?

  • Hi @Niko,

    Which firmware version are you on? If you are not on 2v12 then upgrading (using the firmware update "app") should make a difference.

    Heart rate while exercising is not expected to he accurate yet but it is being worked on. Personally I see a low heart rate at rest about 50% of the time, but I am an outlier so hopefully you'll be OK on the latest firmware.

  • Today I left the watch on my wrist overnight and the gadgetbridge recorded just below 60 more or less the whole night. So it might be more a problem of my bones preventing proper contact. I'll keep watching it.

    I am on 2v12.

  • Hey @Niko,

    I have been having the same issue with the heart rate monitor as well. When I download the logs from the health tracker, or the heart rate recorder app, my average heart rate is in the 30s. When I check my pulse with my fingers I get around 70.

    What I find really weird is that when I use the WebIDE and turn the Heart Rate Monitor on manually and just watch the raw data on the event my heart rate eventually reads 70 BPM after a few moments.

    I am also on 2V12. Not sure why my logs are so low.

  • @Aadrik is the confidence higher with the correct or low reading? It should be higher when the reading is correct, but I wonder if like me you will see the correct rate has close to 0 confidence and the low one ~100%.

  • @myownself the confidence actually get pretty high values with lower BPMs as well as the correct 70 BPMs. It seems like as long as thr HRM can grab the same value a few times in a row the confidence value increases.

    I read through the github for the health app and the heart rate recorder but I don't see exactly how things are working.

  • OK. Good to know. I finally had chance to look at what the algorithm is doing with mine and I can clearly see the skipped beats. Probably just need a tweak to the peak finding algorithm (or valley finding as it is if I remember correctly).

  • Yeah, I can kind of confirm that. Although after activating the heart monitor in circle clock it was wrong even through the webIDE. I'll dig deeper.

  • Value seems to get too low when the arm is moved around. When holding still the measured heart rate seems to be ok.

  • Yes, right now this is to be expected. Pretty much all wrist-mounted heart-rate monitors tend to have trouble when you move your arm around but generally they use the accelerometer data so they can filter out false positives and still get some useful information out.

    Espruino doesn't do this at the moment since it's trying not to use proprietary algorithms. However hopefully the current algorithm will get improved at some point.

  • ok, does someone know of an open paper or equal where we could copy some things lines from?

  • I think I am just completely missing this but where is the heart rate data actually getting called from? I am looking at heart/app.js and I am not seeing the call to either subscribe to the event or get the data. Everything I am seeing looks more like logging data and drawing the graphs.

    I'd like to help try to improve this if I can. I am mostly self-taught so I just need a bit of direction if possible. Thank you.

  • See http://forum.espruino.com/conversations/­372681/#16388080

    I try to put together a summery of the current state (promised this a while ago) later this evening or tomorrow.
    Best thing to start is to use "HRM Accelerometer event recorder" App to record the raw sensor data, ideally together with some reference from a bluetooth belt. This writes csv, so you can look and analyse with whatever tool/language you prefer.
    Also you can use this script as example and see how to get all the relevant values.

  • For a quick start, you may also want to just paste this code
    to the left side of the WebIDE. (leave clock before. If you are in launcher menu the graphs don't get disturbed by watch/widget updates)
    After a while you should see the detected peaks marked.

  • Hi all,

    reporter of issue #1908 here. Moving the discussion to the forum as requested in that issue comments.

    • I tried the code in comment #15 - the graph looks reasonable, as long as I set hrmPollInterval to 20 instead of 40, and as long as I don't move my hand too much. I think some data could be extracted even from this signal only, without accelerometer data. Also, how can I make the hrmPollInterval settings permanent?

    • I tried HRM Accelerometer event recorder, it works. Can I somehow record the raw data to the Bangle.JS itself instead of my laptop? I can for example record it together with data from Garmin Vivoactive and put it somewhere to analyze.



  • Right, I've just added a repository where you can dump test data and can test it out against the algorithm: https://github.com/gfwilliams/EspruinoHR­MTestHarness

    It's currently only got some very short dumps I put in there in it, but you can see from plotting the graph how it's doing. Sitting at a resting heart rate works passably, others not so much. Looking at that I did notice one big issue in particular with how quick the running average adjusts, and I've just made some changes to Espruino itself (now in the latest builds) that should make it work a bit better particularly at higher heart rates.

    PRs for more data in particular would be great :)

    Also, how can I make the hrmPollInterval settings permanent?

    You can install the 'custom boot code' app and paste the command Bangle.setOptions({hrmPollInterval:20});­ in there I think.

    Can I somehow record the raw data to the Bangle.JS itself instead of my laptop?

    Not right now. The original app author did try to add this but I think he struggled. However you can still just run the app on an Android phone and get the data there while you're out and about.

    At some point I might have a look at doing a super stripped down app that included the Bluetooth HRM code in it as well, just so folks can get some data with basically zero effort.

  • The script on the custom.html page of the hrmaccevents app has a
    method=1;-Variable. 1 is recorded by the browser, 2 will record into a file called log.csv on the watch. Functionality should work, I just did not create enough HTML-GUI to handle getting the file. You could download that using the IDE though.

    You can actually try that out by executing


    in the custom.html scope in your chrome/chromiums debug view and pressing connect. As Gordon stated, I had problems getting the created files downloaded as they were fairly big. However that was a few months ago and I believe there were some changes that may have solved that issue. In that case a little bit of code for using the file based mode and getting that data of the watch should be doable.

  • @halemmerich: I downloaded the JS part of hrmaccevents app to my bangle.js2 (with method=2) and let it running for several minutes. The resulting CSV will for a while be at https://www.fi.muni.cz/~kas/tmp/hrm-log.­csv (2.3 MB).

    @Gordon: Would this file be usable, provided that I amend it with either an external log file from Garmin watch or paste the heart rate from Garmin as the last (BTHRM) column?

    I tried to import the Garmin .fit file into the GoldenCheetah desktop application (https://www.goldencheetah.org/), and it apparently can export the data as CSV. The only problem is that the resulting CSV has relative timestamps starting at zero. But I guess I will be able to synchronize it either using the GPS data or simply by starting at the same time on both devices.

  • Would this file be usable, provided that I amend it with either an external log file from Garmin watch

    Yes, that'd be fine - but you want to merge the two so it's just one big CSV file with lines for the BTHRM column when the heart rate data is available. Syncing time could be an issue but I guess as long as you're within 10 seconds or so it's unlikely to matter

    However it's worth noting that the Garmin watch will be having similar issues grabbing your heart rate so it may not be that accurate - really spending £20 on an bluetooth ECG heart rate monitor would be the best way to get accurate data.

  • Also noticed that problem, reading about half of what it should. Changing period to 20ms helps, I have a BT HRM and when steady the values match but basically as soon as I move my arm around it throws the internal one off completely.

  • Here's a Recorder log with both if it helps.

    2 Attachments

  • retty much all wrist-mounted heart-rate monitors tend to have trouble when you move your arm around but generally they use the accelerometer data so they can filter out false positives and still get some useful information out.

    Recently I found interesting paper with some 'heavy handed' approach to this problem:
    Motion Artifact Reduction in Wearable Photoplethysmography Based on Multi-Channel Sensors with Multiple Wavelengths
    they use four typical sensors with multiple wavelengths plus accelerometer and try to do some motion compensation with that. Full download of the paper is available so lot of interesting info related to this problem there. See also citations below for more related papers.

  • I have done a pull request on hrmaccevents to add recording to files and some status info on the bangle for easier use.
    Actually I once again could not download one of the files (about 2.5MB) with the IDE, some error message about a timeout. The backup function of the app loader worked flawless but is a little bit cumbersome if only one file is needed.

  • Post a reply
    • Bold
    • Italics
    • Link
    • Image
    • List
    • Quote
    • code
    • Preview

Heart rate too low

Posted by Avatar for Niko @Niko