Передача температуры по НРФ

Тема в разделе "Arduino & Shields", создана пользователем MontiMonolitov, 26 янв 2018.

  1. MontiMonolitov

    MontiMonolitov Нерд

    Всем привет, может кто увидит ошибку, значение температуры не приходит на вторую ардуину, модули НРФ в тестовом режиме между собой общаются
    передатчик
    Код (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; // сбросили температуру
           
      }
     
     
     

    Вложения:

    • нрф.jpg
      нрф.jpg
      Размер файла:
      289,7 КБ
      Просмотров:
      744
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Попробуй уйти от float.
     
  3. b707

    b707 Гуру

    зачем вы в передатчике ждете приема "1" с приемника, прежде чем передавать? она у вас не приходит и поэтому температура не передается, имхо
    Сдеоайте для начала чистый передатчик, который только передает температуру, и чистый приемник, что только принимает. А всякие проверки и коды добавите потом.
     
  4. MontiMonolitov

    MontiMonolitov Нерд

    Чистый уже пробовал, все-равно нули
    Код (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);
       
      }
     
  5. b707

    b707 Гуру

    передатчик температуру в Сериал нормально выдает? А по радио - нули?

    Если "да" на оба вопроса - то залейте снова те примеры из библиотеки, которые, как вы говорите, работали.
    Если все ок - поменяйте в примерах тестовые данные на передачу температуры.
     
    Последнее редактирование: 27 янв 2018
    MontiMonolitov нравится это.
  6. MontiMonolitov

    MontiMonolitov Нерд

    Спасибо, с настройками от тестовых кодов все заработало
     
  7. MontiMonolitov

    MontiMonolitov Нерд

    вот только десятые и сотые не приходят
     

    Вложения:

    • темп.jpg
      темп.jpg
      Размер файла:
      280,5 КБ
      Просмотров:
      792
  8. b707

    b707 Гуру

    Скорее всего неправильно обращаетесь с float либо на приеме, либо при передаче. Выложите те скетчи приемника и передатчика. которые работают - посмотрим
     
  9. MontiMonolitov

    MontiMonolitov Нерд

    передатчик
    Код (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]);
    }
     
  10. b707

    b707 Гуру

    Вот так должна передаваться температура с десятыми, без влажности
    Передатчик
    Код (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]);
    }
     
    Vladis_a и MontiMonolitov нравится это.
  11. MontiMonolitov

    MontiMonolitov Нерд

    Да все верно, по отдельности получается уже экспериментировал, а вот чтоб и температуру и влажность с десятыми и сотыми (хотя это чисто для науки)
     
  12. b707

    b707 Гуру

    вот, держите, пробуйте.
    Правда не компилировал - не на чем
    передатчик
    Код (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);
    }
     
    DetSimen и MontiMonolitov нравится это.
  13. vector99

    vector99 Гик

    Код (C++):
    byte transmit_data[3]; // массив, хранящий передаваемые данные
    Массив может хранить данные типа byte,
    А ему скармливают данные типа float, вот данные после запятой и обрезаются
     
  14. MontiMonolitov

    MontiMonolitov Нерд

    Супер, спасибо, все работает