logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Wzmacniacz pomiarowy AD8232 specjalizowany do EKG

TechEkspert 21 Sie 2025 09:17 1254 11

TL;DR

  • Sprawdzono moduł AD8232 jako specjalizowany wzmacniacz pomiarowy do rejestracji EKG, porównując go z wcześniejszym eksperymentem na AD620.
  • Układ wykorzystuje trzy odprowadzenia LA, RA i RL, a RL podaje sygnał kompensujący zakłócenia; na płytce są też filtry i wzmacnianie sygnału.
  • Moduł kosztuje około 20zł, a sygnał wyjściowy oscyluje względem 1,5-2V przy amplitudzie użytecznego sygnału około 400mV.
  • Rejestracja EKG jest nadal trudna, bo nawet niewielka praca mięśni powoduje przesunięcia składowej stałej o około 100mV, więc elektrody i izolacja są kluczowe.
Wygenerowane przez model językowy.
REKLAMA
📢 Słuchaj (AI):
  • Moduł AD8232 i ekran oscyloskopu zarejestrowanego sygnału EKG
    W materiale o wzmacniaczach pomiarowych udało się eksperymentalnie zarejestrować sygnał elektryczny generowany przez pracujące serce, został użyty moduł AD620. Dostępny jest układ AD8232 posiadający cechy ułatwiające rejestrowanie sygnału ECG. Poza odpowiednim wzmocnieniem, tłumieniem sygnałów wspólnych układ zawiera także filtry.

    Na początek ostrzeżenie: UWAGA !!! to nie jest urządzenie medyczne, nie powtarzajcie przedstawionych eksperymentów samodzielnie, bez wsparcia wykwalifikowanych osób oraz bezpiecznych warunków. Nieodpowiednie zasilanie i niewystarczająca izolacja od niebezpiecznych napięć może doprowadzić do śmiertelnego porażenia. Dlatego podczas prób zostało wykorzystane zasilanie bateryjne oraz oscyloskop z zasilaniem akumulatorowym. W obwodach nie występowały niebezpieczne napięcia a próby zostały przeprowadzone w bezpiecznych warunkach i przy udziale wykwalifikowanego personelu.

    Dlatego materiał warto potraktować jako informacje o możliwościach specjalizowanych wzmacniaczy pomiarowych. Moduł z AD8232 dostępny jest na Aliexpress w cenie około 20zł. Wiele lat temu widziałem projekt wzmacniacza ECG na kilku wzmacniaczach operacyjnych i rezystorach precyzyjnych. Wtedy był to układ dla mnie nieosiągalny i może to lepiej ze względów bezpieczeństwa, że nie próbowałem go wykonać. Zobaczmy co potrafi tani moduł ze specjalizowanym układem. W komplecie otrzymujemy przewody do odprowadzeń i elektrody samoprzylepne.

    Moduł AD8232 z trzema kablami i elektrodami samoprzylepnymi na białym tle


    Na płytce widoczne są punkty dla trzech odprowadzeń: LA - lewa ręka, RA - prawa ręka, RL - prawa noga.
    Wyprowadzenie RL dostarcza sygnału kompensującego zakłócenia.
    W moim egzemplarzu czerwony klips do elektrody samoprzylepnej to RA, zielony to LA, żółty to RL.

    Moduł AD8232 oraz ekran oscyloskopu z sygnałem EKG o częstotliwości 2 Hz


    Elektrody samoprzylepne posiadają naniesiony żel przewodzący ułatwiający kontakt ze skórą.

    Elektroda samoprzylepna do pomiaru EKG z widocznym złączem centralnym


    Praca układu widoczna jest na filmie poniżej dla różnych ustawień podstawy czasu oraz z widocznym LED na module sygnalizującym wykrywanie sygnału EKG.





    Niestety mimo zaawansowanego wzmacniacza AD8232 rejestrowanie sygnału EKG jest trudnym zadaniem. Sygnały elektryczne z mięśni mocno wpływają na rejestrowany sygnał na samoprzylepnych elektrodach. Odpowiednie elektrody to bardzo ważny element, ich stabilne mocowanie i dobry styk dobrze wpływa na stabilność sygnału z odprowadzeń. Sygnał wyjściowy oscyluje względem napięcia o wartości 1,5-2V.

    Wykres sygnału EKG z oscyloskopu z pikami zespołu QRS, skala napięcia 1 V/działkę.


    Amplituda sygnału użytecznego to około 400mV.

    Przebieg sygnału EKG widoczny na ekranie oscyloskopu z zaznaczonymi parametrami napięcia.


    Przy nawet niewielkiej pracy mięśni występują przesunięcia składowej stałej o około 100mV.

    Wykres sygnału EKG z oscyloskopu, żółta linia na ciemnym tle, podziałka 500 ms.


    Jeżeli mieliście możliwość zobaczyć efekty pracy aparatury medycznej rejestrującej ECG to można docenić jak dobrze zrealizowane są tam filtry i układy stabilizujące ślad na elektrokardiogramie. Muszą być to rozwiązania znacznie bardziej zaawansowane niż w AD8232 gdzie mamy dwie elektrody będące wejściem wzmacniacza pomiarowego i jedną elektrodę kompensującą zakłócenia. W sprzęcie medycznym stosowane są EKG 12-odprowadzeniowe, więc łatwo można ocenić różnicę między prostym układem testowanym w tym materiale a profesjonalnym sprzętem. Jeszcze bardziej złożone muszą być układy w EEG gdzie sygnały użyteczne mają mniejsze wartości niż w ECG a liczba odprowadzeń często jest znacznie większa. Można spodziewać się, że w obecnie dostępnym sprzęcie stosowane są specjalizowane wzmacniacze zintegrowane z ADC np. ADS1292, ADS1298, ADS1299.

    Fajne? Ranking DIY
    O autorze
    TechEkspert
    Redaktor
    Offline 
    W moich materiałach znajdziecie testy i prezentacje sprzętu elektronicznego, modułów, sprzętu pomiarowego, eksperymenty. Interesuje mnie elektronika cyfrowa, cyfrowe przetwarzanie sygnałów, transmisje cyfrowe przewodowe i bezprzewodowe, kryptografia, IT a szczególnie LAN/WAN i systemy przechowywania i przetwarzania danych.
    Specjalizuje się w: mikrokontrolery, rozwiązania it
    TechEkspert napisał 7172 postów o ocenie 5540, pomógł 16 razy. Jest z nami od 2014 roku.
  • REKLAMA
  • REKLAMA
  • #3 21640882
    TechEkspert
    Redaktor
    Posty: 7172
    Pomógł: 16
    Ocena: 5540
    Widziałem produkty https://aspel.com.pl/ dostarczają miniaturowe i energooszczędne holtery. Podejrzewam, że takie konstrukcje są możliwe właśnie dzięki zintegrowaniu wielokanałowych wzmacniaczy EKG z przetwornikami ADC 24b. Filtrowanie odbywa się w dużej mierze w dziedzinie cyfrowej, analiza zapisu również jest zautomatyzowana. Co do EEG na polskich producentów nie trafiłem.
  • #4 21640895
    pixel7
    Poziom 24  
    Posty: 656
    Pomógł: 53
    Ocena: 160
    Parę lat temu zacząłem budować mini EKG z tym układem. Niestety nie udało mi dokończyć projektu (praca zawodowa...).
    Ale powstał działający prototyp, więc pozwolę go sobie pokrótce tu opisać.
    Całość oparta o ESP32 na płytce lolin lite, ad8232, akcelerometr MPU6050, lcd sed1306, akumulator.
    Urządzenie jest wielkości pudełka zapałek, odczytuje przebieg EKG, oraz położenie, które miało być dodatkową informacją o dynamice badanego.
    EKG w gabinecie to tzw spoczynkowe a mi zależało na porównaniu w zależności od ruchu. Jest ikona pokazująca pozycję badanego, oczywiście pod warunkiem odpowiedniego ułożenia na ciele. Podczas pracy zbiera dane i potrafi komunikować się przez bluetooth. Miała być apka, trochę zacząłem w pythonie nawet.
    W dalszych pracach miała być zaimplementowana sieć neuronowa w ESP32 do analizy przebiegu w locie. Jeden z moich projektów ma taką sieć do klasyfikacji ciągów Luna, miała być przebudowana pod to.
    Załączam film, kilka zdjęć i kod do ESP32, zaznaczam że to bardzo wczesna wersja i ze sporą ilością błędów (ale działa).
    Schematu nie mam, lutowałem z głowy pajęczyną, bez dedykowanej płytki. Po prostu złożona kanapka z modułów. Obudowa drukowana, projekt własny.





    Prototyp miniaturowego EKG z ekranem OLED i obudową wydrukowaną 3D

    Małe czarne urządzenie prototypowe z ekranem OLED obok zapalniczki Spark

    Prototyp urządzenia wielkości zapalniczki, z widocznym akumulatorem w czarnej obudowie.

    Małe czarne urządzenie z ekranem OLED pokazującym dane EKG i ikonę leżącej postaci

    A tak wygląda odebrany przez bluetooth sygnał w trakcie pracy, z próbą wyznaczania załamków, (wyróżnia się załamki P, Q, R, S, T i U).
    Wykres sygnału EKG z zaznaczonymi punktami załamków R i S

    Kiedyś pracowałem w szpitalu, miałem okazję się sporo napatrzyć, tym bardziej, że komunikowałem te urządzenia sieciowo (stacjonarne EKG), zbierając z nich masę danych do różnych baz.
    Nadmienię że celem nie było stworzenie "prawdziwego" EKG a raczej powiadamiacz o ewentualnych zagrożeniach. Tzw holtery, które są najczęściej używane służą jedynie do akwizycji danych, bez jednoczesnej analizy. Oczywiście nie chodzi mi o realną diagnozę, lecz zasygnalizowanie nieprawidłowości wykrytych na przebiegu, a nawet wysłanie natychmiast powiadomienia do kogoś, można dodać np modem GSM itp.
    NIE JEST TO ABSOLUTNIE URZĄDZENIE MEDYCZNE!

    
    #include "BluetoothSerial.h"
    #include "time.h"
    #include <Wire.h>
    #include <Adafruit_MPU6050.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    
    #include "soc/timer_group_struct.h"
    #include "soc/timer_group_reg.h"
    
    //______________________________________________________________________________
    #define LED_PIN 22
    #define LOPLUS_PIN 33
    #define LOMINUS_PIN 32
    #define ECG_PIN A0
    #define BATTERY_PIN A3
    
    #define ECGLEN 500
    #define ECGINTERVAL 4
    
    //______________________________________________________________________________
    BluetoothSerial ESP_BT;
    Adafruit_MPU6050 mpu;
    Adafruit_SSD1306 display(128, 64, &Wire, -1);
    TaskHandle_t taskcheckEcg = NULL;
    
    int BT_connected = false;
    
    ulong ecgMillis = 0;
    int connected = 0;
    int lominus = 1;
    int loplus = 1;
    
    int chartData[ECGLEN];
    int chartMax = 0;
    int chartMin = 0;
    int samplesSum = 0; 
    int SamplesCount = 0;
    
    ulong batteryMillis = 88000;
    int batteryPercentage = 0;
    int batterySum = 0;
    int batteryCount = 0;
    
    ulong bpmMillis = 1000;
    int bpmValue = 0;
    int bpmDirection = 0;
    int bmpCount = 0;
    
    /*
    RED     RA   negativ   -IN LO-
    YELLOW  LA   positive  +IN LO+
    GREEN   RL
    */
    
    const unsigned char iconStanding [] PROGMEM = {
    // 'ludek', 17x48px
    0x03, 0xe0, 0x00, 0x07, 0xf0, 0x00, 0x0f, 0xf8, 0x00, 0x0f, 0xf8, 0x00, 0x0f, 0xf8, 0x00, 0x0f, 
    0xf8, 0x00, 0x07, 0xf0, 0x00, 0x03, 0xe0, 0x00, 0x3f, 0xfe, 0x00, 0x7f, 0xff, 0x00, 0xff, 0xff, 
    0x80, 0xff, 0xff, 0x80, 0xff, 0xff, 0x80, 0xff, 0xff, 0x80, 0xef, 0xfb, 0x80, 0xef, 0xfb, 0x80, 
    0xef, 0xfb, 0x80, 0xef, 0xfb, 0x80, 0xef, 0xfb, 0x80, 0xef, 0xfb, 0x80, 0xef, 0xfb, 0x80, 0xef, 
    0xfb, 0x80, 0xef, 0xfb, 0x80, 0xef, 0xfb, 0x80, 0xef, 0xfb, 0x80, 0xef, 0xfb, 0x80, 0x6f, 0xfb, 
    0x00, 0x0f, 0xf8, 0x00, 0x0f, 0xf8, 0x00, 0x0f, 0xf8, 0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 
    0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 0x0f, 
    0x78, 0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 
    0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 0x0f, 0x78, 0x00, 0x06, 0x30, 0x00
    };
    
    const unsigned char iconLay[] PROGMEM = {
    // 'ludek2', 48x24px
    0x00, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x00, 0x00, 
    0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 
    0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 
    0x00, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x00, 0x00, 0x38, 0x00, 
    0x3f, 0xe0, 0x00, 0x00, 0xfc, 0x00, 0x7f, 0xf0, 0x00, 0x01, 0xfe, 0x00, 0xff, 0xf0, 0x00, 0x03, 
    0xff, 0x01, 0xff, 0xf8, 0x00, 0x07, 0xff, 0x83, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xc7, 0xff, 0xfc, 
    0x00, 0x1f, 0xef, 0xef, 0xff, 0xfe, 0x00, 0x3f, 0xc7, 0xff, 0xfe, 0x3e, 0x00, 0x7f, 0x07, 0xff, 
    0xfc, 0x1f, 0x00, 0xfe, 0x03, 0xff, 0xf8, 0x0f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfc
    };
    
    const unsigned char iconHeart[] PROGMEM = {
      // 'heart', 32x32px
    0x1f, 0xfc, 0x1f, 0xf0, 0x3f, 0xfe, 0x3f, 0xfc, 0x7f, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 
    0x7f, 0xbf, 0xfe, 0xff, 0xfe, 0x0f, 0xf8, 0x1f, 0xfc, 0x07, 0xf0, 0x0f, 0xf8, 0x07, 0xf0, 0x07, 
    0xf0, 0x03, 0xe0, 0x07, 0xf0, 0x01, 0xc0, 0x07, 0xf8, 0x01, 0xc0, 0x07, 0xf8, 0x00, 0x80, 0x0f, 
    0xf8, 0x00, 0x00, 0x0f, 0xfc, 0x00, 0x00, 0x0f, 0x7e, 0x00, 0x00, 0x1f, 0x7e, 0x00, 0x00, 0x1f, 
    0x3f, 0x00, 0x00, 0x3f, 0x3f, 0x80, 0x00, 0x7e, 0x1f, 0x80, 0x00, 0xfe, 0x1f, 0xc0, 0x01, 0xfc, 
    0x0f, 0xe0, 0x03, 0xf8, 0x07, 0xf0, 0x07, 0xf0, 0x03, 0xf8, 0x0f, 0xe0, 0x01, 0xfc, 0x1f, 0xe0, 
    0x00, 0xfe, 0x3f, 0x80, 0x00, 0x7f, 0x7f, 0x80, 0x00, 0x3f, 0xfe, 0x00, 0x00, 0x1f, 0xfe, 0x00, 
    0x00, 0x0f, 0xfc, 0x00, 0x00, 0x07, 0xf8, 0x00, 0x00, 0x03, 0xe0, 0x00, 0x00, 0x01, 0xc0, 0x00
    };
    
    void wdt_reset()
    {
      TIMERG0.wdt_wprotect=TIMG_WDT_WKEY_VALUE;
      TIMERG0.wdt_feed=1;
      TIMERG0.wdt_wprotect=0;
    }
    
    //______________________________________________________________________________
    void callback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
    {
      if(event == ESP_SPP_SRV_OPEN_EVT)
      {
        Serial.println("Client Connected");
        digitalWrite(LED_PIN, HIGH);
        BT_connected = true;
      }
    
      if(event == ESP_SPP_CLOSE_EVT)
      {
        Serial.println("Client disconnected");
        digitalWrite(LED_PIN, LOW);
        BT_connected = false;
      }
    }
    
    void checkBattery()
    {
      batterySum += analogRead(BATTERY_PIN);
      batteryCount += 1;
      ulong actMillis = millis();
      if (actMillis > batteryMillis + 60 * 1000)
      { 
        float voltage_value = (batterySum/batteryCount) / 221.86;
        batteryPercentage = ((voltage_value - 2.9)/1.3) * 100;
        if (batteryPercentage > 100) batteryPercentage = 100;
        batteryMillis = actMillis;
        batterySum = 0;
        batteryCount = 0; 
      }
    }
    
    //______________________________________________________________________________
    void displayHeader()
    {
      display.setCursor(0, 0);
      display.setTextSize(1);
      display.setTextColor(WHITE);
      display.print("LunaECG         ");
      display.print(batteryPercentage, 1);
      display.print("%");
      display.setCursor(0, 54);  //66X54
      display.print("by pixel7");
    }
    
    void displayNoConnected()
    {
      display.setCursor(0, 9);
      display.setTextSize(2);
      display.setTextColor(WHITE);
    
      switch (connected)
      {
        case 1:
          display.println(" RED PAD");
        break;
        case 2:
          display.println("GREEN PAD");
        break;
        case 3:
          display.println("YELLOW PAD");
        break;
      }
      
      display.println("    NOT");
      display.println(" CONNECTED");
    }
    
    void displayMPUdata()
    {
      sensors_event_t a, g, temp;
      mpu.getEvent(&a, &g, &temp);
      
    
      if (a.acceleration.x > 6)
      {
        //lezy
        display.drawBitmap(65, 27, iconLay, 48, 24, WHITE);
      }
      else
      {
        display.drawBitmap(80, 15, iconStanding, 17, 48, WHITE);
      }
      
      
      // display.setCursor(60, 11);
      // display.print("x: ");
      // display.print(a.acceleration.x, 1);
      // display.setCursor(60, 22);
      // display.print("y: ");
      // display.println(a.acceleration.y, 1);
      // display.setCursor(60, 33);
      // display.print("z: ");
      // display.println(a.acceleration.z, 1);
      
      // display.println("Gyro - rps");
      // display.print(g.gyro.x, 1);
      // display.print(", ");
      // display.print(g.gyro.y, 1);
      // display.print(", ");
      // display.print(g.gyro.z, 1);
      // display.println("");
    }
    
    void displayChart(int width)
    { 
      int temp = chartMax - chartMin;
      
      if (temp ==  0) temp = 63;
      temp = 64 / temp;
      if (temp ==  0) temp = 63;
    
      if (400 < chartMin && chartMin < 1250 && 2000 < chartMax && chartMax < 2450)
      {
      //górne 2000 do 2300
      //dolne 700 min 950 max
        for(int x =0; x< width; x++)
        {
          int y = 64- ((chartData[x]-chartMin)/temp) - 11;
          
          if (y < 11)
          {
            display.drawPixel(x, 11, BLACK);
          }
          else
          { 
            display.drawPixel(x, y, WHITE);
          }
        }
      }
      else
      {
        //display.drawBitmap(16, 20, iconHeart, 32, 32, WHITE);
      }
    
      display.setCursor(0, 20);
      display.println(chartMax);
      display.println(chartMin);
      display.println(chartMax - chartMin);
      display.println(chartData[0]);
      
      display.setCursor(60, 0);
      display.print(bpmValue);
      display.print("bpm");
    
    }
    
    void displaySplash()
    {
      display.clearDisplay();
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(20, 0);
      display.print("LunaECG");
      display.display(); 
      delay(100);
      display.startscrollright(0x00, 0x0F);
      delay(200);
      display.stopscroll();
      delay(1000);
      display.clearDisplay();
    }
    
    void displayFrame()
    {
      display.clearDisplay();
      checkBattery();
      displayHeader();
      
      if(connected == 0)
      {
        displayChart(55);
        displayMPUdata();
      }
      else
      {
        displayNoConnected();
      }
    
      display.display();
    }
    
    //______________________________________________________________________________
    void checkBMP(int samp, int actMillis)
    {
      if (samp < 1300 && bpmDirection == 0)
      {
        bpmDirection = 1;
        int temp = 60000 / (actMillis - bpmMillis);
        if (temp < 220 && temp > 30) bpmValue = temp;
        bpmMillis = actMillis;
      }
    
      if (samp > 1600 && bpmDirection == 1)
      {
        bpmDirection = 0;
      }
    }
    
    void checkEcg(void * parameter)
    {
      for(;;)
      {
        lominus = digitalRead(LOMINUS_PIN);
        loplus = digitalRead(LOPLUS_PIN);
        if((lominus == 0)||(loplus == 0))
        {
          int ecgAnalogRead = analogRead(ECG_PIN);
          samplesSum += ecgAnalogRead;
          SamplesCount += 1;
          
          ulong actMillis = millis();
          if (actMillis > ecgMillis + ECGINTERVAL)
          {
            chartMax = 0;
            chartMin = 10000;
    
            ecgMillis = actMillis;
            for (int i = 0; i < (ECGLEN-1); i++)
            {
              int temp = chartData[i+1];
              chartData[i] = temp;
              if(temp > chartMax)chartMax = temp;
              if(temp < chartMin)chartMin = temp;
            }
    
            int samp = samplesSum/SamplesCount;
            chartData[ECGLEN-1] = samp;
            
            if (BT_connected)
            {
              ESP_BT.println(samp);
            }
            
            Serial.println(samp);
            
            checkBMP(samp, actMillis);
    
            
            connected = 0;
            samplesSum = 0;
            SamplesCount = 0;
          }
        }
        else
        {
          if (lominus == 1 && loplus == 0) connected = 1;
          if (lominus == 0 && loplus == 1) connected = 2;
          if (lominus == 1 && loplus == 1) connected = 3;
        }
      }
    }
    
    //______________________________________________________________________________
    void setup() 
    {
      pinMode(LED_PIN, OUTPUT);
      pinMode(LOPLUS_PIN, INPUT); 
      pinMode(LOMINUS_PIN, INPUT); 
    
      Serial.begin(115200);
      
      Wire.begin(23,19);
      if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C, false, false)) 
        Serial.println(F("SSD1306 allocation failed"));
      
      displaySplash();
      
      ESP_BT.register_callback(callback);
      if(!ESP_BT.begin("Luna_ECG")) 
        Serial.println("An error occurred initializing Bluetooth");
    
      if (!mpu.begin()) 
        Serial.println("Sensor init failed");
      
      xTaskCreatePinnedToCore(checkEcg, "checkEcg", 10000, NULL, 1, &taskcheckEcg, 0);
    
    }
    
    void loop() 
    {
      displayFrame();
      wdt_reset();
    }
    
  • REKLAMA
  • #5 21640924
    TechEkspert
    Redaktor
    Posty: 7172
    Pomógł: 16
    Ocena: 5540
    Wow, super to wygląda, myślę, że warto umieścić w wolnej chwili opis do DIY w budowie: https://www.elektroda.pl/rtvforum/forum492.html
    Może kiedyś trafi do DIY dokończone :)

    Jakie elektrody wykorzystałeś?

    Zauważyłem, że te elektrody z żelem działają jak ogniwo elektrochemiczne i generują potencjał kilkadziesiąt-kilkaset mV, nie wiem czy to zamierzony efekt czy uboczny.
  • REKLAMA
  • #6 21641941
    krzbor
    Poziom 29  
    Posty: 1757
    Pomógł: 41
    Ocena: 1064
    A co powiecie o czymś takim Link Ocena 4,9 przy 54 recenzjach.
  • #7 21642604
    TechEkspert
    Redaktor
    Posty: 7172
    Pomógł: 16
    Ocena: 5540
    Dużym plusem jest zasilanie bateryjne i połączenie bezprzewodowe, to zapewnia bezpieczeństwo.
    Natomiast patrząc na efekty uzyskane na elektrodach samoprzylepnych, trudno mi uwierzyć, że na takim urządzeniu będzie można dokładnie zobaczyć wszystkie załamki EKG, Q i R pewnie tak ale P, S, T trudno powiedzieć. Kto wie, bez sprawdzenia możemy tylko się domyślać.
  • #8 21652915
    _ACeK_
    Poziom 15  
    Posty: 164
    Pomógł: 6
    Ocena: 194
    :) Też kupiłem taki zestaw kilka lat temu. Do tej pory nie rozpakowany :evil:

    Zestaw do EKG w oryginalnym opakowaniu z kablami, elektrodami i płytką PCB

    TechEkspert napisał:
    …Wiele lat temu widziałem projekt wzmacniacza ECG na kilku wzmacniaczach operacyjnych i rezystorach precyzyjnych. Wtedy był to układ dla mnie nieosiągalny…


    Pewnie masz na myśli ten :arrow: AVT2475, który ukazał się w EdW 🧐

    Schemat układu EKG z barierą galwaniczną i układami optoelektronicznymi

    Tu schemat oryginalny ⬆️

    Schemat elektryczny wzmacniacza sygnału EKG z izolacją galwaniczną.

    Dla ułatwienia analizy z dwoma CNY17 ⬆️

    Schemat układu EKG z barierą galwaniczną opartą na IL300 i wzmacniaczach TL064 oraz TL062

    Tylko z IL300 ⬆️

    📘 Opis jest bardzo wyczerpujący, dzięki czemu można dokładnie poznać tajniki EKG. Od dawna chciałem go zrobić, nawet już mam IL300, zamiast baterii 9V użyć ogniw z elektrycznych papierosów, a jako elektrody użyć miedziane monety.

    Dwie baterie litowe, układ IL300-C i dwie miedziane monety na kolorowym tle

    Schemat ideowy prostego układu do pomiaru sygnału EKG z izolacją galwaniczną Sprawy bezpieczeństwa są bardzo istotne. Układ zasilany jest bateryjnie 18V, które jest bezpieczne dla organizmu. Dzieki barieręze galwanicznej, nie ma fizycznego połączenia z siecią energetyczną. Same sondy mają dużą rezystancję wejściową. Wiadomo, że na zimne trzeba dmuchać :evil:
    Załączniki:
    • AVT2475.pdf (476.9 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #9 21653410
    pixel7
    Poziom 24  
    Posty: 656
    Pomógł: 53
    Ocena: 160
    TechEkspert napisał:
    Jakie elektrody wykorzystałeś?

    Zwykłe, żelowe, ale nie mierzyłem ich wpływu. Zazwyczaj nie staram się o laboratoryjną dokładność w moich urządzeniach bo mają pracować w realnych warunkach, a program ma umieć sobie z tym radzić.
    Co do DIY to chyba zbyt niedopracowany projekt, ale skoro wrócił na biurko to może pochyle się nad jego kontynuacją i wtedy zaprezentuje.
    krzbor napisał:
    A co powiecie o czymś takim Link Ocena 4,9 przy 54 recenzjach.

    Jeśli działa i jest zgodny z opisem to pewnie da się nim coś mierzyć. Ale mam obawy co do kontaktu elektrod ze skórą, muszą być pewnie umieszczone.
    Poza tym oferty już nie ma, więc prawdopodobnie użytkownicy zweryfikowali.
    _ACeK_ napisał:
    Sprawy bezpieczeństwa są bardzo istotne. Układ zasilany jest bateryjnie 18V, które jest bezpieczne dla organizmu.

    W moim przypadku max to 4,2V. Ewentualnie podczas ładowania, ale przecież nikt nie boi się używać podłączonego telefonu, ze słuchawkami na kablu w uszach...
  • #10 21653507
    TechEkspert
    Redaktor
    Posty: 7172
    Pomógł: 16
    Ocena: 5540
    @_ACeK_ tak! to prawdopodobnie ten układ, chociaż zapamiętałem go jako bardziej złożony i z większą ilością wzmacniaczy operacyjnych.

    @pixel7 byłoby super gdyby udało się zaprezentować w DIY, bardzo kompaktowa konstrukcja powstała.
  • #11 21653595
    _ACeK_
    Poziom 15  
    Posty: 164
    Pomógł: 6
    Ocena: 194
    🙂 Układ wydaje się prostszy, bo więcej wiedzy w głowie 🤣 Mnie powrót do opamps ułatwił Bob DuHamel swoją serią na YouTube ⬇️



    🤔 Gdzie przyklejacie elektrody, jak robicie pomiary :?:

    Ilustracje pokazujące sposób zakładania czujnika Polar H7 na klatkę piersiową

    Do biegania mam czujnik Polara H7 na pasku zakładany na klatkę piersiową. Zalecane jest polanie wodą styków na elektrodach 😊 Zasilany jest baterią CR2025 3V 😎
    Załączniki:
    • Polar_H7_Heart_Rate_Sensor_accessory_manual_English.pdf (2.13 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #12 21653795
    TechEkspert
    Redaktor
    Posty: 7172
    Pomógł: 16
    Ocena: 5540
    Użyłem odprowadzeń LA - lewa ręka, RA - prawa ręka, RL - prawa noga. Jednak do mobilnego pomiaru opaska wydaje się znacznie lepsza.

    W profesjonalnym sprzęcie medycznym elektrody EKG pozwalają także na monitorowanie oddechu (zmiana objętości płuc zmienia impedancję między elektrodami).
📢 Słuchaj (AI):

Podsumowanie tematu

✨ Dyskusja dotyczy zastosowania wzmacniacza pomiarowego AD8232 do rejestracji sygnału EKG, z uwzględnieniem bezpieczeństwa eksperymentów (zasilanie bateryjne, izolacja). Poruszono porównanie z modułem AD620 oraz nowoczesnymi rozwiązaniami, takimi jak holtery oparte na układzie ADS1298 i procesorze MSP430. Wspomniano polskich producentów miniaturowych, energooszczędnych holterów, wykorzystujących wielokanałowe wzmacniacze EKG i 24-bitowe przetworniki ADC z cyfrowym filtrowaniem i automatyczną analizą. Jeden z uczestników opisał prototyp przenośnego EKG opartego na ESP32, AD8232, akcelerometrze MPU6050 i wyświetlaczu OLED SSD1306, z komunikacją Bluetooth i planami implementacji sieci neuronowej do analizy sygnału. Dyskutowano o typach elektrod (żelowe, samoprzylepne, miedziane monety) oraz ich wpływie na sygnał, a także o bezpieczeństwie i jakości pomiarów. Wspomniano zestaw AVT2475 z EdW jako przykład DIY zasilanego bateryjnie i wyposażonego w izolację optyczną (CNY17, IL300). Poruszono też temat czujników sportowych, np. Polar H7, zasilanych baterią CR2025. Ogólnie podkreślono znaczenie bezpiecznego zasilania, odpowiedniego umiejscowienia elektrod oraz możliwości cyfrowej obróbki sygnału w nowoczesnych urządzeniach EKG.
Wygenerowane przez model językowy.
REKLAMA