Отправьте сигнал ЭКГ с помощью NRF24L01 с Arduino на Raspberry Pi 3.

Я использую nRF24L01 для отправки образцов ЭКГ с Arduino на Raspberry Pi, тип образца удваивается после шумоподавления, и я храню их в байте [8] для отправки образца 8 на 8. Когда я печатаю образец перед складированием, это показывает хорошие результаты, но если я печатаю данные, хранящиеся в байте, сигнал показывает много колебаний. В Raspberry Pi я могу правильно читать байтовые данные, например переданные, но если я отправлю их в векторе типа double или int при приеме (python), я не передам тот же самый передаваемый кадр.

#include <IIRFilter.h>
#include <FIRFilter.h>

#include <SPI.h> // Вызов библиотеки SPI
#include <nRF24L01.h> // Вызов библиотеки версий NRE
#include <RF24.h> // Заголовочный файл RF24

#define CE_PIN  9
#define CSN_PIN 10
const uint64_t pipe = 0xF0F0F0F0E1LL;
RF24 radio(CE_PIN, CSN_PIN);


const int ECG_samplefreq  = 200;//частота выборки
const int DC_offset = 511;


const double b_lp[] = {0.0026, 0.0155, 0.0388, 0.0517, 0.0388, 0.0155, 0.0026};
const double a_lp[] = {1.0000, -2.3797, 2.9104, -2.0551, 0.8779, -0.2099, 0.0218};


IIRFilter lp(b_lp, a_lp);
unsigned int i = 0;

void setup() {
  Serial.begin(9600);
  radio.begin();//Инициализация модуля NRF24L01
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(0x76);
  radio.openWritingPipe(pipe);// Для операции передачи необходимо OpenWritingPipe
  radio.enableDynamicPayloads();
  radio.powerUp();
  pinMode(7, INPUT); // Настройка обнаружения обрыва выводов LO +
  pinMode(8, INPUT); // Настройка обнаружения обрыва выводов LO -

}
void loop() {
  const static unsigned long ECG_interval  = round(1e6 / ECG_samplefreq);  //период выборки = 5000 мс => 200 выборок по 1 секунде
  static unsigned long ECG_prevmicros = micros();
  byte  s[8] = {0};

  if ((digitalRead(7) == 1) || (digitalRead(8) == 1)) {
    Serial.println('!');
  }

  else {
    for (int i = 0; i < 8; i++)
    {

      if (!Serial) {
        ECG_prevmicros = micros();
      }
      else if (micros() - ECG_prevmicros >= ECG_interval)
      {
        int value = analogRead(A5);
        double filtered = lp.filter( value - DC_offset);

        filtered = round( filtered + DC_offset);
        s[i] =  filtered
        Serial.println( s[i]);
        ECG_prevmicros += ECG_interval;

      }
    }
    radio.write(&s, sizeof(s) ); // отправка образца ЭКГ в реальном времени. 8 образец по передаче . 8 => 4 окт одного семпа = 32 окт по передаче.

  }
}

Проблема в том, что я поставил в s[i] двойное число из четырех октатов. Я ищу, как я могу отправить их без байтового массива и получить правильно. Очень благодарен за вашу помощь

, 👍0

Обсуждение

Я не гений математики, но когда я вас правильно понимаю, вы пытаетесь отправить 8 двойных значений как серию 8 x 8 байтов. Мой калькулятор сообщает мне, что результат равен 64, но вы можете передать только 32 байта одновременно, используя nRF24L01+. Поэтому, возможно, вам следует предоставить нам некоторый код и описать его функцию, чтобы мы могли понять вашу проблему и оказать некоторую помощь., @Kwasmich

Даже если ОП пытается отправить одно двойное значение на сообщение (8 x 8 байт), действительно ли нужна такая точность? Возможно, они смогут округлить двойные значения, чтобы уместить больше значений данных в 32-байтовый пакет данных. Покажите код и объясните немного больше, что происходит., @MichaelT


1 ответ


1

Я вижу множество ошибок в вашем коде:

  • radio.write(&s, sizeof(s)); делает не то, что вы думаете. Правильный оператор: radio.write(s, sizeof(s)); без амперсанда.
  • Вы используете double. Было бы предпочтительнее вообще не использовать числа с плавающей запятой.
  • Ваш s имеет тип byte. Таким образом, он содержит только 8 байт. Таким образом, ваши вычисления с плавающей запятой усекаются до диапазона [0, 255]. Судя по описанию вашей проблемы, я думаю, что это не то, чего вы пытаетесь достичь.
,

Да, ты прав. Я затерялся в хранилище в байтовой переменной s[8]; Я изменил тип семплов на int32_t; аналогично типу вектора эмиссии байтов для int32_t s[8]. проблема теперь на уровне малины получаю 32-битный список вместо 8 семплов int32_t, @Amina Elattaoui