NRF24L01 обьем передачи данных

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Доброго времени суток, спасибо что заглянули. Нуждаюсь в Вашей помощи и совету. 

 

Соираю для себя ссистему в котельную, но вот незадача. Нужно снимать показания с 14-ти датчиков DS18B20. Пытаюсь их передать через NFR24L01, как значения float, для того что бы были более точные значения, один - два знака после запятой. Но вот больше 9-ти значений не могу принять. начинается белиберда, а именно, на девятом огругляется число, после десятого идут нулевые значения... 

Передатчик:


#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <OneWire.h>  //библиотека работы шины для ds18b20.
#include <DallasTemperature.h> //библиотека для считывания температуры с ds18b20.
#include <dht11.h> //подключаем библиотеку DHT11.
dht11 DHT; //что то назначаем для DHT11.
#define DHT11_PIN 4 //указываем пин на который подключен датчик DHT11. 

const uint64_t pipe = 0xF0F1F2F3F4LL; //идентификатор передачи данных.
RF24 radio(9, 8); //указываем пины подключения передатчика.
OneWire  oneWire(2);  //указываем пины для подключения датчиков ds18b20.
DallasTemperature ds(&oneWire); //активируем библиотеку ds.

DeviceAddress sensor1 = {0x28, 0xFF, 0x90, 0x41, 0x81, 0x16, 0x3, 0xFD}; //адрес 1 датчика.
DeviceAddress sensor2 = {0x28, 0xFF, 0x7E, 0xA9, 0x83, 0x16, 0x3, 0x9F}; //адрес 2 датчика.
DeviceAddress sensor3 = {0x28, 0xFF, 0x70, 0xA9, 0x83, 0x16, 0x3, 0x3D}; //адрес 3 датчика.
DeviceAddress sensor4 = {0x28, 0xFF, 0x34, 0x58, 0x82, 0x16, 0x4, 0x1D}; //адрес 4 датчика.
DeviceAddress sensor5 = {0x28, 0xFF, 0x98, 0xEC, 0x81, 0x16, 0x3, 0xF7}; //адрес 5 датчика.
DeviceAddress sensor6 = {0x28, 0xFF, 0x83, 0x1B, 0x85, 0x16, 0x5, 0x4F}; //адрес 6 датчика.
//DeviceAddress sensor7 = {0x28, 0xFF, 0x90, 0x41, 0x81, 0x16, 0x3, 0xFD}; //адрес 7 датчика...
//DeviceAddress sensor8 = {0x28, 0xFF, 0x7E, 0xA9, 0x83, 0x16, 0x3, 0x9F}; //адрес 8 датчика...
//DeviceAddress sensor9 = {0x28, 0xFF, 0x70, 0xA9, 0x83, 0x16, 0x3, 0x3D}; //адрес 9 датчика...
//DeviceAddress sensor10 = {0x28, 0xFF, 0x34, 0x58, 0x82, 0x16, 0x4, 0x1D}; //адрес 10 датчика...
//DeviceAddress sensor11 = {0x28, 0xFF, 0x98, 0xEC, 0x81, 0x16, 0x3, 0xF7}; //адрес 11 датчика...
//DeviceAddress sensor12 = {0x28, 0xFF, 0x83, 0x1B, 0x85, 0x16, 0x5, 0x4F}; //адрес 12 датчика...




void setup(){
  Serial.begin(9600); //открываем пот обмена данными.
  ds.begin();  //запускаем функцию считывания температуры ds.
  radio.begin(); //делаем инициализацию.
  delay(2); //ждем реакции модуля передачи данных. 
  radio.setChannel(120); // канал для передачи данных (0-127).
  radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули.
  radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  
  radio.openWritingPipe(pipe); // открываем трубу на передачу.
} 


void loop(){  
  ds.requestTemperatures(); // считываем температуру с датчиков
  float chk; //создаем переменную для показаний с датчика DHT11.
  chk = DHT.read(DHT11_PIN);    // читаем данные с датчика DHT11.
  float data [14];  //создаем массив из 14-ти переменных. 
  data[0] = float(ds.getTempC(sensor1)); //присваиваем первому значению массива данные с sensor1 (за один раз можно отправить до 32 байт).
  data[1] = float(ds.getTempC(sensor2)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[2] = float(ds.getTempC(sensor3)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[3] = float(ds.getTempC(sensor4)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[4] = float(ds.getTempC(sensor5)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[5] = float(ds.getTempC(sensor6)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[6] = float(DHT.humidity); //присваиваем второму значению массива данные влажности с DHT11 (за один раз можно отправить до 32 байт).
  data[7] = float(DHT.temperature); //присваиваем второму значению массива данные температуры с DHT11 (за один раз можно отправить до 32 байт).
  data[8] = float(ds.getTempC(sensor1)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт)...
  data[9] = float(ds.getTempC(sensor2)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт)...
  data[10] = float(ds.getTempC(sensor3)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт)...
  data[11] = float(ds.getTempC(sensor4)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт)...
  data[12] = float(ds.getTempC(sensor5)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт)...
  data[13] = float(ds.getTempC(sensor6)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт)...
  
  radio.write(&data, sizeof(data)); // передаем массив и его размер. 
   Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[2]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[3]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[4]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[5]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[6]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[7]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[8]); //выводим данные в сериал порт для проверки...
   Serial.println(data[9]); //выводим данные в сериал порт для проверки...
   Serial.println(data[10]); //выводим данные в сериал порт для проверки...
   Serial.println(data[11]); //выводим данные в сериал порт для проверки...
   Serial.println(data[12]); //выводим данные в сериал порт для проверки...
   Serial.println(data[13]); //выводим данные в сериал порт для проверки...
   Serial.println(); //пробел.
   delay(500); //ждем пол секунды.  
} 

 

 

Приемник: 

#include <SPI.h> //библтотека для NRF24L01.
#include "nRF24L01.h" //библиотека для NRF24L01.
#include "RF24.h" //библиотека для NRF24L01.
#include <SoftwareSerial.h> //Подключения серийного порта ПК
#include <Nextion.h> //Подключем библиотеку для работы с дисплеем Nextion
#include <stDHT.h> //Подключаем библиотеку для работы с датчиками DHT11
   DHT sens(DHT11); //Указываем тип датчика DHT11 или DHT22
   SoftwareSerial nextion(6, 7);// Nextion TX на пин 6 (не подключен) и RX на пин 7.
   Nextion myNextion(nextion, 9600); //Скорость передачи данных на дисплей Nextion
   const uint64_t pipe01 = 0xF0F1F2F3F4LL; //первый идентификатор передачи данных (котельная).
   const uint64_t pipe02 = 0xF0F1F2F3F3LL; //второй идентификатор передачи данных (улица).
   //const uint64_t pipe03 = 0xF0F1F2F3F2LL; //второй идентификатор передачи данных (1-й эт.).
   //const uint64_t pipe04 = 0xF0F1F2F3F1LL; //второй идентификатор передачи данных (2-й э.).
   RF24 radio(9, 10); //указываем пины подключения передатчика.

int sensePin = A5; //Назначаем аналоговый пин 5 как вход датчика LED посветки.
int ledPin = A4; //Назанчаем аналоговый пин 4 как выход питания для LED подсветки. 

void setup() {
  myNextion.init(); // Для дисплея Nextion
  pinMode (8, INPUT); //Определяем пин как вход DHT
  digitalWrite(8, HIGH); //Подаем напряжение на датчик DHT
  Serial.begin(9600); //Скорость передачи данных
  analogReference(DEFAULT); 
  pinMode (ledPin, OUTPUT);


  radio.begin(); //делаем инициализацию.
  radio.setChannel(120); // канал для передачи данных (0-127).
  radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули.
  radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  
  radio.openReadingPipe(1,pipe01); //Открытие трубы на первый передатчик.
  radio.openReadingPipe(2,pipe02); //Открытие трубы на второй передатчик.
  //radio.openReadingPipe(3,pipe03); //Открытие трубы на второй передатчик.
  //radio.openReadingPipe(4,pipe04); //Открытие трубы на второй передатчик.
  radio.startListening(); //включаем приемник и начинаем слушать трубу. 
}

void loop(void) {

  int val = analogRead(sensePin); //Создаем переменную для датчика LED подсветки. 
  val = constrain(val, 50,700); //Обозначим границы показаний датчика LED подсветки. 
  int ledLevel = map(val, 50, 700, 255, 0); //Создаем интервал работы и и нтенсивность LED подсветки. 
  analogWrite(ledPin, ledLevel); //Прсваиваем зависимость показаний датчика и LED подсветки.

  ///////////////////////////прием данных от NRF24L01 в котельной////////////////////
 uint8_t pipeNum = 0;
  if (radio.available(&pipeNum)){ // проверяем не пришло ли чего в буфер.
    if(pipeNum == 1){
  float data [16];  //создаем массив из 14-ти переменных. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
  Serial.println("sensor1");
  Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor2");
  Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor3");
  Serial.println(data[2]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor4");
  Serial.println(data[3]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor5");
  Serial.println(data[4]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor6");
  Serial.println(data[5]); //выводим данные в сериал порт для проверки. 
  Serial.println("DHT11-%");
  Serial.println(data[6]-10.0); //выводим данные в сериал порт для проверки.
  Serial.println("DHT11-t");
  Serial.println(data[7]); //выводим данные в сериал порт для проверки.
  Serial.println(); //пробел.  
  Serial.println("sensor41");
  Serial.println(data[8]); //выводим данные в сериал порт для проверки.
  Serial.println("sensor42");
  Serial.println(data[9]); //выводим данные в сериал порт для проверки.
  //Serial.println("sensor43");
  //Serial.println(data[10]); //выводим данные в сериал порт для проверки.
  //  Serial.println("sensor44");
  //  Serial.println(data[11]); //выводим данные в сериал порт для проверки.
  //  Serial.println("sensor45");
  //  Serial.println(data[12]); //выводим данные в сериал порт для проверки.
  //  Serial.println("sensor46");
  //  Serial.println(data[13]); //выводим данные в сериал порт для проверки.
  //  Serial.println(); //пробел. 

  
  myNextion.setComponentText("t10", String(data[0])); //отправка данных на дисплей Nextion от датчика DS18B20-1
  delay(200);
  myNextion.setComponentText("t11", String(data[1])); //отправка данных на дисплей Nextion от датчика DS18B20-2
  delay(200);
  myNextion.setComponentText("t12", String(data[2])); //отправка данных на дисплей Nextion от датчика DS18B20-3
  delay(200);
  myNextion.setComponentText("t13", String(data[3])); //отправка данных на дисплей Nextion от датчика DS18B20-4
  delay(200);
  myNextion.setComponentText("t14", String(data[4])); //отправка данных на дисплей Nextion от датчика DS18B20-5
  delay(200);
  myNextion.setComponentText("t15", String(data[5])); //отправка данных на дисплей Nextion от датчика DS18B20-6
  delay(200);
  myNextion.setComponentText("t5",  String(data[6]-10.0)); //отправка данных на дисплей Nextion от датчика DHT3
  delay(200);
  myNextion.setComponentText("t4",  String(data[7])); //отправка данных на дисплей Nextion от датчика DHT3
  delay(200);
 myNextion.setComponentText("t41",  String(data[8])); //отправка данных на дисплей Nextion от датчика DHT3
 delay(200);
 myNextion.setComponentText("t42",  String(data[9])); //отправка данных на дисплей Nextion от датчика DHT3
 delay(200);
 //myNextion.setComponentText("t43",  String(data[10])); //отправка данных на дисплей Nextion от датчика DHT3
 //delay(200);
 //  myNextion.setComponentText("t44",  String(data[11])); //отправка данных на дисплей Nextion от датчика DHT3
 //  delay(200);
 //  myNextion.setComponentText("t45",  String(data[12])); //отправка данных на дисплей Nextion от датчика DHT3
 // delay(200);
 // myNextion.setComponentText("t46",  String(data[13])); //отправка данных на дисплей Nextion от датчика DHT3
 // delay(200);
  

  if (pipeNum !=2 & pipeNum !=3 &pipeNum !=4) {
  myNextion.setComponentText("t10", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-1
  myNextion.setComponentText("t11", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-2
  myNextion.setComponentText("t12", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-3
  myNextion.setComponentText("t13", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-4
  myNextion.setComponentText("t14", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-5
  myNextion.setComponentText("t15", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-6
  myNextion.setComponentText("t4",  String("NoSig")); //отправка данных на дисплей Nextion от датчика DHT3
  myNextion.setComponentText("t5",  String("NoSig")); //отправка данных на дисплей Nextion от датчика DHT3
 myNextion.setComponentText("t41", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-7
 myNextion.setComponentText("t42", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-7
 //myNextion.setComponentText("t43", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-7
 // myNextion.setComponentText("t44", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-7
 //  myNextion.setComponentText("t45", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-7
 // myNextion.setComponentText("t46", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-7
}
 }
  }
 
  
///////////////////////////прием данных от NRF24L01 на улице////////////////////
 if (radio.available(&pipeNum)){ // проверяем не пришло ли чего в буфер.
    if(pipeNum == 2){
  float data [2];  //создаем массив из 2-х переменных. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
  Serial.println("DHT11-2%");
  Serial.println(data[0]+10.0); //выводим данные в сериал порт для проверки. 
  Serial.println("DHT11-2C");
  Serial.println(data[1]+2.0); //выводим данные в сериал порт для проверки. 
  myNextion.setComponentText("t0", String(data[1]+2.0)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);
  myNextion.setComponentText("t1", String(data[0]+10.0)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);

  if (pipeNum !=1 & pipeNum !=3 &pipeNum !=4) {
  myNextion.setComponentText("t0", String("NoSig")); 
  myNextion.setComponentText("t1", String("NoSig"));
}
 }
  }
  

/*
///////////////////////////прием данных от NRF24L01 на 1-м эт. ////////////////////
 if (radio.available($pipeNum)){ // проверяем не пришло ли чего в буфер.
    if(pipeNum==3){
  float data [2];  //создаем массив из 2-х переменных. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
  Serial.println("DHT11-3%");
  Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
  Serial.println("DHT11-3C");
  Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
  myNextion.setComponentText("t6", String(data1)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);
  myNextion.setComponentText("t7", String(data0)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);
  
  if (pipeNum !=1 & pipeNum !=2 &pipeNum !=4) {
  myNextion.setComponentText("t6", String("NoSig")); 
  myNextion.setComponentText("t7", String("NoSig"));
}
 }
  }
*/

/*
///////////////////////////прием данных от NRF24L01 на 2-м эт. ////////////////////
 if (radio.available($pipeNum)){ // проверяем не пришло ли чего в буфер.
    if(pipeNum==4){
  float data [2];  //создаем массив из 2-х переменных. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
  Serial.println("DHT11-4%");
  Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
  Serial.println("DHT11-4C");
  Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
  myNextion.setComponentText("t8", String(data1)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);
  myNextion.setComponentText("t9", String(data0)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);

  if (pipeNum !=1 & pipeNum !=2 &pipeNum !=3) {
  myNextion.setComponentText("t8", String("NoSig")); 
  myNextion.setComponentText("t9", String("NoSig"));
}
 }
  }
*/

  

  float h1 = sens.readHumidity(8); //Присвоение значений температуры для DHT
  float t1 = sens.readTemperature(8); //Присвоение значений влажности для DHT
  myNextion.setComponentText("t2", String(t1)); //отправка данных на дисплей Nextion от датчика DHT2
//  delay(200);
  myNextion.setComponentText("t3", String(h1)); //отправка данных на дисплей Nextion от датчика DHT2
//  delay(200);
  Serial.println(t1);
  Serial.println(h1); 
 }

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Zombrero, Вы всерьез считаете, что если Вы преобразуете тип, то откуда-то появятся несуществующие знаки?

Далее, у Вас в комментариях к коду присутствует (притом, неоднократно) фраза "(за один раз можно отправить до 32 байт)." Как Вы это можете объяснить?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

отправляй несколько пачек и все

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

jeka_tm пишет:

отправляй несколько пачек и все

Как эти пачки упорядочить что бы небыло путаницы..?

evgeniy063
Offline
Зарегистрирован: 08.03.2017

А зачем отправлять float? Можно отправить int всего два байта на датчик.
int data[14];
data[0] = float(ds.getTempC(sensor1)) * 100;

В приемнике поделить на 100.
Serial.println((float)data[0]/100);

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

evgeniy063 пишет:

В приемнике поделить на 100.
Serial.println((float)data[0]/100);

Serial.println((float)data[0]/100.00, 2);

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Zombrero пишет:

jeka_tm пишет:

отправляй несколько пачек и все

Как эти пачки упорядочить что бы небыло путаницы..?

 0 байт адрес далее значения например 5шт.

будет 0 25,2 26,2 27,2 29,2 30,2

следующий 1 25,6 26,6 27,6 29,6 30,6

и можно легко понять где какое значение.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Еще веселее.  Передача пачками. 1 пакет от 1 датчика число = 0+ температура /2-ой пакет от 2 датчика число = 100+ температура /../     14 пакет от 14 датчика число = 1300+ температура  ну а дальше покругу. прием сотня это номер датчика а то что ниже и есть его показание.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Все круто, только на приемнике массив принимает в знаении int. Как его перевести в Float c двумя числами после запятой?

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Valera19701 пишет:

evgeniy063 пишет:

В приемнике поделить на 100.
Serial.println((float)data[0]/100);

Serial.println((float)data[0]/100.00, 2);

 

Могу принять массив только в таком виде: 

int data [14];  //создаем массив из 14-ти переменных. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
  Serial.println((float)data[0]/100.00, 2); //выводим данные в сериал порт для проверки. 
  Serial.println((float)data[1]/100.00, 2); //выводим данные в сериал порт для проверки. 
Но при этом все равно только целое число, без сотых...
Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

а так

Serial.println(data[0]/100.00, 2);

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Valera19701 пишет:

а так

Serial.println(data[0]/100.00, 2);

 

Получилось добиться в сериал хороших значений, спасибо, но вот теперь как бы это на дисплей отправить? видит как целое...

int data [14];  
  radio.read(&data, sizeof(data)); 
  Serial.println((float)data[0]/100); 
  Serial.println((float)data[1]/100); 
**************
myNextion.setComponentText("t10", String(data[0]/100)); //отправка данных на дисплей Nextion от датчика DS18B20-1
  delay(200); //выводит целое значение, без запятой
  myNextion.setComponentText("t11", String(float(data[1]/100))); //отправка данных на дисплей Nextion от датчика DS18B20-2
  delay(200); //выводит сотые значения, но после запятой два ноля
**************

 

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Valera19701 пишет:

а так

Serial.println(data[0]/100.00, 2);

 

Сорян. ДА! так работает вроде! СПАСИБО! 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Еще вопрос: сколько значений датчиков я таким образом могу передать. в теории?

evgeniy063
Offline
Зарегистрирован: 08.03.2017

16
Буфер приема/передачи 32 байта.

a5021
Offline
Зарегистрирован: 07.07.2013

В NRF24L01+ наличествуют три буффера, по 32 байта каждый. Можно пулять по одному, можно все три последовательно. Таким образом, максимальное число байт, выстреливаемых за один присест, равно 96.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

a5021 пишет:

В NRF24L01+ наличествуют три буффера, по 32 байта каждый. Можно пулять по одному, можно все три последовательно. Таким образом, максимальное число байт, выстреливаемых за один присест, равно 96.

Интересно. А как задействовать второй и третий? На будущее...

arDubino
Offline
Зарегистрирован: 12.01.2017

люди жгут :))) там у датчиков точность +-0.5гр а он хочет передавать сотые :))))))

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

arDubino пишет:

люди жгут :))) там у датчиков точность +-0.5гр а он хочет передавать сотые :))))))

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

arDubino пишет:

люди жгут :))) там у датчиков точность +-0.5гр а он хочет передавать сотые :))))))

Есть свои цели, не так важна точность, как интенсивность изменений, в сотых долях. Те датчики что у меня есть - показывают одно и то же, в разных условиях. И это гораздо точнее чем механические.

a5021
Offline
Зарегистрирован: 07.07.2013

Zombrero пишет:
a5021 пишет:

В NRF24L01+ наличествуют три буффера, по 32 байта каждый. Можно пулять по одному, можно все три последовательно. Таким образом, максимальное число байт, выстреливаемых за один присест, равно 96.

Интересно. А как задействовать второй и третий? На будущее...

Без правки библиотеки RF24, никак. Загрузкой данных в модуль и их отправкой занимается метод

void RF24::startWrite( const void* buf, uint8_t len )
{
  // Transmitter power-up
  write_register(CONFIG, ( read_register(CONFIG) | _BV(PWR_UP) ) & ~_BV(PRIM_RX) );
  delayMicroseconds(150);

  // Send the payload
  write_payload( buf, len );

  // Allons!
  ce(HIGH);
  delayMicroseconds(15);
  ce(LOW);
}

Функция write_payload заполняет только один буфер, а строки 11-13 формируют импульс на ноге CE модуля, запускающего передачу, опять же, только из одного буфера. Для того, чтобы заполнить все три буфера данными, функцию write_payload внутри startWrite надо вызывать, соответственно, трижды (разумеется, с разными параметрами), а передачу инициировать формированием импульса, высокое состояние будет длиться не 15 микросекунд, как в коде выше, а все время, пока модуль осуществляет передачу.

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

a5021 пишет:

Zombrero пишет:
a5021 пишет:

В NRF24L01+ наличествуют три буффера, по 32 байта каждый. Можно пулять по одному, можно все три последовательно. Таким образом, максимальное число байт, выстреливаемых за один присест, равно 96.

Интересно. А как задействовать второй и третий? На будущее...

Без правки библиотеки RF24, никак. Загрузкой данных в модуль и их отправкой занимается метод

void RF24::startWrite( const void* buf, uint8_t len )
{
  // Transmitter power-up
  write_register(CONFIG, ( read_register(CONFIG) | _BV(PWR_UP) ) & ~_BV(PRIM_RX) );
  delayMicroseconds(150);

  // Send the payload
  write_payload( buf, len );

  // Allons!
  ce(HIGH);
  delayMicroseconds(15);
  ce(LOW);
}

Функция write_payload заполняет только один буфер, а строки 11-13 формируют импульс на ноге CE модуля, запускающего передачу, опять же, только из одного буфера. Для того, чтобы заполнить все три буфера данными, функцию write_payload внутри startWrite надо вызывать, соответственно, трижды (разумеется, с разными параметрами), а передачу инициировать формированием импульса, высокое состояние будет длиться не 15 микросекунд, как в коде выше, а все время, пока модуль осуществляет передачу.

 

 

Спасибо большое, но простыми шагами добился чего хотел.