УМНЫЙ ДОМ [РЕШЕНО] Nrf24l01+ и esp8266 и туда же arduino nano

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
40
0
Всем привет! Столкнулся с проблемой того что модуль имеет всего 6 каналов для связи. Погуглил и нашел несколько схем решения. RF network не рассматриваю так как велик шанс отказа системы в любом узле. Другие схемы тож отмёл осталась идеальная для моей цели. Финт заключается в том что база знает адреса всех "датчиков" и периодически с ними связывается, назовём это штатной работой и также параллельно штатной работе мы держим еще две трубы для чего-то важного например тревог или регистрации нового датчика для системы. Пока что только начал реализовывать и сразу проблема =) вообщем:
Код передатчика ("датчика"):
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);
byte sent = key;
struct message {
  byte id;
  byte type;
  byte data;
};
message send_data;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
void setup() {
 // Serial.begin(9600);
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, address[0]);
  radio.openReadingPipe(2, address[1]);
  radio.setChannel(0x60);
  radio.powerUp();
  radio.startListening();
  delay(100);
  if (id_sensor == 0) {
    //Serial.println("Sensor null!!!");
    radio.stopListening();
    delay(10);
    //Start send te reg message
    radio.openWritingPipe(address[1]);
    delay(10);
    boolean send_status = false;
    int i = 0;
    //Serial.println("Start sending reg packet!");
    while (!send_status && i < 600) {
      send_status = radio.write(&sent, sizeof(sent));
      delay(100);
      i++;
      //Serial.println(".");
    }
    //Serial.println("Sended!");
    radio.startListening();
    delay(10);
    //Serial.println("Starting reciving");
    while (!radio.available()) {
      delay(50);
    }
    //Data recived!
    //Serial.println("DATA OK");
    radio.read(&sent, sizeof(sent));
    delay(10);
    id_sensor = sent;
    radio.closeReadingPipe(2);
    delay(10);
    radio.stopListening();
    delay(10);
    radio.openWritingPipe(address[0]);
    delay(10);
    radio.startListening();
    delay(10);
    //Serial.println("All start ok!");
  }
}
void loop() {
  if ( radio.available() ) {
    byte keyy = 0;
    radio.read(&keyy, sizeof(keyy));
    if (keyy == key) {
      //Serial.println("KEY OK");
      radio.stopListening();
      send_data.id = id_sensor;
      send_data.type = type_sensor;
      send_data.data = random(5, 31);
      radio.write(&send_data, sizeof(send_data));
      delay(10);
      radio.startListening();
    }
  }
}
Код приемника (базы):
C++:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
#define key 201
struct message {
  byte id;
  byte type;
  byte data;
};
byte pipe = 0;
message rx_data;
RF24 radio(D4, D8);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setPayloadSize(32);
  radio.openReadingPipe(1, address[0]);
  radio.openReadingPipe(2, address[1]);
  radio.setChannel(0x60);
  //radio.setRetries(5,10);
  radio.powerUp();
  radio.startListening();
}
boolean send_request(byte addr) {
  radio.stopListening();
  delay(10);
  radio.openWritingPipe(address[addr]);
  delay(10);
  byte data = key;
  byte i = 0;
  boolean status_ = false;
  while (!status_ && i < 5) {
    status_ = radio.write(&data, sizeof(data));
    i++;
    delay(1);
  }
  if (status_) {
    Serial.print("Request ok, retries: ");
    Serial.println(i);
    return true;
  }
  else {
    Serial.println("Request error");
    return false;
  }
}
void loop() {
  if (Serial.available() > 0) {
    String bufer = Serial.readString();
    if (bufer == "tx") {
      byte sensor = 0;
      Serial.println("Sending....");
      send_request(sensor);
      radio.startListening();
    }
  }
  if ( radio.available(&pipe) ) {
    if (pipe == 2) {
      byte reg = 0;
      radio.read(&reg, sizeof(reg));
      Serial.println("New module start register!");
      radio.stopListening();
      delay(10);
      radio.openWritingPipe(address[1]);//New pipe for send packet register to arduino
      delay(10);
      if (reg == key) {
        Serial.println("Yeah he wont register!");
        byte sent_id = 201;
        boolean send_status = false;
        int i = 0;
        while (!send_status && i < 100) {
          send_status = radio.write(&sent_id, sizeof(sent_id));
          delay(50);
          i++;
        }
        if (send_status) {
          Serial.println("REG OK");
        }
        else {
          Serial.println("REG ERR");
        }
        delay(50);
      }
      radio.startListening();
    }
    else {
      radio.read(&rx_data, sizeof(rx_data));
      delay(10);
      Serial.print("Resived data from:");
      Serial.print(rx_data.id);
      Serial.print("with message:");
      Serial.print(rx_data.data);
      Serial.println("");
    }
  }
}
Это одна из версий да написано коряво были более красивые) но не рабочие так что пока так потом сделаю по красивее =)
Ну а теперь проблема )
Проблема:
В сериал порте базы наблюдаем такую картину:
19:17:03.579 -> Sending....
19:17:03.850 -> Request error
19:17:24.041 -> Sending....
19:17:24.312 -> Request error
19:17:40.655 -> New module start register!
19:17:40.655 -> Yeah he wont register!
19:17:40.788 -> REG OK
19:18:51.323 -> Sending....
19:18:51.358 -> Request ok, retries: 1
19:18:51.358 -> Resived data from:201with message:16
19:19:10.308 -> Sending....
19:19:10.341 -> Request ok, retries: 1
19:19:10.341 -> Resived data from:201with message:22
19:19:16.805 -> Sending....
19:19:16.852 -> Request ok, retries: 1
19:19:16.852 -> Resived data from:201with message:10
Где-то здесь я выключил датчик и самое интересно что база не написала что датчик зарегался в системе (тип как-будто новый датчик) а после одного пакета
начинает работать так как нужно) хотя по идеи база даже не знает что он уже "в сети"
19:20:37.765 -> Sending....
19:20:37.798 -> Request ok, retries: 1
19:20:46.813 -> Sending....
19:20:46.847 -> Request ok, retries: 1
19:20:46.847 -> Resived data from:201with message:16
19:21:00.771 -> Sending....
19:21:00.818 -> Request ok, retries: 1
19:21:00.818 -> Resived data from:201with message:22
21:12:00.233 -> Sending....
21:12:00.267 -> Request ok, retries: 1
21:12:04.989 -> Sending....
21:12:05.022 -> Request ok, retries: 1
21:12:05.022 -> Resived data from:201with message:16
Я уверен что ошибка в коде но просто я раза три его переписывал, а реакция точно такая же, а бывает наоборот что прекрасно работает раза три точно (подряд) регался все было видно на базе и работало все дальше безупречно ( то есть не было этого пустого ответа )

Извиняюсь, не точно выразился. Вообщем если отключить датчик и заново включить, с какой-то вероятностью в ком порте базы не будет не малейшего намека на то что она нашла новое устройство, но грубо говоря если слать пакеты в слепую то датчик отвечает тоесть он дошел до void loop но как)))) если база вроде как не получала от него пакета регистрации
 

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

★★★★★✩✩
14 Авг 2019
1,435
353
Москва
Для NRF очень , даже ОЧЕНЬ , важно качественное подключение. у меня на плате есть передатчик, а на макетке есть приемник. Все ГАРАНТИРОВАННО ПРАВИЛЬНО собрано, но даже при этом бывают сбои. Приходиться шаманить с поджимом проводов на макетке. Хорошо хоть передатчик запаял и забыл.
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
40
0
Для NRF очень , даже ОЧЕНЬ , важно качественное подключение. у меня на плате есть передатчик, а на макетке есть приемник. Все ГАРАНТИРОВАННО ПРАВИЛЬНО собрано, но даже при этом бывают сбои. Приходиться шаманить с поджимом проводов на макетке. Хорошо хоть передатчик запаял и забыл.
Передатчик у меня паяный, база на макетке ввиду того что модули подключенные к базе могут меняется. Но по вашему совету базу спаяю. Важно другое) код у меня правильный ?)
 
Последнее редактирование:

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
40
0
Вообщем всю ночь думал) таки ошибку одну нашел, на передатчике мы не проверяем что данные пришли во вторую трубу и берем любой байт соответственно когда мы слали запрос на получение инфы то отсылали байт, и передатчик его брал за ответ и дальше продолжал работу. Теперь вопрос остался почему тогда база не отвечает на его пакеты......
 

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

★★★★★✩✩
14 Авг 2019
1,435
353
Москва
первое что увидел, так то, что передатчик слушает эфир
radio.startListening();
второе , на 250кб не работает подтверждение приема. на 1 и 2 мбит.
я наверное не очень понимаю, что ты хочешь сделать в передатчике..
На всякий прикрепил ниже свой пример работы с одним приемником и несколькими передатчиками. До 5 штук. всего в сети 6 NRF может быть. Посмотри код, он с подтверждениями работает
 

Вложения

  • 1.2 KB Просмотры: 5
  • 710 байт Просмотры: 5
Последнее редактирование:
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
40
0
первое что увидел, так то, что передатчик слушает эфир
radio.startListening();
второе , на 250кб не работает подтверждение приема. на 1 и 2 мбит.
я наверное не очень понимаю, что ты хочешь сделать в передатчике..
На всякий прикрепил ниже свой пример работы с одним приемником и несколькими передатчиками. До 5 штук. всего в сети 6 NRF может быть. Посмотри код, он с подтверждениями работает
Я щас проверить не смогу, то попозже обезательно проверю. Суть моего кода это обход ограничения на 6 модулей в системе. Тоесть передатчик у меня должен все время ждать запрос от базы а потом кидать ей ответ а в ответе вся инфа тип температуры и тд. У базы есть напр массив адресов по которым она проходит и отслилает пакет, потом ждёт ответа себе где-то пишет и закрывает эту трубу открывает другую и так далее.
Поэтому передатчик должен слушать, а потом переключатся и отвечать. Отвечает он ПРЕКРАСНО, и вроде пакет приёма работает у меня. Тоесть я проверял
C++:
radio.write();
- возвращает false если датчик в отключке. Самая важная проблема почему он не всегда проходит регистрацию, тобиж кто то кого-то игнорит) а кто что почему, я не знаю:cry:
 

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

★★★★★✩✩
14 Авг 2019
1,435
353
Москва
он может ответить пакетом данных,но функция write может возвращать тру только при 1 и 2 мбитах передачи. в доках так написано

а что будет если регистрация пойдет в момент когда база сама передает ? как ты эти коллизии пытаешься разрулить?
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
40
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
1,435
353
Москва
Можно. Но вот для integer в разных платах могут и разных компиляторах данные могут быть в 2 и 4 байта. Я перешел на однозначные типы int8_t , uint16_t и другие , байт и так однозначен, но что бы не смущать себя пишу единообразно.
 
  • Красота! +2
Реакции: Evgeniy2020

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
40
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]);
Так что буду юзать так)
 
Последнее редактирование:

Matadon

✩✩✩✩✩✩✩
6 Окт 2019
11
0
Ребят, по теме NRF24L01
Купил себе 2 таких с антенкой
Сижу эксперименирую и столкнулся с одним интересным глюком
Взял для примера скетч Гайвера, где передатчик наматывает counter и отправляет его на приёмник, а с того, в свою очередь, в мониторе порта смотрю на эти "растущие" циферки)
И всё было вроде хорошо, меня радовало, что понемногу начинаю понимать принцип работы т.к. с радио модулями работаю в первый раз, но стоило мне подключить их к разным источникам питания - всё
Передатчик вроде передаёт, диод мигает (поставил паузу перед каждой отправкой 1 сек), а вот в мониторе порта приёмника ничего
Кто-нибудь сталкивался с подобной ситуацией?
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
40
0
Ребят, по теме NRF24L01
Купил себе 2 таких с антенкой
Сижу эксперименирую и столкнулся с одним интересным глюком
Взял для примера скетч Гайвера, где передатчик наматывает counter и отправляет его на приёмник, а с того, в свою очередь, в мониторе порта смотрю на эти "растущие" циферки)
И всё было вроде хорошо, меня радовало, что понемногу начинаю понимать принцип работы т.к. с радио модулями работаю в первый раз, но стоило мне подключить их к разным источникам питания - всё
Передатчик вроде передаёт, диод мигает (поставил паузу перед каждой отправкой 1 сек), а вот в мониторе порта приёмника ничего
Кто-нибудь сталкивался с подобной ситуацией?
Если у вашего питания 5в и 3в земля НЕ общая то могут быть такие приколы, а в остальном должно работать. Если у вас земля не общая, соедините её
 

Matadon

✩✩✩✩✩✩✩
6 Окт 2019
11
0
Если у вашего питания 5в и 3в земля НЕ общая то могут быть такие приколы, а в остальном должно работать. Если у вас земля не общая, соедините её
Дело в том, что мне их нужно использовать на приличном расстоянии, для проекта одного и общая земля там просто физически нереализуема
И оба от 3.3v через адаптер работают
НО через джамперы, хотя и с теми на общем питании работало, а на разных источниках - нет
 

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

★★★★★✩✩
14 Авг 2019
1,435
353
Москва
не совсем понятно. у тебя приемник+ардуино и передатчик+ардуино вообще не должны никак быть связаны проводами, только по эфиру. А вот у каждой пары обязательно должна быть общая земля.

Из советов. уменьшить мощность на минимум. Если питание на ахти, то при максимальной может глючить.
 

Matadon

✩✩✩✩✩✩✩
6 Окт 2019
11
0
не совсем понятно. у тебя приемник+ардуино и передатчик+ардуино вообще не должны никак быть связаны проводами, только по эфиру. А вот у каждой пары обязательно должна быть общая земля.

Из советов. уменьшить мощность на минимум. Если питание на ахти, то при максимальной может глючить.
Есть две ардуинки нано, к каждой прицеплен NRF24L01 с антенной, на одну арду залит скетч TX, на другую RX соответственно
Они расположены в одной комнате (расстояние менее 2 м)
Когда подключаю каждую в USB одного ПК - работают
Как только подключаю TX "дуэт" к БП, а RX "дуэт" оставляю в USB для монитора порта - всё, приём не идёт, но на TX стороне ежесекундно мигает светодиод т.е. отправка идёт

Есть нюанс - стоит прям совсем рядом роутер, двухдиапазонник, может ли он создавать такой шум, если я подключаю ребят с разных источников питания?
 

Matadon

✩✩✩✩✩✩✩
6 Окт 2019
11
0
не совсем понятно. у тебя приемник+ардуино и передатчик+ардуино вообще не должны никак быть связаны проводами, только по эфиру. А вот у каждой пары обязательно должна быть общая земля.

Из советов. уменьшить мощность на минимум. Если питание на ахти, то при максимальной может глючить.
Есть сдвиги...

1600468528240.png

Что-то начал ловить, но пропускает
Хотя я ничего не менял пока
Это при:
C++:
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_1MBPS);
 
Последнее редактирование:

Matadon

✩✩✩✩✩✩✩
6 Окт 2019
11
0
не совсем понятно. у тебя приемник+ардуино и передатчик+ардуино вообще не должны никак быть связаны проводами, только по эфиру. А вот у каждой пары обязательно должна быть общая земля.

Из советов. уменьшить мощность на минимум. Если питание на ахти, то при максимальной может глючить.
А теперь картина вообще интересная...
C++:
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_2MBPS);
Сделал так на обоих и теперь на разных источниках питания работает
Это как бы и эврика и проблема одновременно т.к. в перспективе мне нужно будет использовать их на дальних дистанциях, чего не реализуешь при 2Mbps, а когда сделал 250Kbps на обоих поведение было вообще непонятно и необъяснимо:
Приёмник в USB со включённым монитором порта и как только я включаю передатчик, на ПК, с интервалом примерно 5-7 сек, система воспроизводит звук отключения устройства, будто я отключаю приёмник o_O
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
40
0
А теперь картина вообще интересная...
C++:
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_2MBPS);
Сделал так на обоих и теперь на разных источниках питания работает
Это как бы и эврика и проблема одновременно т.к. в перспективе мне нужно будет использовать их на дальних дистанциях, чего не реализуешь при 2Mbps, а когда сделал 250Kbps на обоих поведение было вообще непонятно и необъяснимо:
Приёмник в USB со включённым монитором порта и как только я включаю передатчик, на ПК, с интервалом примерно 5-7 сек, система воспроизводит звук отключения устройства, будто я отключаю приёмник o_O
Устройство наверное много потребляет при максимальной скорости и мощности и ПК решает отключить такого мощного потребителя
Ещё для самоуспокоения можно намотать провод на антену)
 

Evgeniy2020

✩✩✩✩✩✩✩
12 Июл 2020
40
0
А теперь картина вообще интересная...
C++:
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_2MBPS);
Сделал так на обоих и теперь на разных источниках питания работает
Это как бы и эврика и проблема одновременно т.к. в перспективе мне нужно будет использовать их на дальних дистанциях, чего не реализуешь при 2Mbps, а когда сделал 250Kbps на обоих поведение было вообще непонятно и необъяснимо:
Приёмник в USB со включённым монитором порта и как только я включаю передатчик, на ПК, с интервалом примерно 5-7 сек, система воспроизводит звук отключения устройства, будто я отключаю приёмник o_O
Да также можете попробовать отключить пакет об успешной передачи. Отключается и на передатчике и на приёмнике.
Отключается по-моему командой
C++:
radio.setAutoAck(false);
 

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

★★★★★✩✩
14 Авг 2019
1,435
353
Москва
Еще заметил у себя во время тестов странную особенность. Иногда, при подключении на макетках, связка сначала не работает, а потом КАК ЗАРАБОТАЕТ, как будто прогрелась. Но это скорее всего из за соединений. Потому как перенеся на печатную плату такая фигня отпала. В связке 2-х NRF самое сложное понять в какой проблема - связок 2, скетчей 2. Поэтому изначально надо тестировать на 100% рабоичх скетчах
 

Matadon

✩✩✩✩✩✩✩
6 Окт 2019
11
0
Да также можете попробовать отключить пакет об успешной передачи. Отключается и на передатчике и на приёмнике.
Отключается по-моему командой
C++:
radio.setAutoAck(false);
Попробую, спасибо
Есть новые результаты наблюдений

На приёмнике вот так:
C++:
  radio.setPALevel (RF24_PA_MIN);
  radio.setDataRate (RF24_250KBPS);
На передатчике вот так:
C++:
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);
Включаю сперва приёмник и открываю монитор порта
Затем, как только включаю передатчик, успевает прийти первое значение counter'а в виде строки "Recieved: 0" и всё, дальше глухо. При чём если я нажимаю на приёмнике, именно на ардуинке, RESET кнопку, повторяется та же картина - залетает первое значение на приёмник в виде той же строки, а дальше молчит
 

Matadon

✩✩✩✩✩✩✩
6 Окт 2019
11
0
AutoAck не работает на режиме RF24_250KBPS, только 1 или 2 мбит
а вообще надо смотреть код на всякий.
Это код на TX:
#include <Arduino.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10);

byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};

byte counter;
uint64_t myTimer;

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

  //radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);

  radio.openWritingPipe(address[0]);
  radio.setChannel(0x60);

  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS);

  radio.powerUp();
  radio.stopListening();
}

void loop(void) {
  if (millis() - myTimer >= 100) {
    myTimer = millis();
    radio.write(&counter, sizeof(counter));
    counter++;
  }
}
А это на RX:
#include <Arduino.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9,10);

byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};

void setup(){
  Serial.begin(9600);
  radio.begin();
 
  radio.setAutoAck(1); //Для приёмника включил, иначе не приходит ничего
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);

  radio.openReadingPipe(1, address[0]);
  radio.setChannel(0x60);
  radio.setPALevel (RF24_PA_MIN);
  radio.setDataRate (RF24_250KBPS);

  radio.powerUp();
  radio.startListening();
}

void loop(void) {
  byte pipeNo, gotByte;
  while (radio.available(&pipeNo)) {
    radio.read(&gotByte, sizeof(gotByte));
    Serial.print("Recieved: "); Serial.println(gotByte);
  }
}
Вроде всё норм
Я даже чипы на NRF-ках проверил - оригиналы оба