Несколько передатчиков и проблема с ref

На одной модели есть три Ардуино. Каждый из них оснащен датчиком температуры DS18B20 Dallas и антенной беспроводной связи nRF24L01. Существует также независимое устройство, состоящее из Arduino и антенны nRF24L01. Устройство действует как приемник. Arduino и антенна играют роль передатчика. Код таков:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>

int temp1;
int WindSpeed;
int temp2;
int temp3;
RF24 radio(7, 8);
const uint64_t pipes[3] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0E2LL, 0xF0F0F0F0E3LL};
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setRetries(15, 15);
  radio.setDataRate(RF24_250KBPS); 
  radio.openReadingPipe(0, pipes[1]);
  radio.openReadingPipe(1, pipes[2]);
  radio.openReadingPipe(2, pipes[3]);
  radio.startListening();
}

void loop() {
  if (radio.available()) {
    radio.read(&temp1, sizeof(temp1));  
     Serial.println("Temp1:");
     Serial.println(temp1);
     delay(50);
     radio.read(&WindSpeed, sizeof(WindSpeed));
     Serial.println(" WindSpeed Bf : ");
     Serial.println(WindSpeed);  
     delay(50);
     radio.read(&temp2, sizeof(temp2));
     Serial.println("temp2:");
     Serial.println(temp2);
     delay(50);
     radio.read(&temp3, sizeof(temp3));      
     Serial.println("temp3:");
     Serial.println(temp3);
     delay(50);
  } else {
    Serial.println("No radio Data avaliable");
  }
  delay(3000);
}

Проблема в том, что код отправляет некоторые значения, но в analogRead соответствие неверно. Как я могу наблюдать за каждой трубой с антенной соответствующего Arduino, чтобы получить правильные результаты, и каждый Arduino отправляет в приемник через свою собственную антенну значение своего датчика?

Спасибо всем за потраченное время!

, 👍1

Обсуждение

Я бы не стал посылать эти три значения датчиков в разных пакетах. Просто объедините их в один пакет. Поскольку в настоящее время вы полагаетесь на порядок пакетов, все будет испорчено, если один упакованный пакет не будет получен. Использование одного пакета предотвратит его проблему. Я не совсем понимаю ваш вопрос. Мне также не хватает кода Arduino отправителей., @Gerben

@Gerben данные поступают от трех различных радиопередатчиков, и вопрос, по-видимому, заключается в использовании функции множественных каналов радио, чтобы каналы были различны., @Chris Stratton


2 ответа


0

Вы хотите отправлять данные с 3 (или 4?) разных передатчиков Arduino на один приемник Arduino, и вы хотите иметь возможность различать пакеты, отправленные каждым передатчиком, по мере их получения. Самый простой способ-создать структуру для ваших данных и прикрепить уникальный заголовок и трейлер, которые можно использовать для идентификации отправителя.

typedef struct {
  uint8_t header = 0x01;
  int temp1;
  uint8_t trailer = 0x10;
} PACKET;

Что-то подобное должно присутствовать в каждом передатчике, но с уникальным заголовком и прицепом для каждого из них. Затем получатель должен иметь байты заголовка и трейлера для всех передатчиков, и всякий раз, когда он получает данные, он проверяет первый полученный байт по списку байтов заголовка, чтобы узнать, кто отправил данные, прежде чем продолжить. Наконец, он проверяет последний байт, чтобы узнать, является ли он правильным байтом трейлера для предполагаемого отправителя, а также в качестве дополнительного (но, возможно, ненужного) уровня обнаружения ошибок, чтобы узнать, является ли полученный пакет полностью допустимым.

,

Это будет работать в общем случае, но плакат, похоже, использует функцию nrf24l01 "трубы", чтобы сохранить их каналы уникальными. Поскольку у них есть это внеполосное различие, им не нужно реализовывать внутриполосное различие с идентификаторами в своих данных., @Chris Stratton

@ChrisStratton Я согласен. В этом нет необходимости, так как библиотека уже предоставляет удобный способ сделать это., @SoreDakeNoKoto

Фактические возможности исходят от радиоаппаратуры, библиотека просто раскрывает их., @Chris Stratton

@ChrisStratton Верно, но копаться в документах NRF24, чтобы найти это, а затем реализовать это было бы больно., @SoreDakeNoKoto


1

Похоже, вы используете несколько каналов nrf24L01, чтобы ваши каналы данных отличались друг от друга, и спрашиваете, как вы можете различать каналы при получении.

Неясно, какую именно библиотеку RF24 вы используете, но если вы посмотрите на заголовки типичной библиотеки, вы найдете что-то вроде:

  /**
   * Проверьте, есть ли доступные для чтения байты
   *
   * Используйте эту версию, чтобы узнать, на каком канале находится сообщение.
   * прибыл.
   *
   * @param[out] pipe_num Какой канал имеет доступную полезную нагрузку
   * @возвращает значение True, если имеется полезная нагрузка, и значение false, если ее нет
   */
  bool available(uint8_t* pipe_num);

Кроме того, вы не хотите использовать какие - либо задержки при получении кода, так как это может привести к пропуску передач-если вы используете задержки для ускорения, они должны быть на стороне передачи.

Неясно, есть ли у вас 3 или 4 канала (и в вашей настройке вы забыли, что индексация массивов C/C++ начинается с 0, а не с 1), но чтобы прочитать 3 из потенциально 4, вы могли бы сделать что-то вроде:

#define INTERVAL_MS 10000
unsigned long lastMsg = 0;
int values[4];
char *pipeNames[] = {"Temp1:", " WindSpeed Bf : ", "temp2:", "temp3"}; 
void loop() {
   uint8_t pipe;         
   if (radio.available(&pipe) {
     if (pipe < 3) {
        radio.read(&values[pipe], sizeof(int));
        Serial.println(pipeNames[pipe]);
        Serial.println(values[pipe]);
        lastMsg = millis();
     }
     else radio.flush_rx(); //unclear if this is needed to allow new data on a pipe that is of interest
   }
   /* warning - may mis-operate after ~50 days */
   if ((millis() - lastMsg) > INTERVAL_MS) {
      Serial.println("no data received in past 10 seconds");
      lastMsg = millis();
   }
}
,

Только два исправления: millis() является строчным, и из прототипа available() вы должны передать '&pipe', а не 'pipe', чтобы функция могла изменить его на канал с доступными данными. Так что нет необходимости в петле., @SoreDakeNoKoto

Спасибо! Привязка "Миллиса" казалась странной, когда я это делал, но так оно и есть в названии справочной страницы, но не для самой функции., @Chris Stratton