nRF24L01+ : побеждаем модуль.

Тема в разделе "Проводная и беспроводная связь", создана пользователем ИгорьК, 19 июн 2014.

  1. parovoZZ

    parovoZZ Гуру

    зачем это делать?
     
  2. Un_ka

    Un_ka Гуру

    Проверить, что китайцы наворотили и узнать какие пины как CE и CSN указывать в коде.
     
  3. parovoZZ

    parovoZZ Гуру

    а схема на что?
     
  4. Un_ka

    Un_ka Гуру

    Если есть схема этого чуда, то это другое дело.
     
  5. Андрей01

    Андрей01 Нерд

    Сегодня побеждал модуль нрф, без внешней антенны один показал - мертвый, второй живой. Поменял местами и чудо, мертвый нрф заработал!. А Алекс Гайвер был неправ, глючат контакты между блоком питания нрф и самой платой. Только паять!! Платы отмыть!! у китайцев она была в разводах.
     
  6. Андрей01

    Андрей01 Нерд

  7. Андрей01

    Андрей01 Нерд

    Алекс сказал, что где rx недолжно быть нолей. А тут ноли и 70 Это цифра!!, у всех там стоит буквенно числовой номер. В самом низу, мощность сигнала (фиг). Это сразу говорит о проблеме с модулем. Но не о смерти его.
     
    Последнее редактирование: 5 дек 2020
  8. Un_ka

    Un_ka Гуру

    Вы шапку темы почитайте. Люди конкретно с модулем разбирались.
     
  9. parovoZZ

    parovoZZ Гуру

    nRF не измеряет мощность сигнала. Не умеет.
     
  10. parovoZZ

    parovoZZ Гуру

    это не буквенно-числовой номер, а адрес. Он же преамбула. Правила создания адреса есть в даташите на микросхему.
     
  11. Андрей01

    Андрей01 Нерд

    Вот все такие умные, представьте новичка, послушал человека на ютубе и купил, воткнул и ОПА, попадос. Куда новичок пойдёт? Ну на сайт смотреть как победить. И какого года данные он получит? Тут тема с (тема в разделе "Проводная и беспроводная связь", создана пользователем ИгорьК, 20 июн 2014)!! Это Вам гуру понятно.

    Для новичка в шилдах это просто набор цифр. А то, что это недолжно быть просто цифрами а адресом, новичок может не догнать.
     
  12. RealArty

    RealArty Нерд

    Подскажите специалисты. У меня шесть датчиков (передатчиков) на arduino nano и один приемник на arduino mega, все работает уже год на ура. Решил приемник заменить на ESP8266 чтоб сбрасывать данные в народный мониторинг, данные (массив) приемник на ESP получает уверенно но они искажены (попросту лабуда из цифр) не могу разобраться в чем причина.

    Код (C++):
    //приемник на wemos
    #include <SPI.h>                                                          // подключаем библиотеку для работы с SPI
    #include <RF24.h>                                                         // подключаем библиотеку для работы с RF24 приемо-передатчиками
    #include <RF24Network.h>                                                  // подключаем библиотеку для работы с RF24 сетью

    RF24 radio(4, 15);                                                        // инициализация радио nRF24L01 (+) подключено к SPI  мега CE 48 . CSN 49
    RF24Network network(radio);                                               // сеть использует это радио
    const uint16_t this_ID = 02;                                              // адрес нашего узла

    int data = 0;                                                             // прием массива данных радио RF24

    float  ID_00_KR_TMP = 0;                                                  // переменная датчика температуры
       int ID_00_KR_VL = 0;                                                   // переменная датчика влажности
       int ID_00_KR_ATDV = 0;                                                 // переменная датчика атмосферного давления

    void setup(void)
    {
      Serial.begin(9600);
      Serial.println("ID_02_ST_TFT");
      SPI.begin();                                                            // инициализация SPI порта
      radio.begin();                                                          // инициализация RF24 радио
      network.begin(/*channel*/ 90, /*node address*/ this_ID);                // инициализация радио сети

    }

    void loop(void){

       network.update();                                       // нужно постоянно запускать, чтобы транслировались данные между узлами
         
       int data[13]={};                                        // массив принимаемых данных состоит из 13 данных информации
     
       while ( network.available() )  {                        // если пришли данные - то    
       RF24NetworkHeader header;                               // если это так, взять и в сериал
       network.read(header,&data,sizeof(data));                // читаем данные

    //   Serial.print(Data);
       ID_00_KR_TMP = data[1];
       ID_00_KR_VL = data[2];
       ID_00_KR_ATDV = data[3];  
       
       Serial.print("ID_00_KR  ID-0"); Serial.print(data[0]);
       Serial.print(" Temp-");         Serial.print(ID_00_KR_TMP/100);
       Serial.print(" Vl-");           Serial.print(ID_00_KR_VL);
       Serial.print(" ATM-");          Serial.print(ID_00_KR_ATDV);
       Serial.println(" ");
     
         }
    }

    Код (C++):
    //передатчик
    //==== MASTER == ID_00_KR (коридор) передаем данные на ID_02_ST (монитор вывода информации)==================================
    #include <SPI.h>
    #include <Wire.h>
    #include <RF24.h>                                                    // Подключаем библиотеку RF24
    #include <RF24Network.h>                                             // Подключаем библиотеку RF24Network
    #include <Adafruit_Sensor.h>                                         // Подключаем библиотеку Adafruit_Sensor
    #include <Adafruit_BME280.h>                                         // Подключаем библиотеку Adafruit_BME280
    #define SEALEVELPRESSURE_HPA (1013.25)                               // Задаем высоту    
    Adafruit_BME280 bme;                                                 // подключаем датчик на SDA SCL (pro mini - A4 и A5)

    RF24 radio(9, 10);                                                   // радио nRF24L01 (+) подключено к SPI и контактам 9 и 10
    RF24Network network(radio);                                          // сеть использует это радио
    const uint16_t this_ID = 0;                                          // адрес нашего узла
    const uint16_t other_ID = 02;                                        // адрес другого узла
    const unsigned long interval = 15000; //ms (15сек)                   // как часто отправлять данные на другой блок
    unsigned long last_sent;                                             // когда мы в последний раз посылали?

    float TMP;                                                           // применяем - темп.коридор
    int VL;                                                              // применяем - влажность коридор
    int ATDV;                                                            // применяем - атмосферное давление
    int K_TMP = -2.3;                                                    // корректировка температуры
    int K_VL = 1;                                                        // корректировка влажности
    int K_ATDV = 0;                                                      // корректировка атм.давления

    void setup(void)
    {
      Serial.begin(57600);
      Serial.println("ID_00_KR");
      SPI.begin();
      radio.begin();                                                    // инициализация nRF24L01
      network.begin(/*channel*/ 90, /*node address*/ this_ID);          // определяем канал и свой адрес

      bme.begin(0x76);                                                  // инициализация BME280
    }

    void loop(void)
    {
      network.update();                                                 // нужно постоянно запускать, чтобы транслировались
                                                                        // данные между узлами

      unsigned long now = millis();                                     // если пришло время отправить сообщение, отправьте его!
      if ( now - last_sent > interval  )
      {
        last_sent = now;
    //==== данные с датчика BME280 =======================================
        TMP = (bme.readTemperature() + K_TMP);                          // темп.           + корректировка в корпусе
        VL = (bme.readHumidity() + K_VL);                               // влажность       + корректировка в корпусе
        ATDV = bme.readPressure() / 133.0F + K_ATDV ;                   // атмосф.давление + корректировка в корпусе
    //==== отладочные данные в серийный порт =============================
        Serial.print("ID_00_KR - Temp-");
        Serial.print(TMP);
        Serial.print("  Vl-");
        Serial.print(VL);
        Serial.print("  ATDV-");
        Serial.print(ATDV);
        Serial.print("Sending...");
    //==== создаем массив данных =========================================
    int Data[13];                                                       // массив  данных состоящий из 13 значений - максимально можно 16 значений(32 байта) - int(2 байта)
        Data[0] = this_ID;                                              // this_ID - ID устройства отправителя
        Data[1] = TMP * 100;                                            // TMP -  температура
        Data[2] = VL;                                                   // VL -  влажность
        Data[3] = ATDV;                                                 // ATDV -  атмосф.давление
        Data[4] = 0;                                                    // UT_GAZ - утечка газа
        Data[5] = 0;                                                    // UT_VOD - утечка вода
        Data[6] = 0;                                                    // ROL - ролшторы
        Data[7] = 0;                                                    // SV - свет
        Data[8] = 0;                                                    // TV - телевизор
        Data[9] = 0;                                                    // RAD - радио
        Data[10] = 0;                                                   // BAT - температура батареи отопления
        Data[11] = 0;                                                   // резерв
        Data[12] = 0;                                                   // резерв
           
        RF24NetworkHeader header(/*to node*/ other_ID);                 // тут указываем на какое устройство отправляем данные
        bool ok = network.write(header, &Data, sizeof(Data));           // отправляем массив данных, функция возвращает статус
        if (ok)                                                         // смотрим на статус и отписываемся в Serial
          Serial.println("ok.");
        else
          Serial.println("failed.");
      }
    }
     
  13. Un_ka

    Un_ka Гуру

    Мне кажется это больше вопрос к esp. Может с этим связано?
     
  14. RealArty

    RealArty Нерд

    Спасибо за ссылку, я думал что проблема в esp но как выкрутится не знал. Попробую с pragma
     
  15. RealArty

    RealArty Нерд

    Разобрался только простым путем.

    Код (C++):
    //приемник на wemos
    #include <SPI.h>                                                          // подключаем библиотеку для работы с SPI
    #include <RF24.h>                                                         // подключаем библиотеку для работы с RF24 приемо-передатчиками
    #include <RF24Network.h>                                                  // подключаем библиотеку для работы с RF24 сетью

    RF24 radio(D4, D8);                                                        // инициализация радио nRF24L01 (+) подключено к SPI  мега CE 48 . CSN 49
    RF24Network network(radio);                                               // сеть использует это радио
    const uint16_t this_ID = 02;                                              // адрес нашего узла

    int16_t data[4];                                                             // прием массива данных радио RF24
    /*
    float  ID_00_KR_TMP = 0;                                                  // переменная датчика температуры
       int ID_00_KR_VL = 0;                                                   // переменная датчика влажности
       int ID_00_KR_ATDV = 0;                                                 // переменная датчика атмосферного давления
    */

    void setup(void)
    {
      Serial.begin(9600);
      Serial.println("ID_02_ST_TFT");
      SPI.begin();                                                            // инициализация SPI порта
      radio.begin();                                                          // инициализация RF24 радио
      network.begin(/*channel*/ 90, /*node address*/ this_ID);                // инициализация радио сети

    }

    void loop(void){

       network.update();                                       // нужно постоянно запускать, чтобы транслировались данные между узлами
         
       //int data[13]={};                                        // массив принимаемых данных состоит из 13 данных информации
     
       while ( network.available() )  {                        // если пришли данные - то    
       RF24NetworkHeader header;                               // если это так, взять и в сериал
       network.read(header,&data,sizeof(data));                // читаем данные

       Serial.print("ID_00_KR  ID-0"); Serial.print(data[0]);
       Serial.print(" Temp-");         Serial.print(float(data[1])/100,1);
       Serial.print(" Vl-");           Serial.print(data[2]);
       Serial.print(" ATM-");          Serial.print(data[3]);
       Serial.println(" ");
       /*ID_00_KR_TMP = data[1];
       ID_00_KR_VL = data[2];
       ID_00_KR_ATDV = data[3];  
       
       Serial.print("ID_00_KR  ID-0"); Serial.print(data[0]);
       Serial.print(" Temp-");         Serial.print(ID_00_KR_TMP/100);
       Serial.print(" Vl-");           Serial.print(ID_00_KR_VL);
       Serial.print(" ATM-");          Serial.print(ID_00_KR_ATDV);
       Serial.println(" ");
       */

         }
    }
    //============================================================================================
     
  16. Cadas

    Cadas Нерд

    Опишу свою проблему.
    Приемник и передатчик собраны на макетках: контроллер Atmega328P + nRF24L01+ c адаптером 5В/3,3В. Питание (5В) на оба узла подается с USB- разъема через преобразователь USB/TTL, отсюда же выводится инфа на монитор Arduino IDE с одного из устройств. Данные со второго узла выводятся на монитор через плату Arduino UNO. Выводы радиомодулей непосредственно подпаяны к пинам контроллеров. Фильтры по питанию (керамика + электролит) на nRF есть. Питание на контроллерах - 5В, как пишут, информационные выводы радиомодулей устойчивы к повышенному напряжению 5В.
    nrf24_1.jpg
    При загрузке в контроллеры скетча сканера эфира оба узла работают, но при загрузке тестовых скетчей передатчика и приемника А.Гайвера связать их по эфиру не удается. Все скетчи есть во вложении.
    Перед тем, как написать этот пост, выполнил пп 2-4 первого сообщения этой темы:
    НЕ помогло!
    Клонами не занимался, поскольку в интернет-магазине, где брал радиомодули, утверждают, что модули от производителя Ai-Thinker и проблем с ними не будет. Да и юзеры в отзывах на сайте магазина сообщают о успешном подключении. Почему у меня не получается - ума не приложу.
    Где копать? Помогите!
     

    Вложения:

    Последнее редактирование: 5 фев 2021
  17. parovoZZ

    parovoZZ Гуру

    Так надо у этого гавера и спросить. Мы не знаем, кто это.
     
  18. Cadas

    Cadas Нерд

    Гайвер - для конкретики. Его отличие от других, которые гуляют в Инете, в нем подсчитывается время между отправкой и приемом ответа. Я загружал и другие тестовые скетчи, в том числе и с амперки.
     
    Последнее редактирование: 6 фев 2021
  19. vvr

    vvr Инженерище

    гайверовские коды здесь разбирать вряд ли будут.

    начни читать тему с первых постов и повтори что там написано - и будет счастье.
    тогда и с гайвером поделишься информацией.
     
  20. parovoZZ

    parovoZZ Гуру

    Надо инициализировать все регистры, которые влияют на радиообмен.