Отправьте сигнал ЭКГ с помощью 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] двойное число из четырех октатов. Я ищу, как я могу отправить их без байтового массива и получить правильно. Очень благодарен за вашу помощь
@Amina Elattaoui, 👍0
Обсуждение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
- Пустое значение не игнорируется, как должно быть.
- Как отправить данные датчика с Arduino через NRF24L01 на Raspberry Pi
- Проблема с NRF24L01
- Подключение Arduino Nano к Raspberry Pi Zero
- NRF24L01+ (библиотека TMRH20): Получатель получает пустые данные
- Как автоматически сбросить модуль NRF24L01
- Исключение в потоке "main" java.awt.AWTError: Can't connect to X11 window server using 'localhost:1.0' as the value of the DISPLAY variable
- nRF24L01 - Измерение расстояния по прошедшему времени
Я не гений математики, но когда я вас правильно понимаю, вы пытаетесь отправить 8 двойных значений как серию 8 x 8 байтов. Мой калькулятор сообщает мне, что результат равен 64, но вы можете передать только 32 байта одновременно, используя nRF24L01+. Поэтому, возможно, вам следует предоставить нам некоторый код и описать его функцию, чтобы мы могли понять вашу проблему и оказать некоторую помощь., @Kwasmich
Даже если ОП пытается отправить одно двойное значение на сообщение (8 x 8 байт), действительно ли нужна такая точность? Возможно, они смогут округлить двойные значения, чтобы уместить больше значений данных в 32-байтовый пакет данных. Покажите код и объясните немного больше, что происходит., @MichaelT