#2 Re: Програмування Arduino » Nrf24l01+ и esp8266 и туда же arduino nano » 2020-07-12 22:26:23

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

#3 Програмування Arduino » Nrf24l01+ и esp8266 и туда же arduino nano » 2020-07-12 21:45:05

Evgeniy2020
відповідей: 2

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

#4 Re: Програмування Arduino » Nrf24l01+ один rx много tx » 2020-07-11 14:52:56

Вообщем вопрос решен! Или библиотека nrf network или заменить всё на eps8266 и юзать mqtt.


UPD:
Крч не) я решил писать свой протокол. Почему?
1.Nrf nework - классная либа, но работает по принципу что у каждого родителя по 5 дочерних (или 6 точно не помню) у кажого из дитей есть свои дети и так далее. Когда мы хотим послать данные например от 2 или 3 колена до родителя всех родителей аки база.
До пакет идет через кучу модулей прямиком к базе. Но сами понимаете стоит кому-то что-то потерять или отрубится и все, связь накрылась. Поэтому отказ у такой системы очень просто получить отключив один из 5(или 6) дочерних датчиков от базы. Вы сразу же парализуете работу многих датчиков.

2.Mqtt Да как по мне хороший варик. Но для работы с ним нужно или arduino с шилдом для интернета, или esp8266,esp32...
Вообщем это достаточно удорожает проект.

#5 Програмування Arduino » Nrf24l01+ один rx много tx » 2020-07-09 13:34:37

Evgeniy2020
відповідей: 1

Всем привет! Столкнулся с проблемой. Знаю что модуль может работать с полными возможностями в 6 труб.
У меня проект Умного дома) Хотел где-то порядка больше чем 20 устройств в сети. То есть одна база NodeMcu и все другие arduino nano, общение идет по радиоканалу. Почитал гугл и подчеркнул несколько схем такого взаимодействия:
1. У каждого "датчика" есть какой-то рандомный адрес трубы, база периодически открывает трубу этого датчика и шлет ему тип "привет, как дела?", а датчик отвечает вот мой статус и тд. потом закрывает и так со всеми.
2. Все шлют в одну трубу но в пакете указан тип id, причем датчики не ждут как-то друг друга а тупо шлют.
3. Все шлют в одну трубу но каждый датчик имеет какой-то таймер на милисс который устанавливается базой во время его регистрации в системе
Я хотел бы чтоб у датчиков был включен пакет о получении (и у базы), также чтобы база могла давать свои команды (которые поданы с веб интерфейса) например Включить реле и тд. Подскажите как лучше реализовать связь. Может у вас есть свои варианты. Заранее спасибо!

#6 Re: Програмування Arduino » NodeMcu и EEPROM » 2020-06-26 18:36:15

(если кому-то поможет то вот конечный код, чуть изменен)

#include <EEPROM.h>
//#include "ESP8266WiFi.h"
void setup() {
  String ssid = "your_ssid";
  String pass = "your_pass";
  Serial.begin(9600);
  EEPROM.begin(512);
  delay(100);
  int ssid_len = ssid.length() + 1;
  int pass_len = pass.length() + 1;
  char ssid_array[ssid_len];
  char pass_array[pass_len];
  ssid.toCharArray(ssid_array, ssid_len);
  pass.toCharArray(pass_array, pass_len);
  Serial.println();
  Serial.println("SSID write....");
  for (int i=0; i < sizeof(ssid_array); i++) {
    Serial.println((char)ssid_array[i]);
    delay(100);
    EEPROM.write(i, ssid_array[i]);
    delay(100);
  }
  Serial.println("SSID writed!");
  if (EEPROM.commit()) {
    delay(500);
    Serial.println("EEPROM commited!");
  }
  delay(100);
  for (byte i=0; i < 9; i++) {
    Serial.print((char) EEPROM.read(i));
  }
  Serial.println("End");
}

void loop() {
}

#7 Re: Програмування Arduino » NodeMcu и EEPROM » 2020-06-26 18:27:46

Спасибо!!!!! Огромное спасибо. Теперь работает правильно!

#8 Re: Програмування Arduino » NodeMcu и EEPROM » 2020-06-26 17:53:27

Если вы про циклы то да, переменная "i" во всех циклах берется за ноль(я проверял)

#9 Re: Програмування Arduino » NodeMcu и EEPROM » 2020-06-26 16:53:41

г0сть пише:

Мне кажется вы не только с епром работаете первый раз. Начальное значение i с потолка берется?

Где именно ?)

#10 Програмування Arduino » NodeMcu и EEPROM » 2020-06-26 16:37:05

Evgeniy2020
відповідей: 7

Добрый день!
Хотел поиграться с EEPROM но, возникла проблема с чтением с eeprom.

#include <EEPROM.h>
//#include "ESP8266WiFi.h"
void setup() {
  String ssid = "my_ssid";
  String pass = "my_pass";
  Serial.begin(9600);
  EEPROM.begin(512);
  delay(100);
  //WiFi.mode(WIFI_STA);
  //WiFi.disconnect();
  delay(100);
  Serial.println("EEPROM START");
  EEPROM.write(0, ssid.length());
  delay(40);
  int from = 1;
  for (int i; i < ssid.length(); i++) {
    EEPROM.write(from + i, ssid[i]);
    delay(40);
  }
  from = ssid.length() + 1;
  EEPROM.write(from, pass.length());
  for (int i; i < pass.length(); i++) {
    EEPROM.write(from + i, pass[i]);
  }
  if (EEPROM.commit()) {
    Serial.println("Succesfuly eeprom updated");
  }
  delay(500);
  Serial.println("Start reading");
    String data;
  for (byte i; i < pass.length()+ssid.length()+2; i++) {
    data += (char)EEPROM.read(i);
  }
  Serial.println(data);
  Serial.println(data.length());
  /*
    String data;
    for (byte i; i < 8; i++) {
    data += (char)EEPROM.read(i);
    }
    Serial.println(data);
    Serial.println(data.length());
  */

  Serial.println("end eeprom");

  //EEPROM.end();
}

void loop() {
}

На что получаю ответ в ком порт:
16:09:13.706 -> ⸮txW⸮X6d⸮$⸮p⸮d⸮EEPROM START
16:09:14.081 -> Succesfuly eeprom updated
16:09:14.565 -> Start reading
16:09:14.565 ->
16:09:14.565 -> 0
16:09:14.565 -> end eeprom
Скажу что первый раз работаю с eeprom. Так что не знаю всех подводных камней. Заранее спасибо

Підвал форуму