Радиомодули nRF24L01+ (приемник молчит, падла)
- Войдите на сайт для отправки комментариев
Пнд, 28/09/2015 - 16:30
Пытаюсь передать температурные данные с DS18B20 посредством радиомодулей nRF24L01+ с одной дуины на другую. Пробовал сторонние скетчи грузить - все работает идеально. С этими кодами - примник молчит(
примник:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> // https://github.com/maniacbug/RF24 const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба" RF24 radio(7, 8); // CE, CSN void setup() { Serial.begin(9600); radio.begin(); delay(2); radio.setChannel(9); // канал (0-127) // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS // RF24_250KBPS на nRF24L01 (без +) неработает. // меньше скорость, выше чувствительность приемника. radio.setDataRate(RF24_1MBPS); // мощьность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1, pipe); // открываем первую трубу с индитификатором "pipe" radio.startListening(); // включаем приемник, начинаем слушать трубу } // radio.stopListening(); // останавливает приём (нужно перед началом передачи) void loop() { int data; if (radio.available()) { // проверяем не пришло ли чего в буфер. radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать Serial.print("data: "); Serial.println(data); } delay(200); }
передатчик:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> // https://github.com/maniacbug/RF24 #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 5 const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба" OneWire oneWire(ONE_WIRE_BUS); RF24 radio(7, 8); // CE, CSN DallasTemperature sensors(&oneWire); void setup() { Serial.begin(9600); sensors.begin(); radio.begin(); delay(2); radio.setChannel(9); // канал (0-127) // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS // RF24_250KBPS на nRF24L01 (без +) неработает. // меньше скорость, выше чувствительность приемника. radio.setDataRate(RF24_1MBPS); // мощьность передатчика, RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, radio.setPALevel(RF24_PA_HIGH); radio.openWritingPipe(pipe); // открываем трубу на передачу. } void loop() { Serial.println("data: "); sensors.requestTemperatures(); // Send the command to get temperatures Serial.println(sensors.getTempCByIndex(0)); int data = sensors.getTempCByIndex(0); // читаем значение radio.write(&data, sizeof(data)); // отправляем данные и указываем сколько байт пакет Serial.print("data: "); Serial.println(data); }
37 строка неправильная. должно быть byte
а это вообще странно
эта строка возвращает float. его нельзя чему угодно просто так приравнивать
Таким образом? Или я не правильно понял
да не так
во первых data должен быть массивом. посмотри примеры
во вторых тебе нужно передавать знак температуры, а float разбить до byte. температура считывается до сотого знака вроде. значит умножаем на 100 и приравниваем к переменной int temp например. дальше условия:
1. если число меньше 0 то data[0]=0 и умножаем число на -100
иначе data[0]=1 и умножаем на 100
2. data[1]=temp/100; data[2]=temp%100;
и отправляем весь массив. в приемнике число обратно собираем во float или что там нужно
Спасибо, буду разбираться!
все равно не могу заставить работать приемник(((
jeka_tm
я без всяких извратов целую структуру отправлял, только скорость минимальную ставил.
romiras
В примерах в либе есть вывод информации о модуле. Добавь этот кусок в свой скетч и хидер "printf.h" из примера в каталог к своему скетчу кинь. И проверку на успешность отправки добавь. В примере она тоже есть.
на то оно и программирование что сделать можно по разному одно и тоже, я предложил вариант, он реальный и рабочий, больше никто же вариантов не предлагал, значит мой лучший)))
Я к тому, что на 1Mbit у меня соединение вообще не шло. Может глюк, может я где накосячил. failsafe, все дела.
как скорость ниже сделать? RF24_500KBPS - не катит, RF24_0.5MBPS - тоже не так(. С аналогового датчика показания передаются без проблем и на 1 мбит, проблема у меня видимо в передаче данных от датчика температуры, не знаю как разбить на те составляющие, которые можно отправить - опыта не хвататет и знаний ( я не программист, к сожалению)
у меня и на 2мбит работало хорошо, но убавлял до минимума для максимальной дальности
я тоже не программист))
скорость убавил - результат 0, вердикт - кривые руки(( все равно спасибо!
https://yadi.sk/d/CXjuENmaEEwun
архив RF24. там измененая библиотека. примеры рабочие сам вставлял, комментарии прописаны. попробуй
Спсабо за архив! Вот что получилось - опять двадцать пять)
попробовал так:
передатчик
приемник
опять тишина...
у тебя хоть пример работает?
не работает, странно
скорость 1 мбит поставил - заработало
romiras, уберите для проверки из скетча передатчика код работы с датчиком температуры. Посылайте что нибудь попроще, например data[0]=millis()%255; data[1]=~data[0]; Убедитесь, что это принимается.
а ты конденсатор на модуль напаял?
А надо было? Какой номинал? на пины питания?
ага. я 10мкф паяю. кто то 0.1мкф. керамику
прямо на сам модуль
Попробовал: данные передаются нестабильно и с большой задержкой
Сейчас в закромах пошарю - может найду, спасибо за совет!
большая задержка? так посмотри сколько измерение температуры занимает. там задержка стоит. так и должно быть
По последнему выложенному мной коду ( только со скор. 1 мбит) - передача прошла 1 раз, затем тишина, пол минуты подождал, вырубил
romiras, смотри #18
ps: и ретрайсы я бы поставил (15,15)
dimax, данные с монитора по твоему примеру:
romiras, значит проблема в задержке 750мс в лупе. Её нужно обойти, как вариант решение такое.
Снизьте скорость SPI до 4 МГц:
может поможет
да что ему говорить. там есть человеческие примеры. каждый модуль с ардуиной првоеряется статусом, а связь rx и tx. а он хочет сразу температуру гнать. если так то флаг ему в руки, по моему нужно быть последовательным