NFR24L01 и ds18b20 передача и прием данных.
- Войдите на сайт для отправки комментариев
Искал как это сделать легко и просто, много видео, но нет готового решения.
Прошу обратить внимание на то, что разбираться с Ардуино только начал и ищу темы где разжевывают все досканально. Разбираюсь в силу своих возможностей и делюсь некоторыми познаниями и упрощениями.
Вот хочу предложить пример приема-передачи данных с датчика ds18b20 с одного модуля. Если кому будет интересно. позже предложу решение по передачи и приему с нескольких датчиков в совокупности с датчиком DHT11.
В скетче описал все своими словами.
Если возникнет непреодолимое желание покритиковать - не стесняйтесь, но без фанатизма, делайте скидку :)
Итак, вот скетч для передатчика:
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include <OneWire.h> //библиотека работы шины для ds18b20 #include <DallasTemperature.h> //библиотека для считывания температуры с ds18b20 const uint64_t pipe = 0xF0F1F2F3F4LL; //идентификатор передачи данных. RF24 radio(9, 10); //указываем пины подключения передатчика. OneWire oneWire(2); //указываем пины для подключения датчиков ds18b20. DallasTemperature ds(&oneWire); //активируем библиотеку ds. DeviceAddress sensor1 = {0x28, 0xFF, 0x68, 0x6A, 0x84, 0x16, 0x5, 0x69}; //адрес первого датчика. DeviceAddress sensor2 = {0x28, 0xFF, 0xAA, 0x37, 0x82, 0x16, 0x5, 0x5C}; //адрес второго датчика. void setup(){ Serial.begin(9600); //открываем пот обмена данными. ds.begin(); //запускаем функцию считывания температуры ds. radio.begin(); //делаем инициализацию. delay(2); //ждем реакции модуля передачи данных. radio.setChannel(9); // канал для передачи данных (0-127). radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули. radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика. radio.openWritingPipe(pipe); // открываем трубу на передачу. } void loop(){ ds.requestTemperatures(); // считываем температуру с датчиков float data [2]; //создаем массив из 2-х переменных. data[0] = float(ds.getTempC(sensor1)); //присваиваем первому значению массива данные с sensor1 (за один раз можно отправить до 32 байт). data[1] = float(ds.getTempC(sensor2)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт). radio.write(&data, sizeof(data)); // передаем массив и его размер. Serial.println(data[0]); //выводим данные в сериал порт для проверки. Serial.println(data[1]); //выводим данные в сериал порт для проверки. Serial.println(); //пробел. delay(500); //ждем пол секунды. }
Комментарий: Хотелось бы обратить внимание на значения float в строке 29-31, они позволяют передавать и принимать сотые доли значения датчика температуры. Если нужны только целые числа, то достаточно в строке 29 float заменить на int. Массивом data[] мы можем передавать любые значения, с любых датчиков и потенциметров. Для этого необходимо в строке 29 указать колличество данных в массиве ну и соответсвенно укахать их в самом массиве.
Ну и скетч для приемника:
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" const uint64_t pipe = 0xF0F1F2F3F4LL; //первый идентификатор передачи данных. RF24 radio(9, 10); //указываем пины подключения передатчика. void setup(){ Serial.begin(9600); //открываем пот обмена данными. radio.begin(); //делаем инициализацию. delay(2); //ждем реакции модуля передачи данных. radio.setChannel(9); // канал для передачи данных (0-127). radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули. radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика. radio.openReadingPipe(1,pipe); //Можно открыть все трубы разом. radio.startListening(); //включаем приемник и начинаем слушать трубу. } void loop(){ float data [2]; //создаем массив из 2-х переменных. if (radio.available()){ //проверяем не пришло ли чего в буфер. radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. Serial.println(data[0]); //выводим данные в сериал порт для проверки. Serial.println(data[1]); //выводим данные в сериал порт для проверки. Serial.println(); //пробел. } }
Спаибо за внимание. Полезу подключать несколько передатчиков к одному приемнику.
Кстати, при подключении датчика ds18b20 будьте аккуратны. Если при подключении он включается в режиме "кипятилькик", значит перепутали плюс с минусом. В интернете есть разные схемы и у меня при неправильном подключении он разогрелся до 100 градусов...
у меня при неправильном подключении он разогрелся до 100 градусов...
Чем измеряли? Или сам показал?
Что это за реакция и как она себя проявляет?
Что это за реакция и как она себя проявляет?
Да так, на всякий случай, что бы не было сбоев при слишком быстром запросе данных.
Внутри функции setup() не происходит никаких запросов данных.
Внутри функции setup() не происходит никаких запросов данных.
Да, согласен, видимо поэтому не могу присвоить значения переменным, что бы их вывести на дисплей. Завтра займусь этим. Если есть что подсказать - буду благодарен.
Все афигенно, но есть проблема: на принимаемой части ардуино подключина к дисплею nextion, так же к датчику DHT11, питается от двух аккумуляторов 18650 через понижайка на выходе 5 вольт.
Так вот: при подключении начинается глюк, ардуино не обрабатывает данные. Если саму ардуионо отсоединить то всего, залить скетч, и подключить не отсоеденяя то компа - все работает, при отключении usb работает, но вот если все выключить и включить заново - замолкает.
Думаю проблема с питанием... Не знаю куда копать....
Поделюсь своим проектом. Он вполне работоспособный, едиственная проблемма в том, что ардуинка приемника и передачи данных на дисплей Nextion запускается без подключения системы, т.е. вытащив ее из платы расширения, подключаю через USB или обычного аккумалятора, потом вставляю в плату расширения, к которой подключенна вся система и все работает. Если выключить питание и включить - не запускается (не передает данные и не горил светодиод приема данных.
Если кто увидит ошибки и недочеты в коде приемника, которые могут влиять на его сбои в работе при запуске - буду признателен.
Итак, задача этой части проекта снимать показания температур и влажности, по средствам датчиков ds18b20 и DHT11 и путем беспроводной связи выводить их на дисплей Nextion. В перспективе нужно еще три ардуины с передатчиком и соответсвенно нужно будет дополнить код приемника, для получения данных с трех других Ардуино.
Кстати, ардуино в связке с датчиком NFR24L01 совместно с платой питания для NRF превосходно работает от стандартного аккумулятора для мобильника (LiPo).
Передатчик:
Приемник:
Ну вот пока что все. Спасибо за внимание. Ардуинки закончились, буду ждать новых что бы подключить остальные необходимые датчики.
В чем проявляется проблемма в сборке приемника: при включении питания идет сброс данных на дисплее Nextion, он раз в секунду "обнуляется", не работает приемник NRF24L01, данные с датчика DHT11, подключенного на ардуине - передаются на дисплей, но т.к. их показания в третьей вклидке (на третьей странице) видно их долю секунды, потом дисплей сбрасывается на главную, словно раз в секнду происходит короткое замыкание.
Для решения проблеммы исключил причины не дающие работать принимаемой части: питание - в норме, передача данных на дисплей Nextion - в норме, питание дисплея nextion и возможные помехи - в норме.
Нашел причину не желания работать всей системы в целом, при включении питания в принимаемой части - при отключении приемника NRF24L01 все заработало. Теперь буду действовать методом тыка. Во первых не буду подключать канал MOSI, т.к. он для приема данных, а я на неко ничего не отправляю и попробую переназначить выводы CE и CSW. Много библиотек подключенно, что то с чем то конфликтует видимо...г
Опытным путем выявил чт проблемма с 13-м мином. Отключаю 13-й пин, сапускается сисема и ардуинка, через пару секунд подключаю 13-й ин (SCN - выбор режима приема-передачи) и все работает как положенно.
Эту ветку уже видимо ни кто не читает, поищу профильную тему, спрошу там наверное.
мне кажется что можно без лобовых решений и покороче
Красиво. То же верно. Возьму на заметку. С лобовыми решениями новичку проще :) Но мне нравится Ваш вариант. Спасибо.
я там скобочки не поставил, а то скажите потом не работает ....
я там скобочки не поставил, а то скажите потом не работает ....
Спасибо :) А то действительно смотрю и думаю: что то там не так :)))
В чем проявляется проблемма в сборке приемника: при включении питания идет сброс данных на дисплее Nextion, он раз в секунду "обнуляется", не работает приемник NRF24L01, данные с датчика DHT11, подключенного на ардуине - передаются на дисплей, но т.к. их показания в третьей вклидке (на третьей странице) видно их долю секунды, потом дисплей сбрасывается на главную, словно раз в секнду происходит короткое замыкание.
Для решения проблеммы исключил причины не дающие работать принимаемой части: питание - в норме, передача данных на дисплей Nextion - в норме, питание дисплея nextion и возможные помехи - в норме.
Нашел причину не желания работать всей системы в целом, при включении питания в принимаемой части - при отключении приемника NRF24L01 все заработало. Теперь буду действовать методом тыка. Во первых не буду подключать канал MOSI, т.к. он для приема данных, а я на неко ничего не отправляю и попробую переназначить выводы CE и CSW. Много библиотек подключенно, что то с чем то конфликтует видимо...г
Проблему решил по совету пользователя здесь:http://arduino.ru/forum/apparatnye-voprosy/nrf24l01#comment-255080 На питание премника впаял электролитический конденсатор на 10 микрофарад. Проблема ушла.
Приветствую, тоже хочу сделать метео станцию, у меня есть уже свой готовый скетч, но он не опробован, так как пока мешает работа, и только сегодня получил вторую нану для взаимодействия друг с другом ардуино, но у меня еще реализовано исключение самонагрева ds18b20, так как есть статьи о том что этот датчик нагревается и искажает показания в плюс. Предлагаю тут поддержать проект до его полного отшлифофывания.
Это сильно! :)
Не вопрос! Щас Клапауций придёт - поддержит!
У меня в скетче для передатчика последней строкой стоит задержка на пол секунды. Датчики не греются, тестировал часов 5-8, изменений не было.
Могу выложить финальную версию с подключением -4 х отдельных передатчиков на один приемник.
В принципе проект уже протестирован. Осталось дождаться пару деталюшек из Китая, вот-вот должен приехать шлейф для модуля управления реле. Тогда могу и видос выложить готового проекта, если кому интересно.
с этого конденсатора и нужно было начинать. много раз про него писали
с этого конденсатора и нужно было начинать. много раз про него писали
А мне вот не попалась на глаза эта инфа... Что только не пробовал. Выход SCK уже и резистором подтягивал к массе и кондер к массе, и кондер с резистором к массе... уже хотел кнопку ставить, что бы отклуючать этот пин при запуске в ручную :))))
А 47МФд - для неко много будет или то же норм?
хз. я 10мкф керамику обычно паяю размера 0805. хорошо подходит
Вот мой проект, ардуино с дисплеем, датчиками и временем на кухне будет в коробочке, датчик1 температура на кухне, датчик2 температура за окном.
Все это дело отображается на дисплее 1602 и передается по NRFке в комнату где вторая ардуина со своими дачиками принимает и отображает все это на дисплее 1604 (Дисплей пока не пришел) вместе с показаниями в комнате, дальше идет реализация датчика движения на подсветку экрана, чтобы экран подсвечивался при наличии движения в комнате и ночью не освещал всю комнату. Кстати очень удобно. В коде приема это все пока закоментировано, но работает. В данном случае изза отсутствия втрого дисплея данные получаю тестово на комп.
По поводу перегрева DS18B20, соглашусь спорный вопрос, но все равно оставлю так, это не мешает и занимает всего лишь один цифровой пин.
Передающая сторона:
Принимающая сторона:
P.S. В теме ардуино всего неделю, все взято с примеров других источников. Так что Любые палки в свой огород приму только с положительной стороны.
Еще реализована отдельная задержка для опроса датчиков температуры в отличии от времени (300мс) опроса датчика движения.
Всё это рабочий код, только рабочий, как закончу проэкт, выложу полностью отшлефованый финальный код.
У меня в проекте не полный феншуй: при работе системы, если отключить один из приемников - то на дисплее замирают последние данные. Нет информации о точ что то либо отключено... надо как то это исправить - т.е. если ничего не приходит в текстовое поле посылать текст NoSig, например...
А что часто сбоит передача?
Нет, но мне важно видеть данные когда необходимо и они всегда должны быть актуальны, что бы понимать что происходит и что нужно предпринять. Немного изменил скетч, в принципе для меня стало даже лучше.
Привет всем, никак не могу реализовать так. На болконе сел аккум с передающими данными погоды, соответственно данные не передаются, а на десплее приемной части висит тупо старая информация, кто нить подскажите сделать так чтоб если инфа не пришла писалось что нибудь ну типа noTemp.
Как то нужно реализовать проверку, а как не соображу.
Код приемника:
Код передатчика:
Кстати, при подключении датчика ds18b20 будьте аккуратны. Если при подключении он включается в режиме "кипятилькик", значит перепутали плюс с минусом. В интернете есть разные схемы и у меня при неправильном подключении он разогрелся до 100 градусов...
потом такие обычно дохнут в процессе работы, поэтому лучше не кипятить..
Окончательный код с проверкой пришли ли данные. Если данные не приходят в течении минуты, строка затирается. Тем самым показывая что данных от передатчика нет.
Помогли с решением: http://arduino.on.kg/forum/post/27/#p27
Окончательный код с проверкой пришли ли данные. Если данные не приходят в течении минуты, строка затирается. Тем самым показывая что данных от передатчика нет.
А я добавил условие: если данные приходят - он отправляет их на дисплей, если данных нет - пишет "NoSig". Таким образом у меня постоянное движение на дисплее - не совсем "офисно", но мне очень понравилось.
Скинь рабочий скетч.
Прием данных температур на первую ардуино и их посыл на дисплей:
Отправка данных с первого передатчика:
отправка данных со свторого передатчика:
p.s. В выводе данных датчика DHT11 делал грубую корректировку значений, что бы хоть как то приблизить к истине их значения...
Кто знает, подскажите, хочу отправлять с нескольких передатчиков, и принимать на две ардуины, то есть с балкона будут отправлены данные на экран на кухне и на дисплей в другой комнате. Будет работать?
В теории все должно работать. Приедут еще модули - попробую.
окончательный рабочий код можно увидеть? спасибо
окончательный рабочий код можно увидеть? спасибо
мой или собеседника?
Zombrero, ваш. и прошивку для дисплея если не трудно. спасибо
Zombrero, ваш. и прошивку для дисплея если не трудно. спасибо
Пока еще в процессе отладки. При отсутствии сигнала от основного передатчика, приемная ардуина входит в какой т цикл и происходит конфликт работы второго ардуино на реле и дисплея... так же входит в какой то цикл... Не разобрался еще до конца...
И еще не понятно: три датчика DS18B20 с длинной кабеля более 4-х метров показывают заниженные показания. Не понятно почему... В тестовом режиме работали идентично другим, без погрешности, а тут примерно 10 градусов разница. Резисторы пробовал менять до 470Ом, не помогло... Может помехи от электропроводки, но ведь они цифровые...?
температура проводов влияет
температура проводов влияет
Есть какое то решение?
Есть какое то решение?
Посеребрённые провода из безксилородной меди :)