NRF24L01 обьем передачи данных
- Войдите на сайт для отправки комментариев
Втр, 04/04/2017 - 08:43
Доброго времени суток, спасибо что заглянули. Нуждаюсь в Вашей помощи и совету.
Соираю для себя ссистему в котельную, но вот незадача. Нужно снимать показания с 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); }
Zombrero, Вы всерьез считаете, что если Вы преобразуете тип, то откуда-то появятся несуществующие знаки?
Далее, у Вас в комментариях к коду присутствует (притом, неоднократно) фраза "(за один раз можно отправить до 32 байт)." Как Вы это можете объяснить?
отправляй несколько пачек и все
отправляй несколько пачек и все
Как эти пачки упорядочить что бы небыло путаницы..?
А зачем отправлять float? Можно отправить int всего два байта на датчик.
int data[14];
data[0] = float(ds.getTempC(sensor1)) * 100;
В приемнике поделить на 100.
Serial.println((float)data[0]/100);
В приемнике поделить на 100.
Serial.println((float)data[0]/100);
Serial.println((float)data[0]/100.00, 2);
отправляй несколько пачек и все
Как эти пачки упорядочить что бы небыло путаницы..?
0 байт адрес далее значения например 5шт.
будет 0 25,2 26,2 27,2 29,2 30,2
следующий 1 25,6 26,6 27,6 29,6 30,6
и можно легко понять где какое значение.
Еще веселее. Передача пачками. 1 пакет от 1 датчика число = 0+ температура /2-ой пакет от 2 датчика число = 100+ температура /../ 14 пакет от 14 датчика число = 1300+ температура ну а дальше покругу. прием сотня это номер датчика а то что ниже и есть его показание.
Все круто, только на приемнике массив принимает в знаении int. Как его перевести в Float c двумя числами после запятой?
В приемнике поделить на 100.
Serial.println((float)data[0]/100);
Serial.println((float)data[0]/100.00, 2);
Могу принять массив только в таком виде:
а так
Serial.println(data[0]/100.00, 2);
а так
Serial.println(data[0]/100.00, 2);
Получилось добиться в сериал хороших значений, спасибо, но вот теперь как бы это на дисплей отправить? видит как целое...
а так
Serial.println(data[0]/100.00, 2);
Сорян. ДА! так работает вроде! СПАСИБО!
Еще вопрос: сколько значений датчиков я таким образом могу передать. в теории?
16
Буфер приема/передачи 32 байта.
В NRF24L01+ наличествуют три буффера, по 32 байта каждый. Можно пулять по одному, можно все три последовательно. Таким образом, максимальное число байт, выстреливаемых за один присест, равно 96.
В NRF24L01+ наличествуют три буффера, по 32 байта каждый. Можно пулять по одному, можно все три последовательно. Таким образом, максимальное число байт, выстреливаемых за один присест, равно 96.
Интересно. А как задействовать второй и третий? На будущее...
люди жгут :))) там у датчиков точность +-0.5гр а он хочет передавать сотые :))))))
люди жгут :))) там у датчиков точность +-0.5гр а он хочет передавать сотые :))))))
люди жгут :))) там у датчиков точность +-0.5гр а он хочет передавать сотые :))))))
Есть свои цели, не так важна точность, как интенсивность изменений, в сотых долях. Те датчики что у меня есть - показывают одно и то же, в разных условиях. И это гораздо точнее чем механические.
В NRF24L01+ наличествуют три буффера, по 32 байта каждый. Можно пулять по одному, можно все три последовательно. Таким образом, максимальное число байт, выстреливаемых за один присест, равно 96.
Без правки библиотеки RF24, никак. Загрузкой данных в модуль и их отправкой занимается метод
Функция write_payload заполняет только один буфер, а строки 11-13 формируют импульс на ноге CE модуля, запускающего передачу, опять же, только из одного буфера. Для того, чтобы заполнить все три буфера данными, функцию write_payload внутри startWrite надо вызывать, соответственно, трижды (разумеется, с разными параметрами), а передачу инициировать формированием импульса, высокое состояние будет длиться не 15 микросекунд, как в коде выше, а все время, пока модуль осуществляет передачу.
В NRF24L01+ наличествуют три буффера, по 32 байта каждый. Можно пулять по одному, можно все три последовательно. Таким образом, максимальное число байт, выстреливаемых за один присест, равно 96.
Без правки библиотеки RF24, никак. Загрузкой данных в модуль и их отправкой занимается метод
Функция write_payload заполняет только один буфер, а строки 11-13 формируют импульс на ноге CE модуля, запускающего передачу, опять же, только из одного буфера. Для того, чтобы заполнить все три буфера данными, функцию write_payload внутри startWrite надо вызывать, соответственно, трижды (разумеется, с разными параметрами), а передачу инициировать формированием импульса, высокое состояние будет длиться не 15 микросекунд, как в коде выше, а все время, пока модуль осуществляет передачу.
Спасибо большое, но простыми шагами добился чего хотел.