#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.
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.