Отображение ЭКГ в реальном времени на OLED с Arduino UNO и uECG
Компоненты и материалы
| Arduino UNO | ×1 |
| Устройство uECG | ×1 |
| Модуль nRF24 (Generic) | ×1 |
| OLED-дисплей 0.96" 128x64 (SSD1306) | ×1 |
О проекте
Автор написал библиотеку uECG_library для упрощения работы с устройством uECG (беспроводной ЭКГ-монитор). Требуются также библиотеки RF24 и Adafruit_SSD1306.
Схема подключения
- nRF24: SPI (D13, D12, D11), CS — D10, CE — D9. Питание только 3.3В! Рекомендуется конденсатор 1–10 мкФ между 3.3В и GND.
- OLED: I2C (SDA — A4, SCL — A5), питание 5В. На большинстве модулей уже есть подтягивающие резисторы.
Код (пример из библиотеки)
#include <uECG.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int rf_cen = 9;
int rf_cs = 10;
void setup() {
Serial.begin(115200);
while(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
}
display.display(); delay(100);
uECG.begin(rf_cs, rf_cen); delay(100);
display.clearDisplay();
display.setTextSize(1); display.setTextColor(WHITE); display.cp437(true);
display.display(); delay(100);
}
uint32_t prev_data_count = 0, prev_displ = 0;
uint8_t ecg_screen[128];
int ecg_screen_len = 128;
float ecg_avg = 0, ecg_max = 1, ecg_min = -1;
int ecg_size = 40;
int displ_phase = 0;
void loop() {
uECG.run();
uint32_t data_count = uECG.getDataCount();
int new_data = data_count - prev_data_count;
prev_data_count = data_count;
if(new_data > 0) {
uint32_t ms = millis();
int16_t ecg_data[8];
uECG.getECG(ecg_data, new_data);
for(int x = 0; x < new_data; x++) Serial.println(ecg_data[x]);
// сдвиг буфера экрана
for(int x = new_data; x < ecg_screen_len; x++)
ecg_screen[x-new_data] = ecg_screen[x];
for(int x = 0; x < new_data; x++) {
ecg_avg *= 0.99; ecg_avg += 0.01*ecg_data[x];
ecg_max = ecg_max*0.995 + ecg_avg*0.005;
ecg_min = ecg_min*0.995 + ecg_avg*0.005;
if(ecg_data[x] > ecg_max) ecg_max = ecg_data[x];
if(ecg_data[x] < ecg_min) ecg_min = ecg_data[x];
int ecg_y = 63 - ecg_size*(ecg_data[x] - ecg_min) / (ecg_max - ecg_min + 1);
ecg_screen[ecg_screen_len-1-new_data+x] = ecg_y;
}
// обновление дисплея каждые 30 мс по фазам
if(ms - prev_displ > 30) {
prev_displ = ms;
if(displ_phase == 0) {
display.clearDisplay();
display.setCursor(0,0);
display.print("BPM: "); display.println(uECG.getBPM());
display.print("RR: "); display.println(uECG.getLastRR());
display.print("steps: "); display.print(uECG.getSteps());
// индикатор батареи
int batt_mv = uECG.getBattery();
int batt_perc = (batt_mv - 3300)/8;
batt_perc = constrain(batt_perc, 0, 100);
display.drawLine(110,0,127,0,WHITE);
display.drawLine(110,10,127,10,WHITE);
display.drawLine(110,0,110,10,WHITE);
display.drawLine(127,0,127,10,WHITE);
int bat_len = batt_perc / 6;
for(int x=1; x<10; x++) display.drawLine(110,x,110+bat_len,x,WHITE);
}
if(displ_phase == 1) {
for(int x=1; x
Обработка данных
Устройство uECG выдает: BPM, GSR, RR-интервалы, HRV (16 бинов), шаги, акселерометр (низкая частота — для поз). Сырые данные ЭКГ тоже доступны (с потерями пакетов, но пригодны для отображения). Библиотека делает работу надежной и простой.
Производственный процесс
- Maxim MAX86150: интегрированный модуль PPG и ECG для мобильного мониторинга здоровья
- Построение надёжного Temperature & Sensor API на Raspberry Pi с модулем GY‑91
- Начало работы с TJBot: сборка, настройка и голосовое управление ИИ-роботом
- Основы модулей Verilog: структура и синтаксис
- Мастерство параметров в Verilog: создание повторно используемых масштабируемых модулей
- Java 9 Module System: модули, link-time и кастомные runtime-образы
- Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
- Клеточный автомат «Жизнь» Конвея на Arduino Nano с OLED 128x64
- DIY-проект Arduino LCD: сборка с резисторами, кнопкой и дисплеем 16x2
- Урок Arduino для начинающих 01: Начало работы с первым проектом