nrf24l01 и конвертер ttl /485
- Войдите на сайт для отправки комментариев
Всем привет! Прошу помочь со следующей проблемой (хотя бы намек где искать проблему). собрал два "передатчика" nano+nfr24l01+датчики I2C.
собрал приемник nano+nrf24l01+конвертер ttl/485(для подключения к прибору мониторинга по MODBUS RTU)
два передатчика передают данные на одну базу - все работает отлично. НО!
Пока все лежит дома в разных комнатах по modbus данные идут . Как только выношу на улицу - в течение 2-3х часов данные по modbus перестают идти на приборе мониторинга по всем параметрам 65535. Перезагрузка помогает на те же 2-3 часа. Приношу домой опять все пашет без проблем.
В квартире работает через две бетонные стены, на улице в щитовом ящике лежит, а датчики на улице
Может кто сталкивался...
Как кто-то мог сталкиваться с ошибками в твоём проекте. Ты его тиражировал?
Вставьте код правильно (в разделе "Песочница" есть специальная тема для новичков)
#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 ); }#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 мс, за это время приемник успеет принять и обработать данные этого и другого передатчика. }я правильно вижу. что в приемнике сейчас ничего на самом деле не принимается и реальные данные заменены на заглушку?
Да, совершенно верно. Это уже попытка поиска :)
brenersdid
метод poll возвращает статус выполнения, почему не проверяете? - для диагностики хотя бы
brenersdid
метод poll возвращает статус выполнения, почему не проверяете? - для диагностики хотя бы
Я посмотрел статусы - poll возвращает либо нет запроса, либо ошибка связи. Посчитал, что поможет.
Завтра попробую поставить.
brenersdid
метод poll возвращает статус выполнения, почему не проверяете? - для диагностики хотя бы
Попробовал...
При подключении наника к юсб отключается отправка данных, т.к. конвертер подключен к rx/tx
Но в мониторе идет так:
0
0
0
0
0
0
0
7
и дальше повторение