nrf24l01 и конвертер ttl /485

brenersdid
Offline
Зарегистрирован: 11.05.2020

Всем привет! Прошу помочь со следующей проблемой (хотя бы намек где искать проблему). собрал два "передатчика" nano+nfr24l01+датчики I2C.

собрал приемник nano+nrf24l01+конвертер ttl/485(для подключения к прибору мониторинга по MODBUS RTU)

два передатчика передают данные на одну базу - все работает отлично. НО!

Пока все лежит дома в разных комнатах по modbus данные идут . Как только выношу на улицу - в течение 2-3х часов данные по modbus перестают идти на приборе мониторинга по всем параметрам 65535. Перезагрузка помогает на те же 2-3 часа. Приношу домой опять все пашет без проблем.

В квартире работает через две бетонные стены, на улице в щитовом ящике лежит, а датчики на улице

Может кто сталкивался... 

 

rkit
Offline
Зарегистрирован: 23.11.2016

Как кто-то мог сталкиваться с ошибками в твоём проекте. Ты его тиражировал?

brenersdid
Offline
Зарегистрирован: 11.05.2020
Код приемника:
 
===============================
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вставьте код правильно (в разделе "Песочница" есть специальная тема для новичков)

brenersdid
Offline
Зарегистрирован: 11.05.2020
#include <SPI.h>                                               // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                          // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                              // Подключаем библиотеку для работы с nRF24L01+
#include <Wire.h>
#include <BH1750.h>
#include <ModbusRtu.h>
                              

RF24           radio(9, 10);                                   // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
uint8_t        pipe;                                  
uint16_t        data[5];
//uint16_t        data1[4];
uint16_t osad;
uint16_t kurs;
uint16_t skor;
uint16_t svet;
uint16_t temp_s;
uint16_t hum_s;
uint16_t dav_s;

//modbus
#define TXEN  4
byte NRF24_addresRead[][6] = { "1Node", "2Node" };                                                               
Modbus slave(20,Serial,TXEN);
//modbus
void setup(){
    Serial.begin(9600);
    delay(1000);
    radio.begin();                                             // Инициируем работу nRF24L01+
    radio.setChannel(5);                                       // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_250KBPS);                        // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_MAX);                      // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openReadingPipe (1, 0xAABBCCDD11LL);                 // Открываем 1 трубу с идентификатором 1 передатчика 0xAABBCCDD11, для приема данных
    radio.openReadingPipe (2, 0xAABBCCDD22LL);                 // Открываем 2 трубу с идентификатором 2 передатчика 0xAABBCCDD22, для приема данных
    radio.startListening  ();                                  // Включаем приемник, начинаем прослушивать открытые трубы
//  radio.stopListening   ();                                  // Выключаем приёмник, если потребуется передать данные
    slave.start();
}
void loop(){
                                    // Если в буфере имеются принятые данные, то получаем номер трубы, по которой они пришли, по ссылке на переменную pipe
                               // Читаем данные в массив data и указываем сколько байт читать
         if(radio.available(&pipe)){                                // Если в буфере имеются принятые данные, то получаем номер трубы, по которой они пришли, по ссылке на переменную pipe
        radio.read(&data, sizeof(data));
          if(pipe == 1){
          Serial.println((String)": \t Аналог = " + pipe);
          osad = 20;// data[0];
          kurs = 200;// data[1];
          skor = 4;// data[2];
          Serial.println((String)": \t Osad = " + osad + " Kurs = " + kurs + " Skor = " + skor);
          }  
          if(pipe == 2){
          svet = 1200; //data[0];
          temp_s = 10; //data[1];
          hum_s = 40; //data[2];
          dav_s = 1020; //data[3]; 
          Serial.println((String)": \t Цифровые = " + pipe);
          Serial.println((String)": \t LUX = " + svet);
          Serial.println((String)": \t Temp = " + temp_s);
          Serial.println((String)": \t Hum = " + hum_s);
          Serial.println((String)": \t Press = " + dav_s);
          }
         }
      osad = 20;// data[0];
          kurs = 200;// data[1];
          skor = 4;// data[2];
       svet = 1200; //data[0];
          temp_s = 10; //data[1];
          hum_s = 40; //data[2];
          dav_s = 1020; //data[3]; 
uint16_t au16data[7] = {osad, kurs, skor, svet, temp_s, hum_s, dav_s};
slave.poll( au16data, 7 );
}

 

brenersdid
Offline
Зарегистрирован: 11.05.2020
#include <Wire.h>
#include <BH1750.h>
#include <SPI.h>                                               // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h>                                          // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>                                              // Подключаем библиотеку для работы с nRF24L01+
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>                       

#define SEALEVELPRESSURE_HPA (1013.25)

byte NRF24_addresWrit[][6] = { "1Node" };
RF24           radio(9, 10);                                   // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
uint16_t            data1[4];                                        // Создаём массив для передачи данных (так как мы будем передавать только одно двухбайтное число, то достаточно одного элемента массива типа int)
BH1750 lightMeter(0x23);
float lux;
Adafruit_BME280 bme;

void setup(){
   
  Serial.begin(9600);
    Wire.begin();
    radio.begin();                                             // Инициируем работу nRF24L01+
    radio.setChannel(5);                                       // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate     (RF24_250KBPS);                        // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel      (RF24_PA_MAX);                      // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe (0xAABBCCDD22LL);                    // Открываем трубу с идентификатором 0xAABBCCDD11 для передачи данных (на одном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
    bme.begin(0x76);
    lightMeter.begin(BH1750::CONTINUOUS_HIGH_RES_MODE);
}
void loop(){
    if (lightMeter.measurementReady()) {
    lux = lightMeter.readLightLevel();
    }
    data1[0] = lux;                     
    data1[1] = bme.readTemperature() ;
    data1[2] = bme.readHumidity();
    data1[3] = bme.readPressure() / 100.0F;
    Serial.println((String)"Svet - " + data1[0]);
    Serial.println((String)"Temp - " + data1[1]);
    Serial.println((String)"Hum - " + data1[2]);
    Serial.println((String)"Pressure - " + data1[3]);
    radio.write(&data1, sizeof(data1));                          // отправляем данные из массива data указывая сколько байт массива мы хотим отправить. Отправить данные можно с проверкой их доставки: if( radio.write(&data, sizeof(data)) ){данные приняты приёмником;}else{данные не приняты приёмником;}
    delay(600);                                                 // устанавливаем задержку на 50 мс, за это время приемник успеет принять и обработать данные этого и другого передатчика.
}

 

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

я правильно вижу. что в приемнике сейчас ничего на самом деле не принимается и реальные данные заменены на заглушку?

brenersdid
Offline
Зарегистрирован: 11.05.2020

Да, совершенно верно. Это уже попытка поиска :)

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

brenersdid

метод poll возвращает статус выполнения, почему не проверяете? - для диагностики хотя бы

brenersdid
Offline
Зарегистрирован: 11.05.2020

b707 пишет:

brenersdid

метод poll возвращает статус выполнения, почему не проверяете? - для диагностики хотя бы

Я посмотрел статусы - poll возвращает либо нет запроса, либо ошибка связи. Посчитал, что поможет. 

Завтра попробую поставить. 

brenersdid
Offline
Зарегистрирован: 11.05.2020

b707 пишет:

brenersdid

метод poll возвращает статус выполнения, почему не проверяете? - для диагностики хотя бы

Попробовал...

При подключении наника к юсб отключается отправка данных, т.к. конвертер подключен к rx/tx

Но в мониторе идет так:

0

0

0

0

0

0

0

7

и дальше повторение