проблемы с модулями nRF24L01+

akaLoki
Offline
Зарегистрирован: 24.03.2018

Добрый день

Прошу помощи у сообщества. в зимнюю пору начал реализовывать проект по автоматизации теплиц, представлял себе это в виде 3х контроллеров, 2 в теплицах - управляют форточками, поливом, и рапортуют о своем состоянии на 3й контроллер, который уже, посредством СМС докладывается мне о происшевствиях. Частично данный проект был реализован - контроллеры теплиц хлопают форточками, и шлют данные на 3й контроллер. затык в обратной связи - посредством кнопок на 3м контроллере я планировал запускать необходимые функции на контроллерах теплиц, но не выходит каменный цветок(

фрагмент кода с контроллера теплиц, собран на основе ардуино мега

#include "nRF24L01.h"           // библиотека радиомодуля
#include "RF24.h"               // ещё библиотека радиомодуля
RF24 radio(24, 26); // CE, CSN

void setup(void)
{  radio.setPayloadSize(32);     //размер пакета, в байтах
  radio.openReadingPipe(1, address[1]);     //хотим слушать трубу 1
  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 Transmit()
{    
    lastTransmit = ((time.Hours * 60) + time.minutes);
                                                                 //заполняем массив для передачи
    teplData[0] = tempDS18B20, 0;             // температура по DS
    teplData[1] = tempDHT22, 0;               // температура по DH
    teplData[2] = DHT22.hum, 0;               // влажность по DH
    teplData[3] = i;                          // следующий полив
    teplData[4] = doorOpen;                   // состояние двери
    teplData[5] = StateWindows;               // состояние окон
    
    radio.stopListening();          //останавливаем прослушку эфира, мы передающий модуль
    radio.openWritingPipe(address[1]);   //мы - труба 1, открываем канал для передачи данных
    radio.write(&teplData, sizeof(teplData)); // отправляем данные и указываем сколько байт пакет
    radio.startListening();       //начинаем слушать эфир, мы приёмный модуль
    
  
}

void Resive()
{
                  Serial.println(radio.available());
    if (radio.available())           // проверяем не пришло ли чего в буфер.
      {
        radio.read(&reciveData, sizeof(reciveData)); 
      }
        if (reciveData == 1)
          {
            Transmit();
          }
        if (reciveData == 2)
          {
            open_window();
          }        
        if (reciveData == 3)
          {
            close_window();
          }
        if (reciveData == 4)
          {
            poliv();
          }
     reciveData = 0;
      
}

void loop()
{ if ((((time.Hours * 60) + time.minutes) - lastTransmit) > 10)
  {
  Transmit();                                     //передача  данных на основной контроллер
  }
Resive();                                       //прием данных с основного контроллера
}

 

фрагмент кода с 3его контроллера, собран на ардуино уно

#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10); // CE, CSN

void setup() {
  radio.begin();
 radio.setPayloadSize(32);     //размер пакета, в байтах
  radio.openReadingPipe(1, address[1]);     //хотим слушать трубу 1
  radio.openReadingPipe(2, address[2]);     //хотим слушать трубу 2
  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();  //начинаем слушать эфир, мы приёмный модуль

}

float Transmit(byte tepl)
{ 
  if (tepl == 1)
  {
     radio.stopListening();     //останавливаем прослушку эфира, мы передающий модуль
     radio.openWritingPipe(address[1]);     //мы - труба 1, открываем канал для передачи данных
     radio.write(&transmitData, sizeof(transmitData)); // отправить по радио
     radio.startListening();        //начинаем слушать эфир, мы приёмный модуль
     transmitData = 0;

  }
  if (tepl == 2)
  {
     radio.stopListening();     //останавливаем прослушку эфира, мы передающий модуль
     radio.openWritingPipe(address[2]); //мы - труба 2, открываем канал для передачи данных
     radio.write(&transmitData, sizeof(transmitData)); // отправить по радио
     radio.startListening();    //начинаем слушать эфир, мы приёмный модуль
     transmitData = 0;

  }
  
}

void loop()
{
  if (radio.available(&pipe))           // проверяем не пришло ли чего в буфер.
  {
     Serial.println("211");
    if (pipe == 1)
    {
      radio.read(&teplData1, sizeof(teplData1));
      lcdData();
      lastUpdateTepl1 = ((time.Hours * 60) + time.minutes);
      lcd1.setCursor(11, 1);
      lcd1.print(time.gettime("H:i")); // выводим время получения данных
    }
    if (pipe == 2)
    {
      radio.read(&teplData2, sizeof(teplData2));
      lcdData();
      lastUpdateTepl2 = ((time.Hours * 60) + time.minutes);
      lcd2.setCursor(11, 1);
      lcd2.print(time.gettime("H:i")); // выводим время получения данных
    }
  }

  if ((((time.Hours * 60) + time.minutes) - lastUpdateTepl1) > 15)    //если нет данных с теплицы более 15 мин - отправляем запрос
  {
    lastUpdateTepl1 = ((time.Hours * 60) + time.minutes-5);
    transmitData = 1;
    Transmit(1);
  }
  if ((((time.Hours * 60) + time.minutes) - lastUpdateTepl2) > 15)    //если нет данных с теплицы более 15 мин - отправляем запрос
  {
    lastUpdateTepl2 = ((time.Hours * 60) + time.minutes-5);
    transmitData = 1;
    Transmit(2);
  }
}

 

 

как резюме моего вопроса - от меги на уно пакеты приходят, обратно - нет, укажите пжа возможную проблему.

akaLoki
Offline
Зарегистрирован: 24.03.2018

проблема по железу была

спасла намотка волшебной проволочки на антену модуля НРФ

Megawollt
Offline
Зарегистрирован: 06.12.2015

Покупайте качественные НРФки. Даже с усилителем и антенной некачественные работают плохо

b707
Offline
Зарегистрирован: 26.05.2017

akaLoki пишет:

проблема по железу была

спасла намотка волшебной проволочки на антену модуля НРФ

сильно помогло? сколько оборотов? Подключали куда-нибудь?

Что-то у меня намотка пролоки не сказывается никак - модули больше чем на 5-7 м не работают

akaLoki
Offline
Зарегистрирован: 24.03.2018

брал в магазине греатвалл, по ссылке алексгвера

akaLoki
Offline
Зарегистрирован: 24.03.2018

брал в магазине греатвалл, по ссылке алексгвера

провод наматал бездумно, кусок что под руку попался

дальность не проверял, придет весна - покажет - пробьет ли 15м и 2 кирпичных стены