Skip to content

About

Open-source Arduino Due wearable physiological pattern monitor — real-time PPG heart rate, SpO2, and ECG waveform display with RTC logging. Not a diagnostic device.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

3 Commits

Folders and files

Repository files navigation

HUMANIX HM-01 — Open-Source Vitals & Stress Monitor

An open, honest, handheld biomedical pattern monitor — real ECG, real PPG, real signal processing, zero fabricated readings.

Status License Platform Category


Project Overview

HUMANIX HM-01 is a handheld, open-source vitals-and-wellness instrument. It acquires a real single-lead ECG (electrocardiogram) waveform and a reflective PPG (photoplethysmogram) signal from a fingertip sensor, then derives heart rate (BPM), blood-oxygen saturation (SpO2), perfusion index (PI), heart-rate variability (HRV / RMSSD), and an experimental physiological stress indicator — all shown on a color TFT display through a themeable, joystick-and-button menu system.

Who it's for: Students, DIY electronics makers, hobbyists, embedded/electronics engineers, and STEM educators who want a complete, working reference for real biomedical signal acquisition — from raw ADC sample to on-screen vital sign.

What problem it solves: Commercial pulse-oximeter/ECG wellness devices are closed-source, sealed "black boxes" — nobody can see or learn from the signal processing inside them. Most open DIY sensor demos go the other way: a bare sensor and a serial-monitor printout, with none of the polish or honesty handling a real product needs. HM-01 is built to be both open and product-quality at once.

Important: HM-01 is a pattern monitor for education and personal wellness — not a diagnostic or medical device. None of its readings are clinically calibrated or validated, and none should be used to diagnose, monitor, or treat any medical condition.


Key Features

  • Real single-lead ECG acquisition (AD8232) with live scrolling waveform and leads-off (electrode contact) detection
  • Real PPG-based heart rate and SpO2 via MAX30102, with adaptive-threshold beat detection tuned for weak/inconsistent finger contact
  • Perfusion index (PI) and signal-quality indicators
  • ECG-derived heart-rate variability (HRV / RMSSD)
  • Experimental, wellness-only physiological stress indicator (never phrased as a diagnosis)
  • Ten-screen menu system: Clock, Main Menu, Health dashboard, live ECG, Vitals, Stress, Clock Style, Theme, Settings, About
  • Joystick + 3 fixed-role buttons (HOME / BACK / QUICK ACTION), fully debounced
  • Non-blocking, priority-based buzzer feedback (distinct tones for navigation, select, back, home, error, success)
  • Real-time clock (DS3231) for timestamped screens
  • Honesty-first firmware: never shows a stale or fabricated reading — degrades gracefully to "not enough signal yet" instead of guessing
  • Fully open firmware, wiring, and documentation — MIT licensed

Why This Project Exists

Makers and students who want to learn real biomedical signal acquisition have had two bad options: buy a sealed commercial device with no visibility into how it works, or start from a bare sensor breakout with no UI, no polish, and no working reference for the genuinely hard parts — adaptive beat detection, SpO2 calibration, honest "no reading yet" states, and non-blocking multi-input navigation.

HM-01 exists to close that gap: every signal-processing step — baseline wander removal, adaptive peak detection, ratio-of-ratios SpO2 estimation, RMSSD-based HRV — is implemented in plain, documented C++, in a device that still looks and feels like a finished commercial product.

Full engineering reasoning for every decision is in Documentation/HUMANIX_HM01_Master_Documentation.md.


Demo

Video walkthrough:

Watch the HUMANIX HM-01 build video

(Click the thumbnail above to watch on YouTube. Replace YOUR_VIDEO_ID_HERE in this README with your actual video link, and drop your thumbnail image into Images/Thumbnail/youtube_thumbnail.jpg — see the placeholder note in that folder.)

Live HEALTH screen (ECG + BPM + SpO2):

HUMANIX HM-01 HEALTH screen showing live ECG waveform, BPM and SpO2 HUMANIX HM-01 HEALTH screen alternate view

Hardware / build photos:

HUMANIX HM-01 finished enclosure, front view HUMANIX HM-01 enclosure open, internal wiring MAX30102 and AD8232 sensor closeup

(These three are placeholders — see Images/Hardware_Photos/PUT_YOUR_FILES_HERE.txt for the exact filenames to drop in. No README edits needed once added.)


Hardware Used

Component Purpose Reason Selected
Arduino Due (SAM3X8E) Main controller 12-bit ADC (vs. 10-bit on Uno/Mega) for better ECG/PPG resolution; native 3.3V I/O matches AD8232/MAX30102 without level shifting; native USB gives a second debug serial channel
2.4" TFT LCD, UNO-shield-compatible, 320×240 Primary display Direct shield-mount, widely available, well supported by MCUFRIEND_kbv + Adafruit GFX
AD8232 (single-lead ECG front-end) ECG waveform + leads-off detection Analog output + two digital leads-off pins in one small, well-documented breakout
MAX30102 PPG heart rate + SpO2 + perfusion index Single module provides both red and IR channels needed for HR and SpO2, avoiding separate emitter/photodiode wiring
DS3231 RTC (ZS-042 breakout) Real-time clock Cheap, accurate, widely available; timestamps the clock screen and future logged reports
Analog joystick + 3 pushbuttons Menu navigation Joystick handles all directional nav + SELECT; 3 fixed buttons give HOME/BACK/QUICK shortcuts without menu-hunting
Passive piezo buzzer Audio feedback Non-blocking manual square-wave driver (Due's tone() is unreliable on this board)

Full component-by-component reasoning (including alternatives rejected) is in the Master Documentation, Section 8.


Software

  • Programming Language: C++ (Arduino framework)
  • IDE: Arduino IDE
  • Firmware Version: Phase 1 — "2026 Modern" UI build (merged final UI build)
  • Libraries Required:
    • MCUFRIEND_kbv
    • Adafruit GFX Library
    • RTClib (by Adafruit)
    • SparkFun MAX3010x Pulse and Proximity Sensor Library

How It Works

HM-01's firmware is split into layers, each with one job:

HARDWARE LAYER   -> raw ECG / PPG / RTC acquisition
DATA LAYER       -> feature extraction (BPM, SpO2, HRV) from raw signals
VITALS LAYER     -> combines HR + SpO2 + PI + signal quality into one snapshot
STRESS LAYER     -> experimental wellness-only stress indicator
UI LAYER         -> screens, menu navigation, themes, audio feedback

A screen-drawing function never touches sensor hardware directly, and sensor code never touches the display — each layer can be understood, tested, or improved on its own.

The core rule enforced across every layer: the device never shows a reading it doesn't actually have. Heart rate and SpO2 stay hidden until enough consistent, physiologically plausible samples have been seen. If the RTC reports lost power, the time is treated as untrusted rather than silently reset. The experimental STRESS score is never phrased as a diagnosis.

For the full technical walkthrough (adaptive beat detection, two-phase DC tracking, SpO2 ratio-of-ratios estimation, etc.), see the Master Documentation, Sections 9.2–9.6.


Engineering Decisions

Why this hardware? The Arduino Due was chosen specifically for its 12-bit ADC and native 3.3V logic — both directly needed for clean ECG/PPG acquisition without extra level-shifting hardware. See Master Documentation Section 8.1.

Why this firmware architecture? A layered hardware → data → vitals/stress → UI structure was chosen so that every bug fix (LED-brightness ADC saturation, PPG warmup false-beats, display flicker) could be isolated and fixed without risking the rest of the system. See Master Documentation Section 9.1.

Why this manufacturing method? A hand-cut PVC sheet enclosure with spray-paint finish was chosen to match the tools actually available for this build and keep it reproducible by other makers without a 3D printer. See Master Documentation Section 12.

Why this user interface? A fixed 3-level navigation depth (Clock → Main Menu → feature screens) keeps the menu simple to reason about with no navigation stack needed, and non-blocking, priority-ranked buzzer tones keep feedback responsive without ever stalling sensor polling. See Master Documentation Sections 9.7 and 8.7.


Project Structure

HUMANIX-HM01/
├── Firmware/
│   └── HUMANIX_HM01/          # Complete Arduino sketch (.ino + all modules)
├── Hardware/
│   └── Wiring_Diagrams/       # Add your wiring diagram images here
├── Documentation/
│   ├── HUMANIX_HM01_Master_Documentation.md
│   └── HUMANIX_HM01_Project_Analysis_Report.md
├── Images/
│   ├── Screens/                # On-device screen captures (included)
│   ├── Hardware_Photos/        # Add your build photos here
│   └── Thumbnail/              # Add your YouTube thumbnail here
├── LICENSE
└── README.md

Installation

1. Hardware Setup

Wire the components per the diagrams in Hardware/Wiring_Diagrams/. Pin assignments (single source of truth): Firmware/HUMANIX_HM01/config.h.

Key wiring notes:

  • ECG (AD8232): OUTPUT → A8, LO+ → D38, LO− → D40
  • MAX30102 + DS3231 RTC share the I2C bus (SDA/SCL, pins 20/21 on the Due)
  • RTC breakout's onboard EEPROM address pad (A0) must be bridged to shift it to 0x56, avoiding a conflict with the MAX30102's fixed 0x57 address
  • Joystick: X → A9, Y → A10, Switch → D28
  • Buttons: HOME → D22, BACK → D24, QUICK → D26
  • Buzzer: D36 (active-low idle — HIGH = silent)

2. Software Setup

  1. Install the Arduino IDE.
  2. Install the Arduino SAM (Due) board package via Boards Manager.
  3. Install the required libraries listed above via Library Manager.

3. Uploading Firmware

  1. Open Firmware/HUMANIX_HM01/HUMANIX_HM01.ino in the Arduino IDE.
  2. Connect the Arduino Due via its Programming Port (not the Native/SERVICE port — uploading via the Native port can leave the board stuck in Bossa bootloader mode).
  3. Select Arduino Due (Programming Port) as the board.
  4. Upload.

Usage

  • Navigation: use the joystick to move through menus and SELECT (press) to confirm. Use HOME to return to the clock screen, BACK to go up one level, and QUICK for the fixed quick-action shortcut.
  • Taking a reading: open the HEALTH or VITALS screen and place a fingertip on the MAX30102 sensor; BPM/SpO2 appear once enough stable samples have been collected — this is intentional, not a lag bug (see the honesty rule above).
  • ECG: attach the AD8232 leads per standard single-lead placement; the leads-off indicator shows when electrode contact is lost.
  • Settings: sound on/off, clock format (12h/24h), and auto-return timeout are all adjustable from the Settings screen. Display brightness is intentionally shown as "N/A" — no PWM-controllable backlight pin is wired in this build, and the firmware does not fake a setting that wouldn't actually do anything.
  • Safety: this is a DIY educational/wellness device, not a medical device. Do not use it to diagnose, monitor, or treat any medical condition.

Testing

Current status: all features and functions confirmed working on assembled hardware — sensor acquisition, display rendering, input handling, audio feedback, and the full menu/screen system.

Testing performed:

  • Empirical measurement of MAX30102 IR values with and without a finger present, used to set the finger-detection threshold
  • Firmware brace/parenthesis balance verified via script prior to build
  • Manual verification of buzzer tone output (Due's tone() could not be trusted)

Known limitations:

  • SpO2 / Perfusion Index calibration is a standard first-order empirical fit common to MAX30102 reference designs, not a clinically validated per-device calibration
  • The STRESS indicator is explicitly experimental and wellness-only
  • No onboard battery fuel-gauge or charging-management circuit in this firmware build
  • Final on-body ECG validation test is a pending step, not yet performed

Future Improvements

Version 2:

  • SD card storage with unlimited stored reports and ECG waveform recording (independent SD wiring)
  • Speaker + custom sound clips and voice prompts
  • Additional clock styles (9 defined in firmware) and UI themes (5 defined in firmware) beyond the currently active "2026 Modern" theme
  • Improved UI animations
  • Rechargeable battery management
  • Touchscreen input

Version 3:

  • IoT connectivity for full data download and remote/telemedicine-style live data sharing
  • Larger full touchscreen display

Confirmed next step: BIO-ID / fingerprint sensor integration — part number, wiring, and a reference sketch are available and pending integration.

Full roadmap detail: Master Documentation, Section 17.


Contributing

This is an open-source Humanix Tech Lab project. Contributions, improvements, and forks are welcome — in particular:

  • Additional clock styles / UI themes (framework already exists in firmware)
  • SD card logging (v2.0 roadmap item)
  • Custom PCB layout to replace the current hand-wired build
  • Documentation improvements and translations

Please open an issue to discuss significant changes before submitting a pull request, and keep new code consistent with the existing layered architecture (hardware → data → vitals/stress → UI).


License

MIT License — see LICENSE.


Author

Humanix Tech Lab

Building open-source products that solve real-world problems and feel like commercial products.


Support

  • Bug reports and feature requests: GitHub Issues
  • Questions and general discussion: GitHub Discussions (enable on this repository to activate)
  • Email: Not Available

Acknowledgements


Designed & Developed by Humanix Tech Lab Building Open-Source Engineering Projects

About

Open-source Arduino Due wearable physiological pattern monitor — real-time PPG heart rate, SpO2, and ECG waveform display with RTC logging. Not a diagnostic device.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages