#1 2020-07-12 21:45:05

Evgeniy2020
Участник
Зарегистрирован: 2020-06-26
Сообщений: 10

Nrf24l01+ и esp8266 и туда же arduino nano

Всем привет! Столкнулся с проблемой того что модуль имеет всего 6 каналов для связи. Погуглил и нашел несколько схем решения. RF network не рассматриваю так как велик шанс отказа системы в любом узле. Другие схемы тож отмёл осталась идеальная для моей цели. Финт заключается в том что база знает адреса всех "датчиков" и периодически с ними связывается, назовём это штатной работой и также параллельно штатной работе мы держим еще две трубы для чего-то важного например тревог или регистрации нового датчика для системы. Пока что только начал реализовывать и сразу проблема smile вообщем:

Код передатчика ("датчика"):

#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();
    }
  }
}

Код приемника (базы):

#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("");
    }
  }
}

Это одна из версий да написано коряво были более красивые) но не рабочие так что пока так потом сделаю по красивее smile
Ну а теперь проблема )
Проблема:
В сериал порте базы наблюдаем такую картину:
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
Я уверен что ошибка в коде но просто я раза три его переписывал, а реакция точно такая же, а бывает наоборот что прекрасно работает раза три точно (подряд) регался все было видно на базе и работало все дальше безупречно ( то есть не было этого пустого ответа )

#2 2020-07-12 22:26:23

Evgeniy2020
Участник
Зарегистрирован: 2020-06-26
Сообщений: 10

Re: Nrf24l01+ и esp8266 и туда же arduino nano

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

#3 2020-07-13 14:59:52

Evgeniy2020
Участник
Зарегистрирован: 2020-06-26
Сообщений: 10

Re: Nrf24l01+ и esp8266 и туда же arduino nano

Проблема решена. Процесс решения тут

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела