uECG - a very small wearable ECG

It's cheap, doesn't use a specialized heart rate AFE and can blink LEDs with your pulse :)

Similar projects worth following
Starting from
ultimaterobotics has 39 orders / 0 reviews
Ships from Ukraine
Tired of commercial overencumbered projects using expensive AFEs, we built a simple, cheap ECG wearable. It streams realtime data and works with phones and PCs. We ran tests on it, blinked LEDs and measured stress. We then brought it to Makerfaire Prague in June 2019, where a lot of people successfully tested it, and in July 2019 we ran a crowdfunding campaign to produce the first batch! In October 2019, we attended Makerfaire Rome with a pre-production version of uECG before finally producing them in November. And we also participated in the 2019 Hackaday Prize (Honorable Mention for Best Design).

We sent uECGs to all our Indiegogo backers in February 2020. We originally planned to produce another device batch in March and sell them, but it was delayed due to COVID-19 and we had to switch to freelance work for the next few months. However, as of July 2020, uECG is finally available in our Tindie store!

ECG is a simple signal, but few ECG devices can provide raw data and show ECG signal while running. Most are also commercial medical devices - over-engineered, bulky and expensive. Having worked with biosignals, particularly ECG, on several commercial projects, we decided to create our own - simple, efficient, and open source. 

Thus, uECG was born. It can stream realtime ECG signal via BLE or transmit to a desktop PC, using a simple (nRF52832-based) USB receiver that translates radio signal into virtual COM port data stream. 

Our goal was a low cost, low weight, high signal quality open hardware wearable that anyone could use. uECG is intended for makers, students or citizen scientists who want to use biosignals to do practical research - or just create things. It can also be useful as a diagnostic device for medical professionals in remote areas, without access to medical technology. And it’s open hardware - so anyone can build their own, or modify an existing one.

uECG has snap connectors that accept any single-use wet electrodes, as well as HRM straps or reusable electrodes. In a 3D-printed case, it is simple and can be worn for long periods of time. It’s relatively low-powered - enough for 9 hours of battery life at 100 mAh - so weight is also low, about 9 grams.

The system is based on MCP3911 front-end - originally developed for energy metering, but it performs nicely in our case too. It also has an AD8606 buffer precision opamp, an nRF52832 SoC for Bluetooth/RF and signal processing, and a VOS617B-7T optocouple to connect other devices (LEDs are one example, everyone loves them). Without LED indication, device uses less than 10mA even during BLE transmission at 125 Hz. For PC transmission, our custom radio protocol is used at 1 kHz.

The firmware uses our own filtering algorithm to filter out mains noise (both 50 Hz and 60 Hz, without distorting high frequency components of ECG), resulting in a clear, readable ECG graph you can use for anything. The signal quality of this setup is quite high - but there will be more on that in logs.

Here's what you need to build uECG (base station is for streaming to PC, not necessary for smartphone):

PCB files:
uECG v4 PCB design
uECG v4 gerbers
Base station PCB design
Base station gerbers 

uECG firmware 
Base station firmware
Firmware build and upload instruction

Android app and desktop tool:
Android app source code
Android app compiled
PC tool source code

FreeCAD model
Top part for printing
Bottom part for printing

KiCAD files for receiver base - ultimate_base rev2.6 (produced in November 2019 - first batch production run). With fiducials, pogo pin pads.

Zip Archive - 268.87 kB - 12/06/2019 at 18:50



Centroid file for receiver base - ultimate_base rev2.6 (produced in November 2019 - first batch production run)

pos - 2.62 kB - 12/06/2019 at 18:50



Receiver base PCB leds polarity indication (for manual assembly/useful for factory check)

JPEG Image - 190.93 kB - 12/06/2019 at 18:50



BOM for receiver base - ultimate_base rev2.6 (ready for production, complete with comments and Chinese supplier links, produced in November 2019 - first batch production run).

sheet - 11.78 kB - 12/06/2019 at 18:50


Gerbers for receiver base - ultimate_base rev2.6 (ready for production, produced in November 2019 - first batch production run)

Zip Archive - 94.17 kB - 12/06/2019 at 18:50


View all 28 files

  • 1 × nRF52832 (on PCB) popular Bluetooth SoC
  • 1 × MCP3911 (on PCB) a generic AFE
  • 1 × BMI160 (on PCB) IMU
  • 1 × RGB led (on PCB)
  • 1 × micro USB

View all 8 components

  • Black Friday sale - and new case colors

    Ultimate Robotics5 days ago 0 comments

    With all of the internet plastered with Black Friday ads, we've decided to add our share to the enthropy and put uECG on sale - but that's not all we're adding.

    We've wanted to have more color options for 3D printed cases for the longest time, so we bought and tested a lot of filaments. We particularly liked a pastel PLA set from Monofilament (a local Kyiv manufacturer), but they lacked a pink one, and couldn't find any other available in Ukraine. Eventually we ordered a test 200 gram spool of pastel pink PLA from taobao and it turned out really well.

    So now uECG cases come in five colors - black, pink, yellow, turquoise and white (a nice milky tone). It'll be on sale on Tindie for $69 (which puts the price of a full set with the BLE receiver base at $79) for another two days.

    What uECG can currently do:

    - stream realtime ECG signal

    - calculate BPM, HRV, Poincare plot

    - get and save data in Android and node.js (cross-platform) apps - yes, that means that you can use it on Windows too!

    - stream for 12-18 hours nonstop

    - update firmware wirelessly

    - as of recent, it also has EMG mode

    - and, of course, it's fully open source and open hardware - and will always be. 

    So basically, it packs a lot. 

    If you don't need a uECG though, you can still go check out the new pictures and colors!

    ...and if you didn't want to check out the new colors, you just did anyway :)

  • uECG for EMG

    Olya Gry11/22/2020 at 17:12 0 comments

    Before moving on to the technical details of today's update, here’s the background story. More than a year ago, more or less at the same time we were finishing uECG, we began to develop uEMG. In parallel with this, having launched a crowdfunding company, we made a promo video where we showed that uECG can be used to measure electromyography.

    A couple of months ago, a person wrote to us and said that he saw that video and needed a device to measure EMG. We really wanted to have time to finish uEMG this year, but life circumstances (and pandemic) forced us to deal with other issues... So we suggested him to use uECG to measure EMG. For this, we have significantly updated the software part and now we are also working on improving the UI.

    That actually required rewriting the whole radio stack - previous protocol had a major bug, and overall wasn’t well suited for multiple devices. We ended up making a kind of a library with all the important functions we use in most projects - radio, timer, UART - all our further code will use it (and so its functionality would be growing over time). The main difference vs Nordic’s softdevice approach is full control over what is happening and when exactly (so for instance radio processing won’t interrupt time-critical interactions with peripherals), and clear understanding of what exactly is happening under the hood.

    Changes are so significant that we decided to add a bit more functions into uECG firmware and call it Mark II (even though hardware is the same, so all previous devices can be upgraded). The new version of this firmware will be released soon. 

    Now for the EMG part: each device performs on-board 8-points FFT calculation and uses relation of spectral bins 1-3 vs bin 0 to determine EMG activity level (since a lot of EMG signal is located at 100+ Hz area, and not a lot of random noise appears there). This calculated level is indicated with LED colors - at first we tried to encode it in brightness level alone, but it wasn’t clear enough, so at first it increases brightness of blue channel, and with further rise goes into pink and then cyan colors, thus making it easier for visual interpretation. And it’s also sent out to the base station, together with calculated spectrum. 

    New radio protocol now implements discovery, and the base station polls data from all discovered devices within a short cycle (2 milliseconds per device). Sometimes packets are lost, so practical latency is often 2-3 times higher than the best case scenario, but still it’s quite close to realtime.

    We have made a video where you can see our jack-of-all-trades, master of none Dmitry playing the piano, with simultaneous recording of data from devices (ordinary charts represent calculated EMG levels, and spectral charts show the FFT data calculated on-board).

    Happy viewing!

  • Some more Maker Faire stuff

    Ultimate Robotics10/17/2020 at 07:51 0 comments

    We were so deep in Maker Faire preparations that accidentally posted two logs about the event authored by two different team members. Anyway, the last one has more useful links, so we decided not to delete it and just edited a bit.

    Main Empire State Maker Faire 2020 page. The event is live from 16 to 17th October, with Friday reserved for more student and school-oriented events and the rest for the Saturday. 

    So our stream's today (Oct 17) 10:30 EST. Come chat! 

    Link to the stream here:

    Our project on Make Projects:

    All of the events:

  • Live streaming on Empire State Maker Faire

    Kseniia10/17/2020 at 01:15 0 comments

    We'll be streaming live this Saturday on Empire State Maker Faire! We'll be showing our home workshops, devices new looks and abilities, and generally talking about open source stuff and plans on Saturday, Oct 17, from 10:30 to 11:15 EST (that's 17:30 Kyiv/Eastern European time). 

    There are lots more cool events there, so be sure to check out the Maker Faire schedule. We're personally hyped for the 12,000 masks, Genspace and Public Libraries Print PPE ones - and we'll also be sure to check our as many makerspace tour streams as we can!

  • Wireless firmware upload for uECG!

    Ultimate Robotics10/03/2020 at 13:12 0 comments

    You probably have noticed that updates began to appear more and more often!  To be honest, we are also happy about this...

    The development of the device partly coincides with our development, too, because the technologies we apply here are related to our growth as specialists. For example, a year ago we were able to make only primitive applications - rather, more data output to the screen - and over the past six months the quality and functionality of the application has grown significantly.  

    But today I would like to tell you a little about the technology that we have been trying to implement over the past few years: the bootloader. It is very strange, but no matter how we looked, we hadn't seen a single post covering the whole process, a single implementation available. Possibly it is because Nordic's softdevice has it, and even though this code is closed and proprietary, it gets the job done - so people are more or less ok with it.

    Not us though. And it's in fact a very simple thing - but somehow it is not properly described anywhere! So we had to improve our knowledge of ARM architecture, linker scripts, physical memory layout of the program - and when it was good enough, actual programming of a wireless bootloader took less than two weeks. Yet the whole way to that point took about 2 years, with 5 or 6 failed attempts in the process. Hopefully our code and notes would save this time for anyone trying to do the same:

    So, at the end of August it finally became possible to upload firmware via radio! It is very cool! And we hope reliable... so we advise you not to rush to throw out st-link programmers just yet... We filmed a video review of the firmware upload process and will add this part to the instructions. But we will also record a separate video so that everyone who received the device before September 1 can upload the firmware without a programmer.  

    So we'll be in touch! And write if you have questions / suggestions / and just kind words!

  • uECG now on Windows!

    Olya Gry09/21/2020 at 18:29 0 comments

    Unbelievable, but it is a fact! We have finally released our application for Windows, macOS and Linux!

    Initially, we were not sure that there would be a need for Windows application, but with your feedback we realized our mistake :) The process of installing and launching the application is described in detail in our Instructions section. We added all updates and new features there.

    Also, while we were working on Windows app, we somewhat expanded its functionality. We added new charts, namely temperature (yes, we never told you, but there is a thermometer inside as well - but not really precise, so it's of less use for medical purposes) and battery voltage. And PC app works with x8 higher data rate than Android - which allows to see more details of the signal! But other than that, it is very similar now.

    We invite you to watch our joyful greeting and review of the application in a new video!

  • A major app update (ECG plots, Poincare, HRV, accelerometer data)

    Olya Gry09/08/2020 at 20:21 5 comments

    Over the past six months, we have been biting our nails in hope for feedback on the use of uECG. But the feedback we got was mostly about the fact that the mobile app does not run on one phone or another… so we did a major app rework! 

    And also added new functionality:
    - Poincare plots;
    - HRV, BPM, GSR and accelerometer graphs; 
    - app can now run in the background;
    - a lot of UI updates, like convenient interval choice

    The new app (already on Google Play) works on all of our four phones, on Android 6 and above - we checked up to Android 10 - but there is a trick with Android 6 phones to make it run. We recorded a short video to demo the new features and also show every step from installing to using the app.

    We hope you find this video interesting and useful! 
    ...and that now you will be able to actually use our app :)

  • uECGs in stock on Tindie and last few months recap

    Kseniia07/13/2020 at 08:45 2 comments

    Hi everyone and hope you're in good health! We're back. Spent this time surviving under quarantine and returned to freelance for this, because COVID hit just before we could get the shop going.
    It's been a few hard, but very interesting months. In time left from commercial projects, we tried to develop something useful for COVID and hit some hackathons (including EUvsVirus, which was amazing). This spawned two new projects - a bluetooth oximeter and an Odroid-based patient monitor

    We also made a video with our thoughts on medical certifications featuring the patient monitor - apparently too edgy at the time of making, but look what's happening now. Major stuff all over the world. Maybe we'll see the end of gatekeeping in the medical industry not in several years, but much sooner! 

    Until then, we are going to do what we can from our side, which includes finally opening the shop. Or rather two shops: the Tindie one for global sales and our Ukrainian one for local sales. That'll have to do until we find a good international card payment system that works in Ukraine. With Tindie, we've had two problems: no PayPal (not available for receiving in Ukraine) and no money for paying initial order shipping fees because funds from sales become available on Tindie after one month only and everything we've earned from freelance we've spent on rent and food. Now we managed to secure both - a friend will host PayPal for us, and we also have some extra funds.

    So without further ado, the Tindie shop is now open and uECGs are in stock! We're putting a small amount out for now. We'll add stock gradually if we have money left for shipping! :) Those who are on the waitlist, will receive emails automatically.

  • An Android app adventure

    the_3d602/17/2020 at 20:44 0 comments

    We started writing Android app at the beginning of last year. Since most of the development was on my (Dmitry’s) Meizu phone, that’s the only phone it was tested on. Only after some time we found that not all phones on our team were able to run the application. A lot of things happened - Maker Faire, factory production, then manual assembly, packaging and distribution of devices. Only a couple of weeks ago we realized that a problem with the application could affect many users.

    I’m a beginner Android developer. To be precise, I only wrote one Android app - once I copy-pasted something that works kinda the way I like, and since then I made many variations of that first app for different purposes. Even BLE functions were partially inherited from previous projects (these I proudly wrote myself using Android documentation, because I couldn’t find any example simple enough to understand). With one important difference: in uECG protocol, data stream really pushes capabilities of BLE advertising mode (not theoretical limit, but a practical one, where really a lot of packets could be lost). And I wanted advertising mode because it’s much simpler to implement on the device side. Yes, about the device side: there’s one thing - we are not using softdevice, for a number of reasons (microseconds-precise timing, LEDs driver, 1 ms data processing cycle - all of that is based on interrupts and softdevice would delay them. It kinda can be workarounded and/or reduced - but why restrict future development options?). So I’ve implemented advertising protocol manually. And it worked with my phone just fine (as well as team members’ phones at the moment), everything was going well, until we got a new phone and started to test with it. To my surprise, nothing worked at all - that new phone was just ignoring packets. I’ve started to dig into BLE documentation and wrote a BLE sniffer. In a few days I found and fixed several things that weren’t compliant with BLE specification (yet worked on older phones). And… nope, it still didn’t work on the new phone. Except for some strange cases: once in 10s or 100s of thousands packets something was getting through. I started to suspect that packets that actually got through were corrupted but by chance had correct CRC. Sure enough, after 3 days of experiments I found that custom data field length should be different from what’s described in BLE documentation (at least from that particular document I was using: actually there is no single point where you can get all the data you need). As soon as I changed it, everything started working on all of our phones… except for my own old one! After some more guessing I realized that Android banned my application from using any active form of BLE scanning - so when some other app was scanning BLE in the background, my app also received the data and worked just fine. But as soon as other, non-banned app, was turned off - my app stopped working too. I still have no idea why it happened and what to do about it (not a single hint anywhere), but apparently this is a problem of my particular phone and my Android being not happy with my code. I can live with that! :)

    App in play store:
    Source code:

  • uECG instruction update

    Ultimate Robotics02/11/2020 at 02:22 1 comment

    While the shop is in last stages of development, we uploaded a new instruction for uECG! After sending first devices to Ingiegogo backers, it was time to seriously update the instruction section, cause it only contained information about the firmware. It now has 8 steps - for complete experience, we added lots of pictures and a video:

    The instruction contains info about uECG kits, but it's also useful if you want to assemble your own uECG or just interested in the device, its parts and how everything works. 

    The first step is unpacking - we decided to show in detail what you receive if you order uECG. The second and third steps are power on and usage - turning on the device and placing it on the chest. Simple actions, but better to show them. Step 4 - using the app: we uploaded the app on Google Play and now you can download it (it’s free, of course) and use it to receive data from uECG on the phone. Steps 5 and 6 are power off and charge. And then, steps 7 and 8 - firmware update, showing how to connect the STLink programmer and pogo pins, and the firmware upload process itself.
    Feedback is very important to us, so please write in the comments if you have thoughts or questions (especially if you already have uECG :)

    In the meantime, here’s a video instruction showing how everything works:

View all 33 project logs

  • 1

    Welcome, everyone!

    This is an instruction on how to use uECG kits that we sell, but it’s also useful if you want to make your own uECG. Or maybe you were just browsing Hackaday and accidentally found our projects. In any case, thank you for being interested in uECG! 

    For clarity, we also made this video to show everything described in the instruction:

    We tried to make the package as simple and environmentally friendly as possible! It doesn’t contain plastic packaging, but is still antistatic and protects well. 

    The devices (uECG, base and programmer) are stored in separate cardboard cutouts; the electrodes, wires and pins are in the smaller box.

    The most popular (Developer’s) uECG kit includes the following:

    • uECG device;
    • 3D-printed case;
    • 10 single-use electrodes;
    • base station for connecting to laptop/PC (a simple nRF52832 USB board designed by us);
    • USB programmer for firmware upload (ST-Link v2, we use a tested Chinese clone);
    • pogo pin adapter (4 pogo pins/2.54 spacing).
  • 2
    Power on
    1. To turn uECG on, use the slider on the side of the device;
    2. After switching it, you should see a series of blinks on the left side - first red, green, blue; then three green flashes; then pink. The pink LED means the device is on and ready to use;
    3. The pink LED should periodically flash when device receives signal - i.e. in contact with the skin.
  • 3
    1. Attach round gel electrodes to the snap connectors on the bottom of uECG;
    2. Peel off the protective layer from them and stick them to the chest as shown in picture below;
    3. Gently press the device onto the skin once to ensure it sticks;
    4. After use, peel off the device and detach the electrodes (they are single-use);
    5. It’s good to minimize the amount of hair and wipe the skin with alcohol for better signal. It will also be easier to remove, too :)

    Please turn off uECG after use! The sleep mode may be glitchy, so the battery may discharge too much.

View all 10 instructions

Enjoy this project?



Bud Bennett wrote 04/09/2019 at 20:00 point

I really hate it when people comment negatively on my projects, but I really love it that they are interested enough to make a comment. My background includes design of medical equipment in the olden days: 1977-1983. I took a look at your schematic and have a couple of questions, or comments for improvement.

1. It doesn't appear that you need to use a unity gain amplifier (the AC8606) to buffer the ADC. U1B is biased near GND and might have problems tracking signals below GND. U1A doesn't do anything at all, except draw current via the 10Ω load of R3.

2. The MCP3911 has a PGA that should eliminate the need for the AD8606. If you biased the CH0- input a few mV above GNDA and AC-coupled CH0+ it should be all that is needed. Yes, there is some uncertainty as to the input impedance of the MCP3911, but that doesn't worry you with regards to the time constant of C17. which uses that impedance.

3. The need for the onto-isolator U7 escapes me. Please elaborate.

4. The ADC doesn't include a 50-60Hz notch filter. Many other ∑-∆ converters include a 50-60 Hz notch. A notch would make the subsequent signal processing easier.

5. D2 is a mystery to me. Please explain.

Overall I'm impressed with your progress. I like it a lot.

  Are you sure? yes | no

the_3d6 wrote 04/09/2019 at 20:50 point

Hi! No problems with negative comments - but yours aren't negative at all :) Quite the contrary, thanks for taking a deep look at our schematics!

It seems that you've missed that we have not 2 but 3 grounds: GND is digital ground, GNDA is analog ground, and GNDS is a virtual "ground" which is actually at +0.6V and we measure all analog signals around it. Probably our symbols are misleading ))

1. U1A generates virtual ground - divider on its input sets level of about 0.6V and U1A repeats it (via 10R resistor just in case if something goes wrong, no real need in it since amplifier survives short circuit). That level of 0.6V is our zero point around which we work (and normally we stay within a few mV around).

2. MCP3911 has input impedance of about 30k when PGA is set to 32 amplification - and skin has impedance in a few MOhm area (measured that for gel pads and placement we are using) - so without buffering input with AD8606, it works like a voltage divider. Actually in our first iteration we made a mistake and had to omit amplifier completely - and it worked somehow, but signal was much, much worse and very sensitive to contact quality.

3. It is for connecting to external Arduino or other microcontroller: we are detecting heart beats onboard, and send them as short pulses there. Optocoupler makes external connection simple, eliminating possible problems (you can just connect it, and if it doesn't work - connect with opposite polarity). 

4. Yes - but check project logs, I'm really proud of the filter I've made! :) It's better than anything I saw before - including max30003 AFE which is specifically designed for ECG. Our result is seriously better (we work on another project based on max30003 in parallel, so I can compare them in identical conditions). And MCP3911 is the cheapest 16 bit AFE out there! )) (also uploaded illustration of how it works in extreme conditions: )

5. MCP3911 can be damaged if input voltage exceeds +2.0V on any ADC input. Normally we work around 0.6V point, but when the unit is not on the body, input can get anywhere. As soon as it exceeds approximately 1.2V, LED turns on, protecting the input and, at the same time, visually indicating that there is overload! And it actually works, when it's charging via usb, you really can turn it on by touching only one input! ))

  Are you sure? yes | no

Bud Bennett wrote 04/10/2019 at 00:48 point

Fair enough. I grok it now. There is a reason for everything in a schematic, if not entirely obvious. I'm an old school EE, so schematics should have wires connecting components instead of tags. It's easier for those not familiar with the design to understand what's going on. 

Thanks for the answers. Carry on. It obviously works.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates