Всем привет, может кто увидит ошибку, значение температуры не приходит на вторую ардуину, модули НРФ в тестовом режиме между собой общаются передатчик Код (C++): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Wire.h> #include "HTU21D.h" const uint64_t pipe = 0xF0F1F2F3F4LL; RF24 radio(3, 7); // CE, CSN HTU21D htu21d; void setup(){ Serial.begin(9600); Serial.println("HTU21D Example!"); Wire.begin(); Serial.println(htu21d.testConnection() ? "HTU21D connection successful" : "HTU21D connection failed"); radio.begin(); delay(500); radio.setChannel(60); // канал (0-127) radio.setDataRate(RF24_1MBPS); radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe" radio.startListening(); // включаем приемник, начинаем слушать трубу // radio.openWritingPipe(pipe); // открываем трубу на передачу. } void loop() { float humd = htu21d.getHumidity(); float temp = htu21d.getTemperature(); Serial.print("Temperature: "); Serial.print(temp); Serial.print("\t\tHumidity: "); Serial.println(humd); /////////////////////////////// if (radio.available()){ // проверяем не пришло ли чего в буфер. byte val; radio.read(&val, sizeof(val)); // читаем данные и указываем сколько байт читать if (val == 1){ // если пришло 1, radio.stopListening(); // останавливает приём (нужно перед началом передачи) //отправляем данные radio.openWritingPipe(pipe); // открываем трубу на передачу. radio.write(&temp, sizeof(temp)); ; // отправляем данные и указываем сколько байт пакет radio.startListening(); // включаем приемник, начинаем слушать трубу } } } приемник Код (C++): #include <SPI.h> #include <Wire.h> #include <RF24.h> #include <nRF24L01.h> RF24 radio(3, 7); // CE, CSN const uint64_t pipe01 = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба" float NRFtemperature = 0; void setup(){ Serial.begin(9600); Wire.begin(); radio.begin(); delay(500); radio.setPALevel(RF24_PA_HIGH); radio.setChannel(60); radio.setDataRate(RF24_1MBPS); radio.openReadingPipe(1,pipe01); radio.startListening(); } void loop(){ if (radio.available()){ radio.read(&NRFtemperature, sizeof(NRFtemperature)); } Serial.print("Temperature: "); Serial.println(NRFtemperature); byte val = 1; radio.stopListening(); // останавливает приём (нужно перед началом передачи) radio.openWritingPipe(pipe01); // открываем трубу на передачу. radio.write(&val, sizeof(val)); // отправляем val и указываем сколько байт пакет radio.startListening(); // включаем приемник, начинаем слушать трубу NRFtemperature = 0; // сбросили температуру }
зачем вы в передатчике ждете приема "1" с приемника, прежде чем передавать? она у вас не приходит и поэтому температура не передается, имхо Сдеоайте для начала чистый передатчик, который только передает температуру, и чистый приемник, что только принимает. А всякие проверки и коды добавите потом.
Чистый уже пробовал, все-равно нули Код (C++): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Wire.h> #include "HTU21D.h" const uint64_t pipe = 0xF0F1F2F3F4LL; RF24 radio(3, 7); // CE, CSN HTU21D htu21d; void setup(){ Serial.begin(9600); Serial.println("HTU21D Example!"); Wire.begin(); Serial.println(htu21d.testConnection() ? "HTU21D connection successful" : "HTU21D connection failed"); radio.begin(); delay(500); radio.setChannel(60); // канал (0-127) radio.setDataRate(RF24_1MBPS); radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1,pipe); // открываем первую трубу с индитификатором "pipe" radio.startListening(); // включаем приемник, начинаем слушать трубу // radio.openWritingPipe(pipe); // открываем трубу на передачу. } void loop() { float humd = htu21d.getHumidity(); float temp = htu21d.getTemperature(); Serial.print("Temperature: "); Serial.print(temp); Serial.print("\t\tHumidity: "); Serial.println(humd); radio.stopListening(); // останавливает приём (нужно перед началом передачи) //отправляем данные radio.openWritingPipe(pipe); // открываем трубу на передачу. radio.write(&temp, sizeof(temp)); ; // отправляем данные и указываем сколько байт пакет radio.startListening(); // включаем приемник, начинаем слушать трубу } Код (C++): #include <SPI.h> #include <Wire.h> #include <RF24.h> #include <nRF24L01.h> RF24 radio(3, 7); // CE, CSN const uint64_t pipe01 = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба" float NRFtemperature = 0; void setup(){ Serial.begin(9600); Wire.begin(); radio.begin(); delay(500); radio.setPALevel(RF24_PA_HIGH); radio.setChannel(60); radio.setDataRate(RF24_1MBPS); radio.openReadingPipe(1,pipe01); radio.startListening(); } void loop(){ if (radio.available()){ radio.read(&NRFtemperature, sizeof(NRFtemperature)); } Serial.print("Temperature: "); Serial.println(NRFtemperature); }
передатчик температуру в Сериал нормально выдает? А по радио - нули? Если "да" на оба вопроса - то залейте снова те примеры из библиотеки, которые, как вы говорите, работали. Если все ок - поменяйте в примерах тестовые данные на передачу температуры.
Скорее всего неправильно обращаетесь с float либо на приеме, либо при передаче. Выложите те скетчи приемника и передатчика. которые работают - посмотрим
передатчик Код (C++): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Wire.h> #include "HTU21D.h" RF24 radio(3, 7); // CE, CSN byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб byte transmit_data[3]; // массив, хранящий передаваемые данные byte latest_data[3]; // массив, хранящий последние переданные данные HTU21D htu21d; void setup(){ Serial.begin(9600); Serial.println("HTU21D Example!"); Wire.begin(); Serial.println(htu21d.testConnection() ? "HTU21D connection successful" : "HTU21D connection failed"); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } void loop() { float humd = htu21d.getHumidity(); float temp = htu21d.getTemperature(); transmit_data[0] = temp; // transmit_data[1] = humd; // Serial.print("Temperature: "); Serial.print(temp); Serial.print("\t\tHumidity: "); Serial.println(humd); radio.write(&transmit_data, sizeof(transmit_data)); // отправляем данные и указываем сколько байт пакет delay(2000); } приемник Код (C++): #include <Wire.h> #include <BMP085.h> #include <TFT.h> #include <SPI.h> #include <DS1302.h> #include <RF24.h> #include <nRF24L01.h> RF24 radio(3, 7); // CE, CSN byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб byte recieved_data[2]; // массив принятых данных void setup(){ Serial.begin(9600); Wire.begin(); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0,15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1,address[0]); //хотим слушать трубу 0 radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop(){ byte pipeNo; if (radio.available(&pipeNo)){ radio.read( &recieved_data, sizeof(recieved_data) ); } Serial.print("Temperature: "); Serial.print(recieved_data[0]); Serial.print("\t\tHumidity: "); Serial.println(recieved_data[1]); }
Вот так должна передаваться температура с десятыми, без влажности Передатчик Код (C++): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Wire.h> #include "HTU21D.h" RF24 radio(3, 7); // CE, CSN byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб byte transmit_data[3]; // массив, хранящий передаваемые данные byte latest_data[3]; // массив, хранящий последние переданные данные HTU21D htu21d; void setup(){ Serial.begin(9600); Serial.println("HTU21D Example!"); Wire.begin(); Serial.println(htu21d.testConnection() ? "HTU21D connection successful" : "HTU21D connection failed"); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } void loop() { float humd = htu21d.getHumidity(); float temp = htu21d.getTemperature(); transmit_data[0] = temp; // transmit_data[1] = humd; // Serial.print("Temperature: "); Serial.print(temp); Serial.print("\t\tHumidity: "); Serial.println(humd); radio.write(&temp, sizeof(temp)); // отправляем данные и указываем сколько байт пакет delay(2000); } приемник Код (C++): #include <Wire.h> #include <BMP085.h> #include <TFT.h> #include <SPI.h> #include <DS1302.h> #include <RF24.h> #include <nRF24L01.h> RF24 radio(3, 7); // CE, CSN byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб byte recieved_data[4]; // массив принятых данных void setup(){ Serial.begin(9600); Wire.begin(); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0,15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1,address[0]); //хотим слушать трубу 0 radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop(){ byte pipeNo; float temp; if (radio.available(&pipeNo)){ radio.read( &temp, sizeof(temp) ); } Serial.print("Temperature: "); Serial.print(temp); //Serial.print("\t\tHumidity: "); Serial.println(recieved_data[1]); }
Да все верно, по отдельности получается уже экспериментировал, а вот чтоб и температуру и влажность с десятыми и сотыми (хотя это чисто для науки)
вот, держите, пробуйте. Правда не компилировал - не на чем передатчик Код (C++): #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Wire.h> #include "HTU21D.h" RF24 radio(3, 7); // CE, CSN byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб byte transmit_data[3]; // массив, хранящий передаваемые данные byte latest_data[3]; // массив, хранящий последние переданные данные struct r_data { float temp; float humd; } dat; HTU21D htu21d; void setup(){ Serial.begin(9600); Serial.println("HTU21D Example!"); Wire.begin(); Serial.println(htu21d.testConnection() ? "HTU21D connection successful" : "HTU21D connection failed"); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.stopListening(); //не слушаем радиоэфир, мы передатчик } void loop() { dat.humd = htu21d.getHumidity(); dat.temp = htu21d.getTemperature(); Serial.print("Temperature: "); Serial.print(dat.temp); Serial.print("\t\tHumidity: "); Serial.println(dat.humd); radio.write(&dat, sizeof(dat)); // отправляем данные и указываем сколько байт пакет delay(2000); } приемник Код (C++): #include <Wire.h> #include <BMP085.h> #include <TFT.h> #include <SPI.h> #include <DS1302.h> #include <RF24.h> #include <nRF24L01.h> RF24 radio(3, 7); // CE, CSN byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб struct r_data { float temp; float humd; } dat; void setup(){ Serial.begin(9600); Wire.begin(); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0,15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1,address[0]); //хотим слушать трубу 0 radio.setChannel(0x60); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! //при самой низкой скорости имеем самую высокую чувствительность и дальность!! radio.powerUp(); //начать работу radio.startListening(); //начинаем слушать эфир, мы приёмный модуль } void loop(){ byte pipeNo; if (radio.available(&pipeNo)){ radio.read( &dat, sizeof(dat) ); } Serial.print("Temperature: "); Serial.print(dat.temp); Serial.print("\t\tHumidity: "); Serial.println(dat.humd); }
Код (C++): byte transmit_data[3]; // массив, хранящий передаваемые данные Массив может хранить данные типа byte, А ему скармливают данные типа float, вот данные после запятой и обрезаются