Передача измеренной температуры по радиоканалу. Связка NRF24L01+ и DS18B20
Небольшой проект с использованием радиомодулей NRF24L01. Задача проста - измерить температуру и отправить данные на приемник. Измерением температуры занимается цифровой датчик DS18B20. Измеренная температура, полученная на другой стороне приемником, выводится на ЖК дисплей. Хороший пример для демонстрации возможностей радиомодулей.
Передатчиком служит тестовая платка с atmega8, которая была собрана ранее. К ней дополнительно подключил датчик 18b20 к выводу PortC.0 с резистором подтяжки на 4,7 килоом
Схема передатчика:
Запитываться передатчик должен напряжением от 3 до 3,6 вольт (нижний предел 3 вольта для датчика температуры, а верхний - для NRF24L01). В моем случае все запитывалось подсаженным литий-ионным аккумулятором, в котором осталось 3,5 Вольт.
Приемник собран на макетке, схема подключения радиомодуля практически идентична, за тем исключением, что питание на него идет отдельно через понижающий стабилизатор на 3,3 вольта. Одно хорошо, что входы/выходы модуля толерантны к 5-и вольтовым уровням, поэтому схему согласования с контроллером делать не обязательно.
Схема приемника:
Вот как это выглядит в сборе у меня. Приемник расположен слева, передатчик-справа.
Что касается дальнобойности, то приемник "слышит" сигнал через 2 железобетонные стены (максимальное удаление по квартире). А вот третья стена его уже глушит (уносил передатчик на лестничную площадку), но тем не менее считаю что результат вполне неплохим, свою цену они отрабатывают на все 100%
И напоследок видео работы
Так как измеряюще/передающая часть работает автономно, запитываясь от аккумулятора, хорошо бы задействовать один из способов энергосбережения. Благо сам радиомодуль тоже умеет засыпать по команде. Но это пока только наметки на будущее.
Приветствую всех! Требуется помощь, естественно не бесплатно! Необходима передача температуры с 8-и и более передатчиков на один приемопередатчик по радиоканалу. По принципу датчиков давления в шинах авто. 1. Длительность работы от элемента питания 1-2 года. (опрос температуры каждые 5-30 сек.) 2. Все датчики в радиусе около 50 метров. 3. Рабочая температура от -40°С до +125 °С. 4. Оповещение при повышении установленного порога температуры. 5. Оповещение при разряде элемента питания. 6. Оповещение при неработающем датчике. По всем вопросам писать в личку.
А, Вы хотите передавать данные GPS на компьютер для программного обеспечения. Это сложнее, так как NRF24L01 отправляет данные "Байтами", пример: Dan(1) = &HAA 'Байт 1 Dan(2) = &HBB 'Байт 2 Dan(3) = &HCC 'Байт 3 Dan(4) = &H11 'Байт 4 Dan(5) = &H22 'Байт 5 и так далее... то-есть если отправлять по пакетно, то выйдет примерно 37 Байт для одной строки. Тут уже нужно придумывать способ пакетирования большого количества данных с одной строки получаемых с UART, а приёмная часть будет складывать все Байты одной строки - в строку с последующей передачей на компьютер по UART.
Было бы проще, если бы Вы передавали только определённые данные (например: время, дата, широта, долгота, скорость движения, путевой угол, GPS fix - верность данных, количество спутников, высота над уровнем моря).
uart настроен на 9600. для молуля neo-6m есть готовое програмное обеспечение. которое в полной мере понимает данные с приемника. поэтому ничего изменять не надо. а передааем ровно то, что получили с модуля ЖПС
Во первых, подумайте какие данные с GPS Вам нужны, например: время, дата, широта, долгота, скорость движения, путевой угол, GPS fix - верность данных, количество спутников, высота над уровнем моря.
Так-же важно в каком виде идут данные с GPS по UART, например: $GPRMC,163736.000,A,5500.4237,N,07323.0355,E,500.15,229.72,040513,,,A*6E $GPVTG,207.84,T,,M,0.21,N,0.38,K,A*3C $GPGGA,163736.000,5500.4238,N,07323.0355,E,1,15,1.46,17123.7,M,-29.7,M,,*73 $GPGSA,A,3,01,31,30,11,,,,,,,,,3.11,2.94,1.00*0F $GPGSV,3,1,11,32,72,258,,31,69,156,29,20,47,292,,01,33,244,22*7F $GPGSV,3,2,11,14,33,083,,25,30,065,,12,16,030,,23,15,267,17*76 $GPGSV,3,3,11,11,12,232,21,30,08,160,26,22,06,138,*4E $GPGLL,5500.4489,N,07323.0292,E,131424.000,A,A*55 и так далее... вполне достаточно строк: $GPRMC,163736.000,A,5500.4237,N,07323.0355,E,500.15,229.72,040513,,,A*6E $GPGGA,163736.000,5500.4238,N,07323.0355,E,1,15,1.46,17123.7,M,-29.7,M,,*73
и на какую скорость передачи настроен UART у GPS, например: 9600 или 38400
Используй микроконтроллер (например Atmega8) как посредник, то-есть "данные GPS" в "Atmega8" в "NRF24L01". Примеры по работе с NRF24L01 и GPS модулем есть на этом сайте.
Друзья, сейчас готовлюсь к соревнованиям по радиоуправляемым моделям, куплю код за деньги! Я собрал тестовый вариант приемника и передатчика, все заработало! теперь хочу передавать с помощью этих радиомодулей данные UART вот с этого модуля http://www.parkflyer.ru/product/700417/ как в Bascom-AVR преобразовать UART в SPI?
Пожалуйста, почитай комментарии тут: http://avrproject.ru/publ/vstraivaemyj_modul_radioupravlenija_na_nrf24l01/1-1-0-147 http://avrproject.ru/publ/kak_podkljuchit/radiomoduli_nrf24l01/2-1-0-92 http://avrproject.ru/publ/peredacha_izmerennoj_temperatury_po_radiokanalu_svjazka_nrf24l01_i_ds18b20/1-1-0-106 я уже где-то описывал принцип работы nrf24l01 нужным Вам способом.
Опишу вкратце: 1) термометр №1, находится в режиме "передачи", сидит по адресу (индекс) 'Подготовка к TX D_bytes(1) = &H30 'TX адрес D_bytes(2) = &H34 D_bytes(3) = &H43 D_bytes(4) = &H10 D_bytes(5) = &H10 D_bytes(6) = &H01 Reset Ss Spiout D_bytes(1) , 6 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss
D_bytes(1) = &H2A 'RX адрес для pipe0 D_bytes(2) = &H34 D_bytes(3) = &H43 D_bytes(4) = &H10 D_bytes(5) = &H10 D_bytes(6) = &H01 Reset Ss Spiout D_bytes(1) , 6 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss
'то-есть адрес 34-43-10-10-01 2) термометр №2, находится в режиме "приёма", сидит по адресу (индекс) 'Подготовка к Rx D_bytes(1) = &H2A 'RX адрес для pipe0 D_bytes(2) = &H34 D_bytes(3) = &H43 D_bytes(4) = &H10 D_bytes(5) = &H10 D_bytes(6) = &H01 Reset Ss Spiout D_bytes(1) , 6 'Shiftout байты данных SPI корыта, C_bytes это количество байт, которые будут написаны Set Ss
'то-есть адрес 34-43-10-10-01 3) термометр №1, находится в режиме "передачи", произвёл передачу температуры по адресу (индексу) 34-43-10-10-01 и после передачи переключился в режим "приёма" по адресу (индексу) 34-43-10-10-02. 4) термометр №2, находится в режиме "приёма", произвёл приём температуры по адресу (индексу) 34-43-10-10-01 и после приёма переключился в режим "передачи" по адресу (индексу) 34-43-10-10-02. 5) термометр №2, находится в режиме "передачи", произвёл передачу температуры по адресу (индексу) 34-43-10-10-02 6) термометр №1, находится в режиме "приёма", произвёл приём температуры по адресу (индексу) 34-43-10-10-02. и далее снова всё повторяется.
Так будет понятнее, режим "Последовательный": термометр №1 -> термометр №2 -> термометр №1 ВАЖНО! учитывайте, что при работе в таком режиме про энергосбережение можно забыть, так как nrf24l01 будет постоянно включен.
Здесь последняя версия кода (прошивки): http://yadi.sk/d/vF7D07Mx9g4QY или http://yadi.sk/d/FypcajG49g4SE
привет каждый ...... У меня есть проблема с NRF24L01 Я не знаю, как это работает Двусторонняя в свое время ..... У меня есть два устройства, я хочу, чтобы отправить данные из первого устройства ко второму устройство и второй, чтобы отправить ответ на первый в то же время ... пожалуйста, помогите мне я использую BASCOM AVR для написать свою программу
Понятно. 1) Тогда для передатчика лучше использовать ATTINY2313A-SU, малое энергопотребление и достаточное количество свободных портов для кнопок. Здесь описывается понижение энергопотребления и в комментариях: http://avrproject.ru/publ/poleznaja_informacija/ponizhaem_ehnergopotreblenie_ustrojstv_na_mikrokontrollerakh_avr/4-1-0-64 2) Для составного модуля приёмника (которых будет несколько) лучше использовать Attiny13A-SU + NRF24L01 + РЕЛЕ + БП, так как дешёвая себестоимость, поэтому можно сделать несколько составных приёмных модулей. Заметка: на Ebay продают дешёвые Attiny13A-SU по 5 штук.
к умному дому и стремлюсь)) ну я не думаю что это будет тяжело. тянуть провода не придется так как планировал что каждый приемник будет состоять из 1 радиомодуля+мк+модуль реле . соответственно он будет стоять там где стоит техника телевизор, свет . а пульт для всех них будет 1 чтоб включать и выключать тот или иной приемник.
Да, такое возможно. Идея интересная. Всё это напоминает умный дом :) Труднее будет связать управляемые устройства (реле света, реле телевизора) с одним приёмником, так как приёмник находится в одном месте, а управляемые устройства в разных местах квартиры, получается нужно тянуть провода от устройств до приёмника с релюшками. Как у Вас идёт проводка (как будете подключать устройства к релюшкам)?
спасибо! я пытаюсь соединить эту статью и http://avrproject.ru/publ/vstraivaemyj_modul_radioupravlenija_na_nrf24l01/1-2-0-147 чтобы сделать так сказать радио-розетки. будет 1 приемник и несколько передатчиков в разных местах квартиры и на каждом будет висеть готовый модуль реле, который по кнопке с передатчика бы включал устройство подключенное к реле(свет, телевизор ) вот... реально ли такое реализовать?)
Вот код для первого передатчика, аналогично и для других передатчиков: http://yadi.sk/d/vc6qQpiCHgcZC Напоминаю, что код в комментарии №22 является тестовым (то-есть не проверен, но работать должен).
А будет ли 2-я версия этого проекта. добавить внутренний датчик DHT22 и такой же будет наружный что бы измерять влажность 1-я строчка это домашний 2-я уличный, так же перемычкой задавать интервал передачи уличного датчика. К примеру на выбор передавать данные каждые 5 сек или 1 раз в 5 минут. что продлит срок службы батарейке
Кстати тут при регистрации на сайте, а так же добавлении комментариев вываливается XML в браузер, типа ответ AJAX... Надеюсь скоро поправите, а то пот у меня коммент случайно задулировался теперь, а может ещё у кого(((
exersizze, спасибо. все получилось работает. огромная просьба если не трудно куда вставить кусок кода этот Config Int0 = Low Level On Int0 Button: Enable Interrupts Enable Int0 со статьи про энергосбережение, что бы при нажатии на кнопку только просыпался передатчик и уходил в powerdown? можешь чуть доделанный BAS файл выложить?
в том то и дело никакой текст не выводит(( пробовал сразу при старте программы вывести надпись privet. так нет ничего не выводит, а светодиод загорается(
Где-то косяк явно, не может он сам пропустить участок инициализации и сразу перейти в основной цикл. Попробуй вывести текст какой нибудь заместо принятых данных.
ребят такое дело . собрал все в точности как тут. все железо такое же мега 8, частота только 8 мгц. пробовал 16 ставить тоже самое. разница только в дисплее - тот же 44780 НО 20Х4 . код остальной абсолютно такой же как тут. поменял только вот- Config Lcd = 20 * 4 Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.1 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
экран не проходит инициализацию. светодиод загорается. как будто код с выводом на дисплей просто пропускается... в общем ничего не выводится на экран.. что скажете?
да , экран проверил с другим кодом , работает, выводит что надо.
Я не встречал модели трансивера для симулятора, да там особо симулировать то и нечего. Что касается использования управляющего трансивером контроллера, то без него никак не обойтись. По крайней мере для NRF24L01, на шине он работает как ведомое устройство. За другие нордики не скажу, не имел с ними опыта.