Nrf24l01+ и esp8266 и туда же arduino nano
- Войдите на сайт для отправки комментариев
Всем привет! Столкнулся с проблемой того что модуль имеет всего 6 каналов для связи. Погуглил и нашел несколько схем решения. RF network не рассматриваю так как велик шанс отказа системы в любом узле. Другие схемы тож отмёл осталась идеальная для моей цели. Финт заключается в том что база знает адреса всех "датчиков" и периодически с ними связывается, назовём это штатной работой и также параллельно штатной работе мы держим еще две трубы для чего-то важного например тревог или регистрации нового датчика для системы. Пока что только начал реализовывать и сразу проблема =) вообщем:
Код передатчика ("датчика"):
#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(®, 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 но как)))) если база вроде как не получала от него пакета регистрации
Проблема решена! Тут решение -> https://community.alexgyver.ru/threads/nrf24l01-i-esp8266-i-tuda-zhe-arduino-nano.3475/
ссылка не открывается... и вообще форум гайвера лежит четвертый день..
ссылка не открывается... и вообще форум гайвера лежит четвертый день..
Я использую VPN
Код приемника:(базы)
Код передатчика("датчика"):
Я использую VPN
ого... На гайвера наехала РосКомЦензура? :)
Ну уж туда я точно через VPN ходить не стану :)
Evgeniy2020 - в паре слов - в чем оказалась проблема и в чем суть "решения".?
Evgeniy2020 - в паре слов - в чем оказалась проблема и в чем суть "решения".?
Та вот хрен его знает) код чуть другой, и питание чуть другое и теперь работало 9 из 10, потом я поменял код и все опять вернулось..............
Вообщем что я понял) питание должно быть мега стабильным( я не до конца вставлял зарядку и видимо просаживался кондер и что-то висло)
Evgeniy2020 - в паре слов - в чем оказалась проблема и в чем суть "решения".?
Доброго времени суток) подскажите пожалуйста как мне хранить массив с трубами как-то так ?
Доброго времени суток) подскажите пожалуйста как мне хранить массив с трубами как-то так ?
Но, на мой взгляд, для хранения 6-байтовой величины использовать 8-байтовые переменные, особенно в условиях явно ограниченного объема памяти, довольно расточительно.
Доброго времени суток) подскажите пожалуйста как мне хранить массив с трубами как-то так ?
Но, на мой взгляд, для хранения 6-байтовой величины использовать 8-байтовые переменные, особенно в условиях явно ограниченного объема памяти, довольно расточительно.
Странно вроде данные 8 байт, ну не суть. Подскажите тогда как правильно хранить массив труб чтобы не тратить лишнее место в памяти.
Ну так потому и 8 байт, что используется тип uint64_t.
Ну а вариант, естественно, самому определить структуру нужной длины.
PS. Кстати, я невнимательно посмотрел, похоже там вообще достаточно 5 байт.
PPS. А еще, если у всех "труб" один и тот же префикс, то и его хранить не обязательно, т.е. можно еще значительно подсократить объем.
Ну так потому и 8 байт, что используется тип uint64_t.
Ну а вариант, естественно, самому определить структуру нужной длины.
PS. Кстати, я невнимательно посмотрел, похоже там вообще достаточно 5 байт.
PPS. А еще, если у всех "труб" один и тот же префикс, то и его хранить не обязательно, т.е. можно еще значительно подсократить объем.
Оки) думаю пока что остановлюсь одном из вариантов
Новая проблема =) при использовании
"регистрация" не пашет, но если использовать
то работает... Хотя и так и так написано в документации к библеотеке.
Код базы:
Код приемника:
Новая проблема =) при использовании
"регистрация" не пашет, но если использовать
то работает...
Евгений, а цель этих исследований какая? - Если хотите досконально разобраться, почему одно работает, а другое нет - копайте исходный код библиотеки, смотрите как используются эти параметры - потом нам расскажете.
А если вам просто надо, чтоб работало - пользуйте второй вариант
Новая проблема =) при использовании
"регистрация" не пашет, но если использовать
то работает...
Евгений, а цель этих исследований какая? - Если хотите досконально разобраться, почему одно работает, а другое нет - копайте исходный код библиотеки, смотрите как используются эти параметры - потом нам расскажете.
А если вам просто надо, чтоб работало - пользуйте второй вариант
Может кто-то сталкивался! Копаться в либе мне лень)) но могу сразу сказать чуть не до смотрел, в доках написано так
http://tmrh20.github.io/RF24/classRF24.html#a9edc910ccc1ffcff56814b08faca5535
Всем) спасибо буду юзать так, как в доках
Доброго времени суток) подскажите пожалуйста как мне хранить массив с трубами как-то так ?
Но, на мой взгляд, для хранения 6-байтовой величины использовать 8-байтовые переменные, особенно в условиях явно ограниченного объема памяти, довольно расточительно.
Странно вроде данные 8 байт, ну не суть. Подскажите тогда как правильно хранить массив труб чтобы не тратить лишнее место в памяти.
не подскажите что это у вас за редактор такой на скрине?
Доброго времени суток) подскажите пожалуйста как мне хранить массив с трубами как-то так ?
Но, на мой взгляд, для хранения 6-байтовой величины использовать 8-байтовые переменные, особенно в условиях явно ограниченного объема памяти, довольно расточительно.
Странно вроде данные 8 байт, ну не суть. Подскажите тогда как правильно хранить массив труб чтобы не тратить лишнее место в памяти.
не подскажите что это у вас за редактор такой на скрине?
Подскажу =) Это эмулятор ардуино. Это сайт https://www.tinkercad.com/ где можно создавать 3d модели, а также относительно не давно появилась вкладка схемы. Где можно использовать много радиодеталей вместе с мк(когда создадите проект надо выбрать все инструменты), там есть и ЛБП. и аттини и разные драйвера и тд......