Визуализация пульса в реальном времени: LED-кольцо + ECG (uECG) + Arduino Nano
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| uECG (носимый ECG-сенсор) | 1 | Open-source, выдаёт цифровой импульс на каждом ударе |
| Arduino Nano R3 | 1 | Обработка импульсов и управление LED |
| Adafruit NeoPixel Ring (WS2812, 16 LED) | 1 | Цветовая индикация ЧСС |
| Li-Ion аккумулятор 1000 мАч | 1 | Питание всего устройства |
Инструменты
- Паяльная станция (рекомендуется пайка для надежности в носилке)
Идея
Давно хотел сделать гаджет, который мигает в такт сердцу — не только в покое, но и в движении. Обычный ECG-сигнал обрабатывать сложно, но uECG делает всю грязную работу: выдаёт чистый цифровой сигнал (пин DRV) — HIGH/LOW на каждом ударе. Остаётся только считать интервалы и красиво показать на LED-кольце.
UPD: Есть вторая итерация — с радиоканалом (nRF24), данные передаются на браслет.
Схема подключения

- DI (Data In) LED-кольца → D11 (настраивается в коде)
- DRV uECG → D3 (настраивается)
- Аккумулятор + → 5V Arduino, 5V LED-кольца
- Аккумулятор – → GND Arduino, GND кольца, GND uECG
Важно: LiPo подключается к 5V пину (не к Vin!). Стабилизатор на Vin даёт просадку напряжения, и Arduino станет нестабильной ниже 3.4 В. LiPo: 4.2 В (заряжен) → 3.4 В (15% заряда). При емкости >200 мАч — часы работы. Используйте разъём для зарядки!
Алгоритм (код)
- Считываем пин D3, фиксируем моменты переходов (front/back) в кольцевой буфер на
BEAT_HIST = 20ударов. - Средний интервал = (last - first) / 20 → BPM = 60000 / интервал.
- Меньше элементов — быстрее реакция, но больше шум. Больше — сглаженнее, но задержка.
- Цвет по BPM: синий (<90) → зелёный → жёлт → розовый → красный (>170). Шаг 20 уд/мин.
- Количество горящих LED: BPM/10 (60 уд/мин = 6 LED, 120 = 12).
- В диастолу (между ударами) яркость ¼ — удары заметны как вспышки.
Код (uECG_pixel_ring.ino)
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 11
#define NUMPIXELS 16
int in_pin = 3;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define BEAT_HIST 20
long beats[BEAT_HIST];
void push_beat(long ms) {
for (int x = 0; x < BEAT_HIST-1; x++) beats[x] = beats[x+1];
beats[BEAT_HIST-1] = ms;
}
int get_bpm() {
long dt = beats[BEAT_HIST-1] - beats[0];
return BEAT_HIST * 60000 / dt;
}
long last_pix_upd = 0;
int prev_in_state = 0;
void setup() {
pixels.begin();
pinMode(in_pin, INPUT);
digitalWrite(in_pin, 1); // PULLUP — критично, uECG не имеет своего
}
void loop() {
long ms = millis();
int in_state = digitalRead(in_pin); // 1 — нет удара, 0 — удар
if (in_state == 1 && prev_in_state == 0) push_beat(ms);
prev_in_state = in_state;
if (ms - last_pix_upd > 10) {
last_pix_upd = ms;
int bpm = get_bpm();
int max_bright = 120;
float dd = 20;
float t1 = 90, t2 = t1+dd, t3 = t2+dd, t4 = t3+dd;
int r, g, b;
if (bpm < t1) { r=0; g=0; b=max_bright; }
else if (bpm < t2) { r=0; g=max_bright*(bpm-t1)/dd; b=max_bright-g; }
else if (bpm < t3) { r=max_bright*(bpm-t2)/dd; g=max_bright-r; b=r/4; }
else if (bpm < t4) { r=max_bright; g=0; b=max_bright/2 - max_bright*(bpm-t3)/(2*dd); }
else { r=max_bright; g=0; b=0; }
if (in_state) { r*=0.25; g*=0.25; b*=0.25; }
int on_pixels = (bpm+5)/10;
for (int i=0; i
Сборка в носилке (wearable)
Arduino Nano идеально лезет внутрь кольца. Аккумулятор — рядом. uECG нагрудие — провод с разъёмом: сначала надеваете сенсор на грудь, потом футболку с электроникой, потом соединяете разъём. Иначе надеть нереально — проверено на себе! 😄



Полевые тесты
- Ходьба/стояние: ЧСС определяется идеально.
- Бег: Аккумулятор подпрыгивает на ECG-сенсоре — артефакты. Провод тянет сенсор — тоже артефакты. Пока не получилось заставить работать стабильно на бегу.
- Сам сенсор uECG (при другой крепежи) показывает верную ЧСС при беге (проверял через их приложение).
- LED на груди выглядит круто, но смотреть вниз неудобно. Следующая версия — браслет на запястье.
Ресурсы
- Проект uECG на Hackaday — PCB, логи, обсуждение.
- Вторая итерация (радио) — в профиле автора.
Производственный процесс
- Внешний дефибриллятор: история, дизайн и производство
- Валёк для теста: от этрусских истоков к современному мастерству
- Искусственное сердце: технологии, история и перспективы
- Искусственные клапаны сердца: типы, история и инновации будущего
- Управление светодиодом с PIR-датчиком движения на Raspberry Pi
- Мониторинг домашней температуры с панелью управления на Raspberry Pi
- Система удалённого мониторинга сердечного ритма с алертами AWS IoT
- Бесконтактный мониторинг сердечного ритма через умные колонки: Революционная система
- Графеновый электронный тату обеспечивает непрерывный точный мониторинг сердца длительные периоды
- Шарнирный (вилковый) узел / Knuckle Joint: конструкция, применение, расчёт, плюсы и минусы