Радиомодули nRF24L01+ (приемник молчит, падла)

romiras
Offline
Зарегистрирован: 12.07.2015

Пытаюсь передать температурные данные с DS18B20 посредством радиомодулей nRF24L01+ с одной дуины на другую. Пробовал сторонние скетчи грузить - все работает идеально. С этими кодами - примник молчит(   

примник:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24

const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"

RF24 radio(7, 8); // CE, CSN

void setup() {
  Serial.begin(9600);

  radio.begin();
  delay(2);
  radio.setChannel(9); // канал (0-127)

  // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
  // RF24_250KBPS на nRF24L01 (без +) неработает.
  // меньше скорость, выше чувствительность приемника.
  radio.setDataRate(RF24_1MBPS);

  // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
  radio.setPALevel(RF24_PA_HIGH);

  radio.openReadingPipe(1, pipe); // открываем первую трубу с индитификатором "pipe"
  radio.startListening(); // включаем приемник, начинаем слушать трубу
}

//  radio.stopListening(); // останавливает приём (нужно перед началом передачи)


void loop()
{
  int data;

  if (radio.available()) { // проверяем не пришло ли чего в буфер.
    radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать

    Serial.print("data: ");
    Serial.println(data);
  }
  delay(200);
}

передатчик:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 5
const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"
OneWire oneWire(ONE_WIRE_BUS);
RF24 radio(7, 8); // CE, CSN
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(9600);
  sensors.begin();
  radio.begin();
  delay(2);
  radio.setChannel(9); // канал (0-127)

  // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
  // RF24_250KBPS на nRF24L01 (без +) неработает.
  // меньше скорость, выше чувствительность приемника.
  radio.setDataRate(RF24_1MBPS);

  // мощьность передатчика, RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM,
  radio.setPALevel(RF24_PA_HIGH);

  radio.openWritingPipe(pipe); // открываем трубу на передачу.
}


void loop()
{
  Serial.println("data: ");
  sensors.requestTemperatures(); // Send the command to get temperatures

  Serial.println(sensors.getTempCByIndex(0));
  int data = sensors.getTempCByIndex(0); // читаем значение

  radio.write(&data, sizeof(data)); // отправляем данные и указываем сколько байт пакет

  Serial.print("data: ");
  Serial.println(data);
}










 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

37 строка неправильная. должно быть byte

а это вообще странно

sensors.getTempCByIndex(0); // читаем значение

эта строка возвращает float. его нельзя чему угодно просто так приравнивать

romiras
Offline
Зарегистрирован: 12.07.2015

Таким образом? Или я не правильно понял



void loop()
{
  
  sensors.requestTemperatures(); // Send the command to get temperatures

 
  int byte = sensors.getTempCByIndex(0); // читаем значение
int data = byte;
  radio.write(&data, sizeof(data)); // отправляем данные и указываем сколько байт пакет

  
  Serial.println(data);
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да не так

во первых data должен быть массивом. посмотри примеры

во вторых тебе нужно передавать знак температуры, а float разбить до byte. температура считывается до сотого знака вроде. значит умножаем на 100 и приравниваем к переменной int temp например. дальше условия:

1. если число меньше 0 то data[0]=0 и умножаем число на -100

иначе data[0]=1 и умножаем на 100

2. data[1]=temp/100; data[2]=temp%100; 

и отправляем весь массив. в приемнике число обратно собираем во float или что там нужно

romiras
Offline
Зарегистрирован: 12.07.2015

Спасибо, буду разбираться!

romiras
Offline
Зарегистрирован: 12.07.2015

все равно не могу заставить работать приемник(((

Radjah
Offline
Зарегистрирован: 06.08.2014

jeka_tm

я без всяких извратов целую структуру отправлял, только скорость минимальную ставил.

romiras

В примерах в либе есть вывод информации о модуле. Добавь этот кусок в свой скетч и хидер "printf.h" из примера в каталог к своему скетчу кинь. И проверку на успешность отправки добавь. В примере она тоже есть.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

Radjah
Offline
Зарегистрирован: 06.08.2014

Я к тому, что на 1Mbit у меня соединение вообще не шло. Может глюк, может я где накосячил. failsafe, все дела.

romiras
Offline
Зарегистрирован: 12.07.2015

как скорость ниже сделать? RF24_500KBPS - не катит, RF24_0.5MBPS - тоже не так(.  С аналогового датчика показания передаются без проблем и на 1 мбит, проблема у меня видимо в передаче данных от датчика температуры, не знаю как разбить на те составляющие, которые можно отправить - опыта не хвататет и знаний ( я не программист, к сожалению)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
radio.setDataRate(RF24_250KBPS);

у меня и на 2мбит работало хорошо, но убавлял до минимума для максимальной дальности

я тоже не программист))

romiras
Offline
Зарегистрирован: 12.07.2015

скорость убавил - результат 0, вердикт - кривые руки((       все равно спасибо!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

https://yadi.sk/d/CXjuENmaEEwun

архив RF24. там измененая библиотека. примеры рабочие сам вставлял, комментарии прописаны. попробуй

romiras
Offline
Зарегистрирован: 12.07.2015

Спсабо за архив! Вот что получилось - опять двадцать пять)

#include <SPI.h>
#include "RF24.h"
#include <OneWire.h>
OneWire ds(5);
const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи
RF24 radio(7, 8);
byte msg[3];

void setup() {
  //============================================================Модуль NRF24
  radio.begin();                      // Включение модуля
  radio.setAutoAck(1);                // Установка режима подтверждения приема;
  radio.setRetries(1, 1);             // Установка интервала и количества попыток
  radio.setDataRate(RF24_250KBPS);    // Устанавливаем скорость
  radio.setPALevel(RF24_PA_MAX);      // Установка максимальной мощности;
  radio.setChannel(10);               // Устанавливаем канал
  radio.openWritingPipe(pipe);        // Открываем канал передачи
}

void loop() {


  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  Temp = Temp >> 4;
  msg[0] = Temp;

  radio.write(&msg, sizeof(msg));
}

 

romiras
Offline
Зарегистрирован: 12.07.2015

попробовал так:

передатчик

#include <SPI.h>
#include "RF24.h"
#include <OneWire.h>
OneWire ds(5);
const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи
RF24 radio(7, 8);


void setup() {
  //============================================================Модуль NRF24
  radio.begin();                      // Включение модуля
  radio.setAutoAck(1);                // Установка режима подтверждения приема;
  radio.setRetries(1, 1);             // Установка интервала и количества попыток
  radio.setDataRate(RF24_250KBPS);    // Устанавливаем скорость
  radio.setPALevel(RF24_PA_MAX);      // Установка максимальной мощности;
  radio.setChannel(10);               // Устанавливаем канал
  radio.openWritingPipe(pipe);        // Открываем канал передачи
}

void loop() {


  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  Temp = Temp >> 4;


  radio.write(&data, sizeof(data));
}

приемник

#include <SPI.h>
#include "RF24.h"

const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи
RF24 radio(7, 8);


void setup() {
  Serial.begin(9600);
  //============================================================Модуль NRF24
  radio.begin();                      // Включение модуля
  radio.setAutoAck(1);                // Установка режима подтверждения приема;
  radio.setDataRate(RF24_250KBPS);    // Устанавливаем скорость
  radio.setChannel(10);               // Устанавливаем канал
  radio.openReadingPipe(1, pipe);     // Открываем 1 канал приема
  radio.startListening();             // Начинаем слушать эфир

}

void loop() {
  byte data[2];
  if (radio.available()) {
    while (radio.available()) {
      radio.read(&data, sizeof(data));
      Serial.println(data[0]);
      Serial.println(data[1]);
    }
  }
}

 

опять тишина...

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

у тебя хоть пример работает?

romiras
Offline
Зарегистрирован: 12.07.2015

не работает, странно

romiras
Offline
Зарегистрирован: 12.07.2015

скорость 1 мбит поставил - заработало

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

romiras, уберите для проверки из скетча передатчика код работы с датчиком температуры. Посылайте что нибудь попроще, например data[0]=millis()%255; data[1]=~data[0]; Убедитесь, что это принимается.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а ты конденсатор на модуль напаял?

romiras
Offline
Зарегистрирован: 12.07.2015

А надо было? Какой номинал? на пины питания?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ага. я 10мкф паяю. кто то 0.1мкф. керамику

прямо на сам модуль

romiras
Offline
Зарегистрирован: 12.07.2015

Попробовал: данные передаются нестабильно и с большой задержкой

romiras
Offline
Зарегистрирован: 12.07.2015

Сейчас в закромах пошарю - может найду, спасибо за совет!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

romiras
Offline
Зарегистрирован: 12.07.2015

По последнему выложенному мной коду ( только со скор. 1 мбит)  - передача прошла 1 раз, затем тишина, пол минуты подождал, вырубил

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

romiras, смотри #18

ps: и ретрайсы я бы поставил (15,15)

romiras
Offline
Зарегистрирован: 12.07.2015

dimax, данные с монитора по твоему примеру:

138
117
234
21
187
68
62
193
75
180
84
171
127
128
 
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

romiras, значит проблема в задержке 750мс в лупе. Её нужно обойти, как вариант решение такое.

std
Offline
Зарегистрирован: 05.01.2012

Снизьте скорость SPI до 4 МГц:

SPI.setClockDivider(SPI_CLOCK_DIV4);

может поможет

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да что ему говорить. там есть человеческие примеры. каждый модуль с ардуиной првоеряется статусом, а связь rx и tx. а он хочет сразу температуру гнать. если так то флаг ему в руки, по моему нужно быть последовательным