Вопросы по NRF24L01

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
он может ответить пакетом данных,но функция write может возвращать тру только при 1 и 2 мбитах передачи. в доках так написано

а что будет если регистрация пойдет в момент когда база сама передает ? как ты эти коллизии пытаешься разрулить?
А когда база передает она же не слушает эфир, и даже не почувствует что кто-то пытается зарегатся, или на крайняк когда начинаем собирать инфу отключаем трубы для чтения =)

первое что увидел, так то, что передатчик слушает эфир
radio.startListening();
второе , на 250кб не работает подтверждение приема. на 1 и 2 мбит.
я наверное не очень понимаю, что ты хочешь сделать в передатчике..
На всякий прикрепил ниже свой пример работы с одним приемником и несколькими передатчиками. До 5 штук. всего в сети 6 NRF может быть. Посмотри код, он с подтверждениями работает
НазваниеАльт. названиеВесДиапазонОсобенность
booleanbool1 байт0 или 1, true или falseЛогическая переменная.
bool
на Arduino тоже занимает 1 байт, а не бит!
char1 байт-128… 127Хранит номер символа из таблицы символов ASCII
int8_t1 байт-128… 127
byteuint8_t1 байт0… 255
intint16_t, short2 байта-32 768… 32 767
unsigned intuint16_t, word2 байта0… 65 535
longint32_t4 байта-2 147 483 648… 2 147 483 647– 2 миллиарда… 2 миллиарда
unsigned longuint32_t4 байта0… 4 294 967 2950… 4 миллиарда…
float4 байта-3.4028235E+38… 3.4028235E+38Хранит числа с плавающей точкой (десятичные дроби). Точность: 6-7 знаков
double4 байта Для AVR то же самое, что
float
. А так он 8 байт на более взрослом железе
int64_t8 байт-(2^64)/2… (2^64)/2-1*Очень большие числа. Стандартный Serial не умеет такие выводить
uint64_t8 байт2^64-1*Очень большие числа. Стандартный Serial не умеет такие выводить
Можно ли использовать вместо в вашем коде byte вместо uint8_t
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Можно. Но вот для integer в разных платах могут и разных компиляторах данные могут быть в 2 и 4 байта. Я перешел на однозначные типы int8_t , uint16_t и другие , байт и так однозначен, но что бы не смущать себя пишу единообразно.
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@Старик Похабыч, Спасибо вам! Ваш код чуть переделал под свой "протокол". Так и не понял до конца в чем проблема но работает лучше я бы сказал 9 из 10, грешу все таки на зарядку) во врем тестов не до конца её вставлял и видимо проседали кондеры в зарядке и модуль вис или дуня висла. А так от usb (или от зарядки но вставленной до конца и ресетнотой дуней) все работает четко! Может кому потом поможет)
Код передатчика:
C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
#define key 201
byte id_sensor = 0;
byte type_sensor = 1;
RF24 radio(9, 10);
struct message {
  byte id;
  byte type;
  byte data;
};
message send_data;
byte pipe = 0;
boolean register_sensor() {
  radio.stopListening();
  delay(10);
  radio.openWritingPipe(0xAABBCCDD22LL);
  delay(10);
  byte data = 255;
  boolean status_ = false;
  byte i = 0;
  while (!status_ && i < 100) {
    status_ = radio.write(&data, sizeof(data));
    delay(100);
    i++;
  }
  if (status_) {
    Serial.println("Send OK");
  }
  else {
    Serial.println("Send ERR");
    Serial.println("Restart....");
  }
  delay(50);
  radio.startListening();
  data = 0;
  while (!radio.available()) {
    delay(40);
  }
  radio.read(&data, sizeof(data));
  if (data > 0) {
    Serial.println("REG OK");
    id_sensor = data;
    delay(10);
    radio.closeReadingPipe(2);
    delay(10);
    return true;
  }
  else {
    Serial.println("REG ERR");
    return false;
  }
}
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setAutoAck(true);
  radio.setChannel(120);
  radio.setDataRate (RF24_1MBPS);
  radio.setPALevel (RF24_PA_MAX);
  radio.powerUp();
  delay(10);
  radio.startListening();
  delay(10);
  radio.openReadingPipe (1, 0xAABBCCDD11LL);
  radio.setAutoAck(1, true);
  radio.openReadingPipe (2, 0xAABBCCDD22LL);
  radio.setAutoAck(2, true);
  //RF24_1MBPS
  Serial.println("Radio configured!");
  delay(100);
  if (id_sensor == 0) {
    register_sensor();
  }
}
void loop() {
  if (radio.available(&pipe)) {
    if (pipe == 1) {
      byte request = 0;
      radio.read(&request, sizeof(request));
      if (request == 100) {
        radio.stopListening();
        delay(10);
        radio.openWritingPipe(0xAABBCCDD11LL);
        delay(10);
        boolean send_status = false;
        byte i = 0;
        while (!send_status && i < 10) {
          send_status = radio.write(&id_sensor, sizeof(id_sensor));
          i++;
          delay(100);
        }
        delay(10);
        radio.startListening();
      }
    }
  }
}
Код базы:
C++:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24     radio(D4, D8);
byte transmit_data;
uint8_t  pipe;

void setup()
{
  radio.begin();
  radio.setChannel(120);
  radio.setDataRate(RF24_1MBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.openReadingPipe (1, 0xAABBCCDD11LL);
  radio.setAutoAck(1, true);
  radio.openReadingPipe (2, 0xAABBCCDD22LL);
  radio.setAutoAck(2, true);
  /*
    radio.openReadingPipe (3, 0xAABBCCDD33LL);
    radio.setAutoAck(3, true);
    radio.openReadingPipe (4, 0xAABBCCDD44LL);
    radio.setAutoAck(4, true);
    radio.openReadingPipe (5, 0xAABBCCDD55LL);
    radio.setAutoAck(5, true);
  */
  radio.startListening();

  Serial.begin(115200);
  Serial.println("Start..");
}


void loop()
{
  if (Serial.available() > 0) {
    String buf = Serial.readString();
    if (buf == "tx") {
      Serial.println("Start sening...");
      radio.stopListening();
      delay(10);
      radio.openWritingPipe(0xAABBCCDD11LL);
      byte bytte = 100;
      boolean status_data = radio.write(&bytte, sizeof(bytte));
      if (status_data) {
        Serial.println("Data sended!");
      }
      else {
        Serial.println("Data sent error");
      }
      delay(10);
      radio.startListening();
    }
  }
  if (radio.available(&pipe))
  {
    Serial.print("Got from..");
    radio.read( &transmit_data, sizeof(transmit_data) );

    if (pipe == 1)
    {
      Serial.println("Pipe 1");
      Serial.println(transmit_data);
    }
    if (pipe == 2)
    {
      Serial.println("Pipe 2 register pipe");
      if (transmit_data == 255) {
        Serial.println("Starting register!");
        radio.stopListening();
        delay(10);
        radio.openWritingPipe(0xAABBCCDD22LL);
        delay(10);
        byte new_id = random(1, 230);
        Serial.print("new id is:");
        Serial.println(new_id);
        boolean status_send = false;
        byte i = 0;
        while (!status_send && i < 10) {
          status_send = radio.write(&new_id, sizeof(new_id));
          delay(100);
          i++;
        }
        if (status_send) {
          Serial.println("Register OK");
        }
        else {
          Serial.println("Register ERR");
        }
        delay(10);
        radio.startListening();
      }
    }
  }
}
Еще раз большое спасибо!

первое что увидел, так то, что передатчик слушает эфир
radio.startListening();
второе , на 250кб не работает подтверждение приема. на 1 и 2 мбит.
я наверное не очень понимаю, что ты хочешь сделать в передатчике..
На всякий прикрепил ниже свой пример работы с одним приемником и несколькими передатчиками. До 5 штук. всего в сети 6 NRF может быть. Посмотри код, он с подтверждениями работает
И еще один вопросик =) Подскажите как хранить массив с таких труб если я правильно понимаю то вот так покатит
uint64_t pipes[] = {0xAABBCCDD01LL,0xAABBCCDD0BLL};
Верно ?


-----------14.07.2020 23:32------
Так и не понял в чем прикол....
Вообщем если я обращаюсь к этому массиву uint8_t address[][6] = {0xAABBCCDD11LL, 0xAABBCCDD22LL, 0xAABBCCDD33LL, 0xAABBCCDD44LL, 0xAABBCCDD55LL}; То "регистрация" не пашет а если так uint8_t address[][6] = {"1Node", "2Node"};
то пашет)
Код датчика:
C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
byte id_sensor = 0;
byte type_sensor = 1;
RF24 radio(9, 10);
struct message {
  byte id;
  byte type;
  byte data;
};
message send_data;
uint8_t pipe = 0;
//uint8_t address[][6] = {0xAABBCCDD11LL, 0xAABBCCDD22LL, 0xAABBCCDD33LL, 0xAABBCCDD44LL, 0xAABBCCDD55LL};
uint8_t address[][6] = {"1Node", "2Node"};
void setup() {
  Serial.begin(115200);
  radio.begin();
  radio.setAutoAck(true);
  radio.setChannel(120);
  radio.setRetries(1,7);
  radio.setDataRate(RF24_1MBPS);
  radio.setPALevel (RF24_PA_MAX);
  radio.openReadingPipe(1, address[0]);
  radio.openReadingPipe(2, address[1]);
  radio.openWritingPipe(address[0]);
  radio.powerUp();
  radio.startListening();
  delay(100);
  if (id_sensor == 0) {
    //Start reg!
    Serial.println("Start registering....");
    radio.stopListening();
    delay(50);
    radio.openWritingPipe(address[1]);
    delay(300);
    Serial.println("Radio done!");
    send_data.id = 0;
    send_data.type = type_sensor;
    send_data.data = 255;
    boolean send_status = false;
    byte i = 0;
    while (!send_status && i < 15) {
      send_status = radio.write(&send_data, sizeof(send_data));
      delay(150);
      i++;
    }
    radio.startListening();
    if (!send_status) {
      Serial.println("Error register!(start infinyt while)");
      while (true) {}
    }
    while (!radio.available()) {}
    Serial.println("Data recived! Veryfing....");
    radio.read(&send_data, sizeof(send_data));
    if (send_data.id != 0 && send_data.type == type_sensor && send_data.data == 255) {
      Serial.println("REG OK");
      id_sensor = send_data.id;
    }
    else {
      Serial.println("REG ERR");
    }
    radio.stopListening();
    radio.openWritingPipe(address[0]);
    radio.startListening();
  }
}

void loop() {
  if (radio.available(&pipe)) {
    if (pipe == 1) {
      Serial.println("Data recived!");
      byte request = 0;
      radio.read(&request, sizeof(request));
      if (request == 101) {
        Serial.println("Request OK Start sending data..");
        radio.stopListening();
        boolean send_s = false;
        byte i = 0;
        send_data.id = id_sensor;
        send_data.type = type_sensor;
        send_data.data = random(1, 30);
        while (!send_s && i < 10) {
          send_s = radio.write(&send_data, sizeof(send_data));
          delay(50);
          i++;
        }
        if (send_s) {
          Serial.println("Data sended!");
        }
        else {
          Serial.println("Error of sending data");
        }
        radio.startListening();
      }
    }
  }
}
Код базы:
C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
byte id_sensor = 0;
byte type_sensor = 1;
RF24 radio(D4, D8);
struct message {
  byte id;
  byte type;
  byte data;
};
message rx_data;
uint8_t pipe = 0;
//uint8_t address[][6] = {0xAABBCCDD11LL, 0xAABBCCDD22LL, 0xAABBCCDD33LL, 0xAABBCCDD44LL, 0xAABBCCDD55LL};
uint8_t address[][6] = {"1Node", "2Node"};
boolean send_request() {
  radio.stopListening();
  radio.openWritingPipe(address[0]);
  boolean status_s = false;
  byte i = 0;
  byte data = 101;
  while (!status_s && i < 15) {
    status_s = radio.write(&data, sizeof(data));
    i++;
    delay(5);
  }
  if (status_s) {
    Serial.println("Request send!");
  }
  else {
    Serial.println("Request error");
  }
  radio.startListening();
  return status_s;
}
boolean register_() {
  radio.stopListening();
  radio.openWritingPipe(address[1]);
  boolean status_s = false;
  byte i = 0;
  rx_data.id = random(1, 50);
  Serial.print("New id is ");
  Serial.println(rx_data.id);
  while (!status_s && i < 15) {
    status_s =  radio.write(&rx_data, sizeof(rx_data));
    i++;
    delay(5);
  }
  if (status_s) {
    Serial.println("REG OK");
  }
  else {
    Serial.println("REG ERR");
  }
  radio.startListening();
  return status_s;
}
void setup() {
  Serial.begin(115200);
  radio.begin();
  radio.setAutoAck(true);
  radio.setChannel(120);
  radio.setDataRate(RF24_1MBPS);
  radio.setPALevel (RF24_PA_MAX);
  radio.openReadingPipe(1, address[0]);
  radio.openReadingPipe(2, address[1]);
  radio.setAutoAck(1, true);
  radio.setAutoAck(2, true);
  radio.powerUp();
  delay(100);
  radio.startListening();
}

void loop() {
  if (Serial.available() > 0) {
    String buffer_ = Serial.readString();
    if (buffer_ == "tx") {
      Serial.println("Start sending...");
      send_request();
    }
  }
  if (radio.available(&pipe)) {
    Serial.println("DATA recived!");
    radio.read(&rx_data, sizeof(rx_data));
    if (pipe == 1) {
      Serial.print("Pipe 1 Id: ");
      Serial.print(rx_data.id);
      Serial.print(" Type sensor: ");
      Serial.print(rx_data.type);
      Serial.print(" Data: ");
      Serial.println(rx_data.data);
    }
    else if (pipe == 2) {
      Serial.println("New module, veryfing....");
      if (rx_data.id == 0 && rx_data.data == 255) {
        Serial.println("VERIFED! Starting register...");
        register_();
      }
    }
    Serial.println(pipe);

  }

}
-----15/07/2020 13:17-----------
Вообщем) чуть не досмотрел в доках, там написано
C++:
uint8_t addresses[][6] = {"1Node","2Node"};
openReadingPipe(1,addresses[0]);
openReadingPipe(2,addresses[1]);
Так что буду юзать так)
 
Изменено:

Георгий_МА

✩✩✩✩✩✩✩
16 Июл 2020
1
0
Всем привет! Проблема следующего плана... Подключил NRF через адаптер как на схеме с Nano



connect_adapter.png
Запускаю скетч nrf_listen_air, в мониторе порта следующая картина...


1594900705949.png

Другими словами не могу получить инфу о занятых каналах.
Попробовал на другом модуле, то же самое... Может кто сталкивался, знаете как решить?
 
Изменено:

b707_2

★★✩✩✩✩✩
22 Июл 2020
182
51
у меня тоже скетч сканирования каналов ничего не показывает, но при этом два модуля связываются друг с другом
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,265
944
58
Марий-Эл
@b707_2, Была такая фигня. Взял другую NRF заработало. Взял предыдущую, то же заработало.
В чём было дело так и не понял.

Сейчас попробовал посканировать.
Опять та же фигня. Из 10 шт. Два не сканируют. Связь на несканирующих пока не пробовал.
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
Всем доброго времени суток! Код рабочий, но работает раз, через раз 🥴
Вообщем у меня тип умный дом.
Пока что побеждаю радио, пока что имеем рабочую регистрацию, и получение инфы от сенсоров.
Алгоритм получения инфы: База проходиться по массиву, открывает трубу(персональную для каждого сенсора) на отправку туда шлет некий байт "запрос", а сенсор отвечает на общую трубу для информации.
База:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#define v_kef 100
uint8_t id_sensor = 0;
uint8_t type_sensor = 1;
RF24 radio(D4, D8);
struct message {
  uint8_t id;
  uint8_t type;
  uint8_t data;
};
struct info_ {
  uint8_t id_sensor;
  uint8_t type_sensor;
  int16_t v_bat;
  uint8_t status_sensor;
  uint8_t signal_lvl;
  uint8_t person_pipe[1][6];
};
message rx_data;
info_ reg_pack;
//uint8_t v_kef = 100;
uint8_t pipe = 0;
//uint8_t address[][6] = {0xAABBCCDD11LL, 0xAABBCCDD22LL, 0xAABBCCDD33LL, 0xAABBCCDD44LL, 0xAABBCCDD55LL};
uint8_t address[20][6] = {"0Node", "1Node", "2Node", "3Node"}; //0-Заглушка;1-Alarms;2-Reg; 3-Get_data; Another sesors!
uint8_t pipes_elems() {
  uint8_t memory = sizeof(address) / sizeof(address[0]);
  uint8_t elems = 0;
  if (memory <= 254) {
    for (uint8_t i = 0; i < memory; i++) {
      if (address[i][0] != 0) {
        elems++;
      }
    }
  }
  else {
    Serial.println("ERROR! Size of array more 255 elements!");
  }
  return elems;
}
boolean get_info(uint8_t elem) {
}
boolean get_data(uint8_t elem) {
  Serial.print("Elem:");
  Serial.print(elem);
  radio.stopListening();
  radio.openWritingPipe(address[elem]);
  boolean tx = false;
  uint8_t data = 101;
  for (uint8_t i = 0; i < 20; i++) {
    tx = radio.write(&data, sizeof(data));
    if (tx) {
      break;
    }
    delay(200);
  }
  radio.startListening();
  if (!tx) {
    Serial.println(" Sensor not talk with me!");
    return false;
  }
  Serial.print(" Sended! ");
  uint8_t i = 0;
  uint8_t pipe = 0;
  while (i < 20) {
    if (radio.available(&pipe)) {
      Serial.print(pipe);
      if (pipe == 3) {
        break;
      }
    }
    i++;
    delay(150);
  }
  if (i < 15) {
    radio.read(&rx_data, sizeof(rx_data));
    Serial.print(" Id: ");
    Serial.print(rx_data.id);
    Serial.print(" Data:");
    Serial.println(rx_data.data);
    return true;
  }
  else {
    Serial.println("Responce not recived!");
    return false;
  }
}
void get_data_all() {
  Serial.println("Start polling sensors!");
  if (pipes_elems() > 4) {
    for (uint8_t i = 4; i <= pipes_elems() - 1; i++) {
      get_data(i);
      delay(20);
    }
  }
  else {
    Serial.println("Not found sensors!");
  }
}
boolean register_() {
  radio.stopListening();
  Serial.print("Scaning:");
  radio.openWritingPipe(address[2]);
  boolean tx = false;
  uint8_t status_ = 200; //200 - granted!
  for (uint8_t i = 0; i < 15; i++) {
    tx = radio.write(&status_, sizeof(status_));
    if (tx) {
      break;
    }
  }
  radio.startListening();
  if (!tx) {
    Serial.println("not found!");
    return false;
  }
  Serial.println("found!");
  uint8_t pipe_r = 0;
  for (uint8_t i = 0; i < 20; i++) {
    if (radio.available(&pipe_r)) {
      if (pipe_r == 2) {
        break;
      }
    }
    delay(200);
  }
  if (pipe_r != 2) {
    Serial.println("REG cansel, respocne not recived!");
    return false;
  }
  radio.read(&reg_pack, sizeof(reg_pack));
  if (reg_pack.id_sensor != 0 or reg_pack.signal_lvl < 100) {//Verifying..
    Serial.println("Reg cansel, sensor not verifyed!");
    return false;
  }
  Serial.println("Sensor OK! Continue reg him!");
  reg_pack.id_sensor = random(1, 230);
  Serial.print("Him new id is:");
  Serial.println(reg_pack.id_sensor);
  radio.stopListening();
  boolean tx_second = false;
  for (uint8_t i = 0; i < 20; i++) {
    tx_second = radio.write(&reg_pack, sizeof(reg_pack));
    if (tx_second) {
      break;
    }
    delay(10);
  }
  if (!tx_second) {
    Serial.println("Reg error, packet not recived!");
    radio.startListening();
    return false;
  }
  Serial.println("Reg OK!");
  radio.startListening();
  memcpy(address[pipes_elems()], reg_pack.person_pipe[0], sizeof(address[0]));
  return true;
}
void setup() {
  Serial.begin(115200);
  radio.begin();
  radio.setAutoAck(true);
  radio.setChannel(120);
  radio.openReadingPipe(1, address[1]);//Alarm pipe
  radio.setAutoAck(1, true);
  radio.openReadingPipe(2, address[2]);//Reg pipe
  radio.setAutoAck(2, true);
  radio.openReadingPipe(3, address[3]);//Data-info pipe
  radio.setAutoAck(3, true);
  radio.openWritingPipe(address[0]);//Trash pipe
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate(RF24_1MBPS);
  radio.startListening();
  radio.powerUp();
  delay(100);
  Serial.println();
  Serial.print("Pipes:");
  Serial.println(pipes_elems());
}

void loop() {
  if (Serial.available() > 0) {
    String buffer_ = Serial.readString();
    if (buffer_ == "tx") {
      Serial.println("Start sending...");
      get_data_all();
    }
    else if (buffer_ == "reg") {
      Serial.println("Start registering...");
      register_();
    }
  }
}
Сенсор:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <EEPROM.h>
#define key 131
uint8_t id_sensor = 0;
uint8_t type_sensor = 1;
RF24 radio(9, 10);
struct message {
  uint8_t id;
  uint8_t type;
  uint8_t data;
};
struct info {
  uint8_t id_sensor;
  uint8_t type_sensor;
  int16_t v_bat;
  uint8_t status_sensor;
  uint8_t signal_lvl;
  uint8_t person_pipe[1][6];
};
message send_data;
info info_data;
const uint8_t v_kef = 100;
uint8_t pipe = 0;
//uint8_t address[][6] = {0xAABBCCDD11LL, 0xAABBCCDD22LL, 0xAABBCCDD33LL, 0xAABBCCDD44LL, 0xAABBCCDD55LL};
uint8_t address[4][6] = {"5Node", "1Node", "2Node", "3Node"}; //0-person pipe; 1-alarms; 2-reg; 3-Info;
void setup() {
  Serial.begin(115200);
  randomSeed(analogRead(0));
  radio.begin();
  radio.setAutoAck(true);
  radio.setChannel(120);
  radio.setRetries(1, 7);
  radio.openReadingPipe(1, address[0]);
  radio.setAutoAck(1, true);
  radio.openWritingPipe(address[3]);
  radio.setDataRate(RF24_1MBPS );
  radio.setPALevel (RF24_PA_MAX);
  //radio.powerUp();
  delay(100);
  if (id_sensor == 0) {
    Serial.println("Sysetm not reg!");
    Serial.println("Starting register...");
    radio.startListening();
    radio.closeReadingPipe(1);
    radio.openReadingPipe(1, address[2]);
    radio.setAutoAck(1, true);
    while (true) {
      Serial.println("Waiting a reg packet!");
      while (true) {
        if (radio.available(&pipe)) {
          if (pipe == 1) {
            Serial.println("Packet resived!");
            break;
          }
        }
        delay(100);
      }
      uint8_t incoming_data = 0;
      radio.read(&incoming_data, sizeof(incoming_data));
      if (incoming_data != 200) {
        Serial.println("Reg not granted!");
        continue;
      }
      Serial.println("Register granted!");
      Serial.println("Configuring packet...");
      float v_batt = 5.5;
      info_data.id_sensor = 0;
      info_data.type_sensor = type_sensor;
      info_data.v_bat = int(v_batt * v_kef);
      info_data.status_sensor = 1;
      info_data.signal_lvl = 250;
      memcpy(info_data.person_pipe[0], address[0], sizeof(info_data.person_pipe[0]));
      Serial.println("Start sending...");
      radio.stopListening();
      radio.openWritingPipe(address[2]);
      boolean send_status = false;
      for (byte i = 0; i < 10; i++) {
        send_status = radio.write(&info_data, sizeof(info_data));
        delay(10);
        if (send_status == true) {
          break;
        }
      }
      radio.startListening();
      if (send_status == false) {
        Serial.println("Send err!");
        continue;
      }
      Serial.println("Responce wait....");
      boolean is_reciv = false;
      for (uint8_t i = 0; i < 20; i++) {
        if (radio.available(&pipe)) {
          if (pipe == 1) {
            is_reciv = true;
            break;
          }
        }
        delay(200);
      }
      if (!is_reciv) {
        Serial.println("Reg ERR, responce not recived!");
        continue;
      }
      Serial.println("Reg OK!");
      radio.read(&info_data, sizeof(info_data));
      id_sensor = info_data.id_sensor;
      Serial.print("My new id:");
      Serial.println(id_sensor);
      radio.closeReadingPipe(1);
      radio.openReadingPipe(1, address[0]);
      radio.setAutoAck(1, true);
      radio.stopListening();
      radio.openWritingPipe(address[3]);
      radio.startListening();
      break;
    }
  }
  radio.powerUp();
}

void loop() {
  if (radio.available()) {
    Serial.println("Data recived!");
    uint8_t incoming_data = 0;
    radio.read(&incoming_data, sizeof(incoming_data));
    if (incoming_data == 101) {
      Serial.println("Request on data get!");
      radio.stopListening();
      boolean status_s = false;
      uint8_t i = 0;
      send_data.id = id_sensor;
      send_data.type = type_sensor;
      send_data.data = random(1, 45);
      while (!status_s && i < 20) {
        delay(10);
        status_s = radio.write(&send_data, sizeof(send_data));
        i++;
      }
      if (status_s) {
        Serial.println("Success! Data sended!");
      }
      else {
        Serial.println("Error! Data not sended!");
      }
      radio.startListening();
    }
    else if (incoming_data == 102) {
      Serial.println("Request on info get!");
      radio.stopListening();
      boolean status_s = false;
      uint8_t i = 0;
      float v_batt = 5.5;
      info_data.id_sensor = id_sensor;
      info_data.type_sensor = type_sensor;
      info_data.v_bat = int(v_batt * v_kef);
      info_data.status_sensor = 1;
      info_data.signal_lvl = 250;
      while (!status_s && i < 20) {
        delay(10);
        status_s = radio.write(&info_data, sizeof(info_data));
        i++;
      }
      if (status_s) {
        Serial.println("Success! Data sended!");
      }
      else {
        Serial.println("Error! Data not sended!");
      }
      radio.startListening();
    }
  }
}
Сенсор у меня Arduino nano, База NodeMCU 1.0;
"Проблема" а точнее не правильную работу заметно начиная с двух устройств в схеме.
Вот так выглядит лог с одним сенсором(черная консоль это сенсор, а порт ардуино иде это база).
С одним сенсором.png
Но вот с подключением в сети второго сенсора(точно такой же только питание nrf24l01+ без кондера 😜 и от "ЛБП", на первом сенсоре все спаяно и с керамикой и электролитом) начинаются недолеты пакетов, причем оно вроде странно, а вроде предсказуемо тип вначале первый отваливаеться, потом второй, потом все ок и так по кругу.
С двумя сенсором.png
Поскольку второй сенсор сидит на розетке и отдельно на "ЛБП" то его лога по выше указанным причинам нету 🙃
Помогите пожалуйста! Ибо хочется верить в проблемы с питанием, но верится с трудом !
 

Fleshdeck

★★★✩✩✩✩
19 Янв 2019
349
174
Киев
@Evgeniy2020, я тоже сталкивался с похожими проблемами, мне помог переход на библиотеку RF24 Network, но и там не все так гладко как хотелось бы, мне сложно было найти просто работающую библиотеку
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@Evgeniy2020, я тоже сталкивался с похожими проблемами, мне помог переход на библиотеку RF24 Network, но и там не все так гладко как хотелось бы, мне сложно было найти просто работающую библиотеку
Да, я бы тоже скорее всего юзал RF24 Network но я хотел бы сделать распределенную сеть. А при исп. этой либы получаеться при выходе из строя одного родителя парализуется работа его дочерних сенсоров
 

Fleshdeck

★★★✩✩✩✩
19 Янв 2019
349
174
Киев

@Evgeniy2020,
С обычной библиотекой можно подключить 5 или 6 модулей одновременно,точно не помню, так что никакой распределенной сети не получится сделать, RF24Network хорошая библиотека, да, есть момент с надежностью, но я думаю если правильно сгруппировать устройства то все будет нормально
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0

@Evgeniy2020,
С обычной библиотекой можно подключить 5 или 6 модулей одновременно,точно не помню, так что никакой распределенной сети не получится сделать, RF24Network хорошая библиотека, да, есть момент с надежностью, но я думаю если правильно сгруппировать устройства то все будет нормально
Это я понимаю, но я задействую только 3 трубы на чтение для этого! Вся информация идет в одну трубу, но идет она по запросу на персональную трубу. Тобиж у каждого датчика есть своя труба буквально рандомная, при приходе некого байта датчик шлет ответ в четко оговоренную трубу. База же принимает пакет. Накладок быть не может ведь база отослала запрос и ждет ответ в течении некоторого времени, а только потом шлет запрос на следующий сенсор !

UPD:
Сейчас 19:38 по моему месному. Спаял вторую систему, повесил только керамику. Работает все также. Заметил одну вещь! При отправке пакета на esp8266 мигает его светодиод! Но бывает что он не мигает в это время как раз у него и ошибка нету ответа! Возможно модуль просто подвисает питание ведь от USB ?
19:41 вроде уже мигает все правильно :) наверное привиделось!
22:47 Вопрос по прежнему открыт.Из-за чего могут быть такие циклические сбои, на что мне обратить внимание или что исправить ?
 

Fleshdeck

★★★✩✩✩✩
19 Янв 2019
349
174
Киев
@Evgeniy2020, нужно не забывать что esp8266 работает с WIFI, а это значит что ядро в любое время по прерыванию обрабатывает радио часть, а это значит что пользовательский код не обрабатывается
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@Fleshdeck,
@Evgeniy2020, нужно не забывать что esp8266 работает с WIFI, а это значит что ядро в любое время по прерыванию обрабатывает радио часть, а это значит что пользовательский код не обрабатывается
В коде нету прямого или косвенного обращения к wifi. Но это не мешает выполнятся настройкам которые были внесены когда-то с помощью wifi.begin();

Может быть в этом и есть проблема, но радиомодуль должен сам аппаратно принимать пакеты, а МК сам когда закончит с wifi посмотрит и увидит что в буфере лежыт пакет. Вообщем вопросов все больше, а ответов все меньше 😭
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
Вот тут у тебя правильное число выходит ?
uint8_t memory = sizeof(address) / sizeof(address[0]);
Вроде да, но вроде бы моя функция влияет только на индексы. Больше вроде негде не юзал её. (Сделал ее из-за того что не нашел такую функцию в c++).
Тест.png
Такую строчку видел на многих сайтах, да и вроде проверял на самой дуне работает норм. Вот думаю может autoack отключить ....
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Да, уже нашел строку, где ты проверяешь подсчет рабочих труб. но надо бы проверить. верное ли кол-во идет
Так пока логику не пойму полностью. Вроде бы есть и регистрация и получение данных, переключение с сериала идет.
Распиши логику работы с одним датчиком подробнее, особенно работу модулей нрф, когда и как включается и в каком режиме работает. от включения до конца
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
Да, уже нашел строку, где ты проверяешь подсчет рабочих труб. но надо бы проверить. верное ли кол-во идет
Так пока логику не пойму полностью. Вроде бы есть и регистрация и получение данных, переключение с сериала идет.
Распиши логику работы с одним датчиком подробнее, особенно работу модулей нрф, когда и как включается и в каком режиме работает. от включения до конца
База:
Включается и чилит.
Открывает несколько труб для тревог, для получения инфы, и для регистрации
При попадании в сериал tx проверяет есть ли зареганные датчики если есть начинает опрос, если нету пишет что мол нету датчиков.
Все время база ждёт данных по трубе тревог.
При попадании reg мы начинаем регать датчик.
Запрос инфы:
База отключает прием. Открывает трубу для датчика( у каждого датчика своя труба)
И шлёт пакет 101 тип запрос информации напр температуры. И ждёт данных с трубы для данных. Если пришли то классно если нет то плохо, и всё это крутиться в цыкле в функции get_data_all.
Регистрация:
Отключаем прием, шлем 200 в эфир. Сенсор если получил код 200 то шлет пакет с инфой о себе( там и есть тип его персональная труба). Потом база етот пакет заполняет рандомным id и шлёт опять в трубу для регистрации если пакет дошел значит записиваем в массив труб новую трубу.И после этого можно его опрашивать.

Сенсор:
Включается и чилит.
Открывает трубу на чтение если не зареган. И ждёт пакет 200 от базы. Если пришол формирует пакет своей инфы и шлёт на базу. Ждёт ответа проверяет если это нашы данные то сохраняем id и переходим в loop.
В лупе мы там опрашиваем датчики и тд если тревога шлем в трубу для тревог.
Если пришел запрос тогда чекаем что пришло если 101 тогда выключаем прослушивание и шлем в трубу для инфы инфу. Включаем прослушивание и чилим дальше.
Как то так) (пишу на мобиле могут быть ошибки )
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Как то непонятно... Как бы я видел это, примерно

База висит на прием по определенному адресу - адресу регистрации новых сенсоров.

Сенсор включается и пишет по этому адресу регистрации запрос на регистрацию. При прошивке видимо надо указать уникальный id или дергать его откуда то. номера есть разные. Если запрос без ответа или ответ отрицательный новое обращение через таймаут. после N таймаутов можно выключаться например. При удаче сенсор идет в режим приема и все остальное время находится в нем, до перезагрузки. В запросе на регистрацию можно указывать тип датчика, время его опроса.

База принимает запрос, проверяет сенсор. При допустимости ему назначается труба из доступных и отправляет его ответом с подтверждением регистрации или отбоем. В это время запросы от других датчиков запрещены. Процедура регистрации закончена. База дальше слушает эфир. Если этот датчик уже был зарегистрирован ранее, то ему можно просто восстановить трубу и все.

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

Что будет если сразу захотят зарегистрироваться 2,3 и более новых датчиков ? не знаю, надо смотреть что будет со связью.
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
@Старик Похабыч,
Как то непонятно... Как бы я видел это, примерно



База висит на прием по определенному адресу - адресу регистрации новых сенсоров.



Сенсор включается и пишет по этому адресу регистрации запрос на регистрацию. При прошивке видимо надо указать уникальный id или дергать его откуда то. номера есть разные. Если запрос без ответа или ответ отрицательный новое обращение через таймаут. после N таймаутов можно выключаться например. При удаче сенсор идет в режим приема и все остальное время находится в нем, до перезагрузки. В запросе на регистрацию можно указывать тип датчика, время его опроса.



База принимает запрос, проверяет сенсор. При допустимости ему назначается труба из доступных и отправляет его ответом с подтверждением регистрации или отбоем. В это время запросы от других датчиков запрещены. Процедура регистрации закончена. База дальше слушает эфир. Если этот датчик уже был зарегистрирован ранее, то ему можно просто восстановить трубу и все.



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



Что будет если сразу захотят зарегистрироваться 2,3 и более новых датчиков ? не знаю, надо смотреть что будет со связью.
В моей схеме(при регистрации) два приводят к бану) они путают пакеты и это нездорово но, тогда просто не регать два датчика сразу =)

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



Также появились другие идеи как кроме переписать все с нуля.

Напр проверить систему при setAutoAck(false);(или как-то так пишется) может так снижу нагрузку на сеть?

Или сделать передачу информации в пакете подтверждения ?

Или у меня модули паленый ? или код кривой ?

Или мне попробовать юзать RadioHead (вроде слышал что классная библиотека) ?

------------------------------------------------------------------------UPD-------------------------------------------------------------------------------------------------

Хах! даже с достаточно простым кодом оно работает также =)

C++:
#include <SPI.h>

#include "nRF24L01.h"

#include "RF24.h"

RF24 radio(D4, D8);

struct message {

  uint8_t id;

  uint8_t type;

  uint8_t data;

};

struct info_ {

  uint8_t id_sensor;

  uint8_t type_sensor;

  int16_t v_bat;

  uint8_t status_sensor;

  uint8_t signal_lvl;

  uint8_t person_pipe[1][6];

};

message rx_data;

info_ reg_pack;

uint8_t address[20][6] = {"0Node", "1Node", "2Node", "3Node", "5Node", "9Node"}; //0-Заглушка;1-Alarms;2-Reg; 3-Get_data; Another sesors!

boolean get_data_all() {

  radio.stopListening();

  radio.powerUp();

  radio.openWritingPipe(address[4]);

  uint8_t data = 101;

  boolean tx = radio.write(&data, sizeof(data));

  Serial.print("TX status:");

  Serial.println(tx);

  radio.startListening();

  uint8_t i = 0;

  while (i < 15) {

    if (radio.available()) {

      break;

    }

    i++;

    delay(150);

  }

  if (i == 15) {

    Serial.println("1 sensor ban =(");

  }

  else {

    message rx_firsth;

    Serial.print("Data recived! ");

    radio.read(&rx_firsth, sizeof(rx_firsth));

    Serial.print("Id:");

    Serial.print(rx_firsth.id);

    Serial.print(" Data:");

    Serial.print(rx_firsth.data);

  }

  delay(150);

  radio.stopListening();

  radio.powerUp();

  radio.openWritingPipe(address[5]);

  uint8_t data2 = 101;

  boolean tx2 = radio.write(&data2, sizeof(data2));

  Serial.print("TX2 status:");

  Serial.println(tx2);

  radio.startListening();

  uint8_t i2 = 0;

  while (i2 < 15) {

    if (radio.available()) {

      break;

    }

    i2++;

    delay(150);

  }

  if (i2 == 15) {

    Serial.println("2 sensor ban =(");

  }

  else {

    message rx_two;

    Serial.print("Data recived! ");

    radio.read(&rx_two, sizeof(rx_two));

    Serial.print("Id:");

    Serial.print(rx_two.id);

    Serial.print(" Data:");

    Serial.print(rx_two.data);

  }

  return true;

}

void setup() {

  Serial.begin(115200);

  radio.begin();

  radio.setAutoAck(true);

  radio.setChannel(120);

  radio.openReadingPipe(1, address[1]);

  radio.setAutoAck(1, true);

  radio.openReadingPipe(2, address[2]);//Reg pipe

  radio.setAutoAck(2, true);

  radio.openReadingPipe(3, address[3]);//Data-info pipe

  radio.setAutoAck(3, true);

  radio.openWritingPipe(address[0]);//Trash pipe

  radio.setRetries(3, 15);

  radio.setPALevel (RF24_PA_MAX);

  radio.setDataRate(RF24_1MBPS);

  radio.startListening();

  radio.powerUp();



}



void loop() {

  if (Serial.available() > 0) {

    String buffer_ = Serial.readString();

    if (buffer_ == "tx") {

      Serial.println("Start sending...");

      get_data_all();

    }

  }

}

C++:
#include <SPI.h>

#include "nRF24L01.h"

#include "RF24.h"

RF24 radio(9, 10);

uint8_t id_sensor = 19;

uint8_t type_sensor = 1;

struct message {

  uint8_t id;

  uint8_t type;

  uint8_t data;

};

struct info_ {

  uint8_t id_sensor;

  uint8_t type_sensor;

  int16_t v_bat;

  uint8_t status_sensor;

  uint8_t signal_lvl;

  uint8_t person_pipe[1][6];

};

message rx_data;

info_ reg_pack;

uint8_t address[20][6] = {"0Node", "1Node", "2Node", "3Node", "5Node", "9Node"}; //0-Заглушка;1-Alarms;2-Reg; 3-Get_data; Another sesors!

void setup() {

  Serial.begin(115200);

  radio.begin();

  radio.setAutoAck(true);

  radio.setChannel(120);

  radio.openReadingPipe(1, address[5]);

  radio.setAutoAck(1, true);

  radio.openWritingPipe(address[3]);

  radio.setRetries(3, 15);

  radio.setPALevel (RF24_PA_MAX);

  radio.setDataRate(RF24_1MBPS);

  radio.startListening();

  radio.powerUp();



}



void loop() {

  if (radio.available()) {

    uint8_t lol = 0;

    radio.read(&lol, sizeof(lol));

    Serial.println("Radio available!");

    radio.stopListening();

    radio.powerUp();

    radio.openWritingPipe(address[3]);

    message mess;

    mess.id = id_sensor;

    mess.type = type_sensor;

    mess.data = (uint8_t)random(1,20);

    boolean tx = radio.write(&mess, sizeof(mess));

    Serial.print("Send status:");

    Serial.println(tx);

    radio.startListening();

  }

}

Лог_upd.png
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
А попробовать разделить регистрацию ? и в отсылаемом сообщении указывать ID, что бы при чтении, если данные попали к обоим сенсорам можно было понять свой-чужой ?
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
А попробовать разделить регистрацию ? и в отсылаемом сообщении указывать ID, что бы при чтении, если данные попали к обоим сенсорам можно было понять свой-чужой ?
Да можно было б, но я хотел что б ID был как бы просто номером устройства только в этой сети. Тогда можно было б при регистрации передавать например серийный номер, но у Дуни нету с завода уникального серийника. Поэтому можно было б при прошивке указывать его или отдельной прошивкой загонять в EEPROM. И тогда использовать для регистрации.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Ну дальше надо думать как интереснее. Сенсоры все одно прошивать. Если сам задаешь номер (надо еще посмотреть, ведь уникальный номер точно должен быть у NRF), то это просто и сразу решаешь некие проблемы. Может и логика измениться с этим.
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
91
0
Ну дальше надо думать как интереснее. Сенсоры все одно прошивать. Если сам задаешь номер (надо еще посмотреть, ведь уникальный номер точно должен быть у NRF), то это просто и сразу решаешь некие проблемы. Может и логика измениться с этим.
На счет серийного у nrf не чего не нашел =(
1595942852703.png
Точно такой же результат =) но код опять же другой :cry:
Прочитал на заумных форумах что можно переинициализировать радио модуль.
База:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(D4, D8);
struct message {
  uint8_t id;
  uint8_t type;
  uint8_t data;
};
struct info_ {
  uint8_t id_sensor;
  uint8_t type_sensor;
  int16_t v_bat;
  uint8_t status_sensor;
  uint8_t signal_lvl;
  uint8_t person_pipe[1][6];
};
message rx_data;
info_ reg_pack;
uint8_t address[20][6] = {"0Node", "1Node", "2Node", "3Node", "5Node", "9Node"}; //0-Заглушка;1-Alarms;2-Reg; 3-Get_data; Another sesors!
void radio_init() {
  radio.begin();
  radio.setAutoAck(true);
  radio.setChannel(120);
  radio.openReadingPipe(1, address[1]);
  radio.setAutoAck(1, true);
  radio.openReadingPipe(2, address[2]);//Reg pipe
  radio.setAutoAck(2, true);
  radio.openReadingPipe(3, address[3]);//Data-info pipe
  radio.setAutoAck(3, true);
  radio.openWritingPipe(address[0]);//Trash pipe
  radio.setRetries(3, 15);
  radio.setPALevel (RF24_PA_LOW);
  radio.setDataRate(RF24_250KBPS);
  radio.startListening();
  radio.powerUp();
}
boolean get_data_all() {
  radio_init();
  radio.stopListening();
  radio.powerUp();
  radio.openWritingPipe(address[4]);
  uint8_t data = 101;
  boolean tx = radio.write(&data, sizeof(data));
  Serial.print("TX status:");
  Serial.println(tx);
  radio.startListening();
  uint8_t i = 0;
  while (i < 15) {
    if (radio.available()) {
      break;
    }
    i++;
    delay(150);
  }
  if (i == 15) {
    Serial.println("1 sensor ban =(");
  }
  else {
    message rx_firsth;
    Serial.print("Data recived! ");
    radio.read(&rx_firsth, sizeof(rx_firsth));
    Serial.print("Id:");
    Serial.print(rx_firsth.id);
    Serial.print(" Data:");
    Serial.print(rx_firsth.data);
  }
  delay(150);
  radio.stopListening();
  radio.powerUp();
  radio.openWritingPipe(address[5]);
  uint8_t data2 = 101;
  boolean tx2 = radio.write(&data2, sizeof(data2));
  Serial.print("TX2 status:");
  Serial.println(tx2);
  radio.startListening();
  uint8_t i2 = 0;
  while (i2 < 15) {
    if (radio.available()) {
      break;
    }
    i2++;
    delay(150);
  }
  if (i2 == 15) {
    Serial.println("2 sensor ban =(");
  }
  else {
    message rx_two;
    Serial.print("Data recived! ");
    radio.read(&rx_two, sizeof(rx_two));
    Serial.print("Id:");
    Serial.print(rx_two.id);
    Serial.print(" Data:");
    Serial.print(rx_two.data);
  }
  return true;
}
void setup() {
  Serial.begin(115200);
  radio_init();
}

void loop() {
  if (Serial.available() > 0) {
    String buffer_ = Serial.readString();
    if (buffer_ == "tx") {
      Serial.println("Start sending...");
      get_data_all();
    }
  }
}
Cенсор:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10);
uint8_t id_sensor = 10;
uint8_t type_sensor = 1;
struct message {
  uint8_t id;
  uint8_t type;
  uint8_t data;
};
struct info_ {
  uint8_t id_sensor;
  uint8_t type_sensor;
  int16_t v_bat;
  uint8_t status_sensor;
  uint8_t signal_lvl;
  uint8_t person_pipe[1][6];
};
message rx_data;
info_ reg_pack;
uint8_t address[20][6] = {"0Node", "1Node", "2Node", "3Node", "5Node", "9Node"}; //0-Заглушка;1-Alarms;2-Reg; 3-Get_data; Another sesors!
void radio_init() {
  radio.begin();
  radio.setAutoAck(true);
  radio.setChannel(120);
  radio.openReadingPipe(1, address[4]);
  radio.setAutoAck(1, true);
  radio.openWritingPipe(address[3]);
  radio.setRetries(3, 15);
  radio.setPALevel (RF24_PA_LOW);
  radio.setDataRate(RF24_250KBPS);
  radio.startListening();
  radio.powerUp();
}
void setup() {
  Serial.begin(115200);
  radio_init();
}

void loop() {
  if (radio.available()) {
    uint8_t lol = 0;
    radio_init();
    delay(10);
    radio.read(&lol, sizeof(lol));
    Serial.println("Radio available!");
    radio.stopListening();
    radio.powerUp();
    radio.openWritingPipe(address[3]);
    message mess;
    mess.id = id_sensor;
    mess.type = type_sensor;
    mess.data = (uint8_t)random(1, 20);
    boolean tx = radio.write(&mess, sizeof(mess));
    Serial.print("Send status:");
    Serial.println(tx);
    radio.startListening();
  }
}
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
В примерах стартовый кож есть. там выводятся 2 строки которые надо покопать:
RX_ADDR_P0-1 = 0xe8e8f0f0e1 0xe8e8f0f0a2
RX_ADDR_P2-5 = 0xa2 0xc4 0xc5 0xc6
их выводит функция
radio.printDetails();
 
  • Красота! +2
Реакции: Evgeniy2020