Ошибка адаптации библиотеки STM к Arduino!(Для ЭКГ (BMD101))

#c #c #arduino #stm32 #lib

Вопрос:

Я перепробовал много способов получить сигнал ЭКГ, но в моем городе современные карты и чипы для ЭКГ нелегко доступны. Для этого я получил карту 4click от MikroElectronica. Библиотека, созданная MikroElectronica, не подходит для использования в Arduino. Но я работал над своим проектом 8 месяцев и написал весь свой код на Nano 33 BLE Sense. Поскольку я новичок в разработке программного обеспечения, мне было нелегко адаптировать библиотеку к Arduino. Библиотека MikroElectronica для 4click находится по ссылке.

https://github.com/MikroElektronika/ECG_4_click

Каталог заголовков, который я создал для Arduino, приведен ниже.

 #ifndef ekgg
#define ekgg

#include "Arduino.h"
#define T_ECG4_RETVAL     uint8_t

typedef void ( *T_ecg4_hdl )( uint8_t*, uint8_t*, uint8_t*, uint8_t* );

static T_ecg4_hdl  driver_hdl;
static T_ECG4_RETVAL  response_ready=0;

const uint8_t _ECG4_SYNC_BYTE                    = 0xAA;
const uint8_t _ECG4_EXCODE_BYTE                  = 0x55;
const uint8_t _ECG4_SIGNAL_QUALITY_CODE_BYTE     = 0x02;
const uint8_t _ECG4_HEART_RATE_CODE_BYTE         = 0x03;
const uint8_t _ECG4_RAW_DATA_CODE_BYTE           = 0x80;
const T_ECG4_RETVAL _ECG4_RESPONSE_READY         = 0x01;
const T_ECG4_RETVAL _ECG4_RESPONSE_NOT_READY     = 0x00;





void ecg4_response_handler_set( void ( *handler )( uint8_t*, uint8_t*, uint8_t*, uint8_t* ) )
{
    driver_hdl = handler;
    
}



T_ECG4_RETVAL ecg4_responseReady( void )
{
    if (response_ready)
    {
        response_ready = _ECG4_RESPONSE_NOT_READY;
        

        return _ECG4_RESPONSE_READY;
        
    }

    return _ECG4_RESPONSE_NOT_READY;
}

void ecg4_uart_isr( void )
{
    static uint8_t rx_buff[ 256 ];
    static uint8_t rx_cnt = 0;
    static uint8_t rx_idx;
    static uint8_t payload_size;
    static uint8_t row_check = 0;
    static uint8_t op_code;
    static uint8_t row_size;
    static uint8_t row_size_check;
    static uint8_t checksum = 0;
    static uint8_t row_cnt = 0;
    uint8_t rx_dat;

    rx_dat = Serial1.read();
    
    
    
    if ((rx_cnt == 0) amp;amp; (rx_dat != _ECG4_SYNC_BYTE))
    {
        rx_cnt = 0;
        
        return;
    }
    else if ((rx_cnt == 1) amp;amp; (rx_dat != _ECG4_SYNC_BYTE))
    {
        rx_cnt = 0;
        
        return;
    }
    else if (rx_cnt == 2)
    {
        payload_size = rx_dat;
        rx_cnt  ;
        row_check = 1;
        
        return;
    }
    else if (rx_cnt > 2)
    {
        if (rx_cnt - 3 < payload_size)
        {
            if (rx_dat == _ECG4_EXCODE_BYTE)
            {
                row_check = 1;
                checksum  = rx_dat;
                rx_cnt  ;
                
                return;
            }
            
            if (row_check == 1)
            {
                op_code = rx_dat;
                row_check = 0;
                checksum  = rx_dat;
                
                if ((op_code == _ECG4_SIGNAL_QUALITY_CODE_BYTE) || (op_code == _ECG4_HEART_RATE_CODE_BYTE))
                {
                    row_size = 1;
                    row_size_check = 0;
                }
                else if (op_code == _ECG4_RAW_DATA_CODE_BYTE)
                {
                    row_size_check = 1;
                }
                else
                {
                    rx_cnt = 0;
                    checksum = 0;
                    
                    return;
                }
                
                rx_idx = 0;
                rx_cnt  ;
                
                return;
            }
            
            if (row_size_check == 1)
            {
                row_size = rx_dat;
                row_size_check = 0;
                checksum  = rx_dat;
                rx_cnt  ;
                
                return;
            }
            
            if (rx_idx < row_size)
            {
                rx_buff[ rx_idx ] = rx_dat;
                rx_idx  ;
                checksum  = rx_dat;
                           
                if (rx_idx == row_size)
                {
                    driver_hdl( amp;op_code, amp;row_size, rx_buff, amp;row_cnt );
                    row_cnt  ;
                    row_check = 1;
                }
                
                rx_cnt  ;
                
                return;
            }
        }
        else
        {
            checksum = ~checksum;
            
            if (checksum == rx_dat)
            {
                response_ready = _ECG4_RESPONSE_READY;
                 
            }
            else
            {
                response_ready = _ECG4_RESPONSE_NOT_READY;
            }
            
            checksum = 0;
            row_cnt = 0;
            rx_cnt = 0;
            rx_idx = 0;
            
            return;
        }
    }
    
    rx_cnt  ;
}



#endif
 

и мой каталог run (.ino) находится ниже.

 #include "ekgg.h"



uint8_t response[ 256 ];
uint8_t row_counter;
uint32_t plot_x;
uint8_t row_size_cnt;
T_ECG4_RETVAL resp_ready;


void setup() {
 Serial1.begin(57600);
 while(!Serial1);
 Serial.begin(57600);
 while(!Serial);
 attachInterrupt( 1ul , ecg4_uart_isr , FALLING ); //1ul -> Nano 33 BLE Sense RX address.

 

}

void loop() {

  
  applicationTask();
  ecg4_response_handler_set( amp;makeResponse );

}

void makeResponse( uint8_t *opCode, uint8_t *rowSize, uint8_t *rxBuff, uint8_t *rowCnt )
{

    uint8_t idx_cnt;
    
    if (*rowCnt == 0)
    {
        row_size_cnt = 0;
    }
    
    response[ row_size_cnt ] = *opCode;
    response[ row_size_cnt   1 ] = *rowSize;

    for (idx_cnt = 0; idx_cnt < *rowSize; idx_cnt  )
    {
        response[ row_size_cnt   2   idx_cnt ] = rxBuff[ idx_cnt ];
    }
    
    row_size_cnt  = (*rowSize   2);
    row_counter = *rowCnt;
}

void applicationTask()
{
    resp_ready = ecg4_responseReady();
    
    if (resp_ready == _ECG4_RESPONSE_READY)
    {
        
        processResponse();
    }
   
}

void processResponse()
{
    uint8_t cnt;
    uint8_t idx_cnt;
    int16_t raw_data;
    
    idx_cnt = 0;
    
    for (cnt = 0; cnt <= row_counter; cnt  )
    {
        if (response[ idx_cnt ] == _ECG4_RAW_DATA_CODE_BYTE)
        {
        
            raw_data = response[ idx_cnt   2 ];
            raw_data <<= 8;
            raw_data |= response[ idx_cnt   3 ];
            plotData( raw_data );
        }
        /*
        if ((response[ idx_cnt ] == _ECG4_SIGNAL_QUALITY_CODE_BYTE) || (response[ idx_cnt ] == _ECG4_HEART_RATE_CODE_BYTE))
        {
            logData( response[ idx_cnt ], response[ idx_cnt   2 ] );
        }
        */
        
        idx_cnt  = (response[ idx_cnt   1 ]   2);
    }
}

void plotData( int16_t plot_data ){

  Serial.println(plot_data);
  delay(3);
 
}

void logData( uint8_t code_val, uint8_t data_val )
{
   

    if (code_val == _ECG4_SIGNAL_QUALITY_CODE_BYTE)
    {
        Serial.print( "** Signal Quality (0 - sensor off, 200 - sensor on) : ");
        Serial.println( data_val );
       
    }
    else if (code_val == _ECG4_HEART_RATE_CODE_BYTE)
    {
    
       Serial.print ( "** Real-time Heart Rate : " );
        Serial.println( data_val);
    }
}

 

This is the code I have prepared. I’m getting an output for this code, but only up to a point.

bmd101_output

bmd101_output2

I can see up to a point in my data on my serial plotter and after a certain point I can’t. I would be very grateful if you could provide information about this. We are a written way out. Thank you very much for your interest.