RSS блога
Подписка
Беспроводной модуль 2.4 ГГц NRF24L01+ и его примитивное применение в быту.
- Цена: US $0.70
- Перейти в магазин
Заказывал эти модули для радиотермометра, но пока к нему едут остальные детали решил использовать в другом проекте.
Понадобилась простая сигнализация открытия двери в гараже. В гараже нет электричества потому решено было не ставить ни каких сирен а сделать простой радио датчик.
Открыли дверь в гараж — дома пищалка пищит. На будущее пищалку заменю автоколоколом или сиреной на 220 и вывешу их на улицу. Что попадет первое под руку.
На скорую руку собрать макетку, потом к ранее купленным arduino nano припаял разъем для NRF24L01+. Разъем сделал из старого IDE кабеля — идеально подходит под NRF24L01+ и под ESP8266. Монтаж простейший. Корпус для внутреннего модуля послужил корпус от какогото мырыканського блока питания на 120В, патрохи выкинул, уложил туда нано, термоклеем приклеил кнопку, двухцветный светодиод и пищалку. Толкатель кнопки — горелый светодиод с откушеными ногами.
Внешний модуль пока без корпуса.Планирую всунуть в какую то детскую игрушку с батареечным отсеком — этого добра в гараже ящиками.
UPD; Засунул в целофан и обмотал скотчем. Для питания приспособил коробочку коих оказалось немеряно…
Монтаж внутреннего модуля:
— на землю через резистор 220 Ом светик двухцветный(краснозеленый) и ноги нано 2,3.
— на землю кнопка с разомкнутыми контактами и на 7 ногу.
— на землю пищалку и на 5 ногу ардуины.
Подключение NRF24L01+ к ардуине:
Pin 9 — CE
Pin 10 — CS(N)
Pin 11 — MOSI
Pin 12 — MISO
Pin 13 — SCK
3.3v — 3.3v
GND — GND
Питание через кабель миниюсб на бп от мобилки.
Принцип работы таков: внешний модулю подключается на питание через микрик который прикручен к двери. Дверь открывается — на модуль подается питание и модуль шлет по радио меседж: «101»! «101»!«101», всмысле шухер ваши игрушки тырят или типа такого. На частоте 2.4 ГГц со скоростью 2Мб/сек. Гыгыгы. Сложнейшая передача данных ;)
Согласен — реализация мрачная, лучше бы реализовать спячку модуля и просыпание его кнопкой, но мне реально лень это делать темболее что это очень временный вариант. Потому будет таку, ну и что, что все стартует около секунды, мы успеем ;)
Внешний модуль умеет мигать однимглазом светодиодом разными цветами.Можно заменить двумя светиками при желании. Ну и пищалка. Пищалки эти я вам скажу 5 вольтовые такие громкие пошли, если она пищит у меня на столе так у меня в ухе щелкает. Как у Карсона прямо, а в каком ухе у меня жужжит. Ну да, так вот. Как только внешний модуль заработал, внутренняя коробочка сразу начинает пика и блымать красным цветом. Тут уж можно поступить так: или нажать на кнопку и перевести коробку в тихий режим, тогда она прекратит пика и будет мигать зеленым светом или подержать кнопку 2 секунды и вообще выключить сирену, на все забить и лечь спать. Правда спать не получится, как и выключить, так как сирена не выключается пока включен внешний модуль. Потому придется взувать тапки и лететь на десмач. Ну или как то так.
Ну и как вы поняли если внешний модуль включен, его нужно выключить, но и после того сирена будет валать еще 10 минут. Кнопкой внутренний модуль переводится в беззвучный режим или в звучный повторным нажатием. Беззвучный режим автоматом отключается через 30 минут и поробка опять готова подавать сигналы бедствия. Это сделато для того что бы можно было перевести сигналку в беззвучный режим и спокойно пойти в гараж, а потом если чего оно и само включится.
В «дежурном» режиме внутренний модуль мигает красным огоньком 50 милисекунд раз в 3 секунды.
Ой шото я вам тут понаписывал, надеюсь разберетесь. Как на макетке соберете так и вообще все станет понятно. Управление правдо сложное, надо рулить всего одной кнопкой, но думаю разберетесь.
Скетч прилагаю.
Писал вечером, правда в перерыве когда гости выходили покурить… потому скетч сегодня пришлось переписать :)
Вроде работает без нареканий — весь день тестирую. Почувствовал себя главным по вахте МЧС.
А работа у них вредная, потому пойду я пить молоко.
ЗЫ: ходил с кробкой по улице — прямая видимость работает 140 метров. Скорее всего может и больше но дальше нет видимости. Возле дома лупит кругом метров 40 через любые преграды.
Понадобилась простая сигнализация открытия двери в гараже. В гараже нет электричества потому решено было не ставить ни каких сирен а сделать простой радио датчик.
Открыли дверь в гараж — дома пищалка пищит. На будущее пищалку заменю автоколоколом или сиреной на 220 и вывешу их на улицу. Что попадет первое под руку.
На скорую руку собрать макетку, потом к ранее купленным arduino nano припаял разъем для NRF24L01+. Разъем сделал из старого IDE кабеля — идеально подходит под NRF24L01+ и под ESP8266. Монтаж простейший. Корпус для внутреннего модуля послужил корпус от какогото мырыканського блока питания на 120В, патрохи выкинул, уложил туда нано, термоклеем приклеил кнопку, двухцветный светодиод и пищалку. Толкатель кнопки — горелый светодиод с откушеными ногами.
Фото
Внешний модуль пока без корпуса.
UPD; Засунул в целофан и обмотал скотчем. Для питания приспособил коробочку коих оказалось немеряно…
Вот такой колхоз.
Фото
Монтаж внутреннего модуля:
— на землю через резистор 220 Ом светик двухцветный(краснозеленый) и ноги нано 2,3.
— на землю кнопка с разомкнутыми контактами и на 7 ногу.
— на землю пищалку и на 5 ногу ардуины.
Подключение NRF24L01+ к ардуине:
Pin 9 — CE
Pin 10 — CS(N)
Pin 11 — MOSI
Pin 12 — MISO
Pin 13 — SCK
3.3v — 3.3v
GND — GND
Питание через кабель миниюсб на бп от мобилки.
Принцип работы таков: внешний модулю подключается на питание через микрик который прикручен к двери. Дверь открывается — на модуль подается питание и модуль шлет по радио меседж: «101»! «101»!«101», всмысле шухер ваши игрушки тырят или типа такого. На частоте 2.4 ГГц со скоростью 2Мб/сек. Гыгыгы. Сложнейшая передача данных ;)
Согласен — реализация мрачная, лучше бы реализовать спячку модуля и просыпание его кнопкой, но мне реально лень это делать темболее что это очень временный вариант. Потому будет таку, ну и что, что все стартует около секунды, мы успеем ;)
Внешний модуль умеет мигать одним
Ну и как вы поняли если внешний модуль включен, его нужно выключить, но и после того сирена будет валать еще 10 минут. Кнопкой внутренний модуль переводится в беззвучный режим или в звучный повторным нажатием. Беззвучный режим автоматом отключается через 30 минут и поробка опять готова подавать сигналы бедствия. Это сделато для того что бы можно было перевести сигналку в беззвучный режим и спокойно пойти в гараж, а потом если чего оно и само включится.
В «дежурном» режиме внутренний модуль мигает красным огоньком 50 милисекунд раз в 3 секунды.
Ой шото я вам тут понаписывал, надеюсь разберетесь. Как на макетке соберете так и вообще все станет понятно. Управление правдо сложное, надо рулить всего одной кнопкой, но думаю разберетесь.
Скетч прилагаю.
Скетч
Передатчик
#include <SPI.h>
#include «nRF24L01.h»
#include «RF24.h»
int msg[1];
RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
void setup(void) {
// Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
}
void loop(void) {
msg[0] = 101;
radio.write(msg, 1);
}
Приемник
#include <SPI.h>
#include «nRF24L01.h»
#include «RF24.h»
int msg[1];
RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int LED1 = 3;
int LED2 = 4;
int buzer = 5;
long previousMillis_al = 0;
long previousMillis_s1 = 0;
long previousMillis_c = 0;
unsigned long eventTime1 = 0;
unsigned long eventTime2 = 0;
unsigned long eventTime3 = 0;
unsigned long eventTime4 = 0;
long TimeCount1 = 2000; //время удержания кнопки для второго действия
long TimeCount2 = 600000; // время удержания сирены при срабатывании в миллисекундах
long interval_al = 200; // время переключения звука сирены в миллисекундах
long TimeCount3 = 1800000; // блокировка сирены кнопкой на время в миллисекундах
int flash1 = LOW;
int alarm = 0;
int swdelay = 0;
int flag = 0;
int flag2 = 0;
int sign = 0;
void setup(void) {
// Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1, pipe);
radio.startListening();
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(buzer, OUTPUT);
pinMode(7, INPUT); //2 пин — в режиме входа. Кнопка подключена к земле.
digitalWrite(7, HIGH); //подключаем подтягивающий резистор
}
void loop(void) {
if (radio.available()) {
radio.read(msg, 1);
if (msg[0] == 101) {
delay(10);
alarm = 1;
sign = 1;
}
}
else {
sign = 0;
}
// =====кнопка=====
if (digitalRead(7) == 0 && flag == 0) {
if (millis() — previousMillis_c > 500) { // убираем дребезг контатков
previousMillis_c = millis();
swdelay = !swdelay;
eventTime1 = millis();
eventTime3 = millis();
flag = 1;
}
}
if (digitalRead(7) == 0 && flag == 1 && millis() — eventTime1 > TimeCount1) { //время удержания кнопки для второго действия
alarm = 0;
swdelay = 0;
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(buzer, LOW);
}
if (digitalRead(7) == 1 && flag == 1) {
flag = 0;
}
// =================
if (alarm == 1 && swdelay == 0) {
digitalWrite(LED1, flash1);
digitalWrite(LED2, LOW);
digitalWrite(buzer, flash1);
}
if (alarm == 1 && swdelay == 1) {
digitalWrite(LED1, LOW);
digitalWrite(LED2, flash1);
digitalWrite(buzer, LOW);
}
if (alarm == 0 && swdelay == 1) {
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
digitalWrite(buzer, LOW);
}
if (alarm == 0 && swdelay == 0) {
// digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(buzer, LOW);
if (millis() — previousMillis_s1 > 3000) {
previousMillis_s1 = millis();
digitalWrite(LED1, HIGH);
eventTime4 = millis();
}
if (millis() — eventTime4 > 50) {
digitalWrite(LED1, LOW);
}
}
if (millis() — previousMillis_al > interval_al) {
previousMillis_al = millis();
flash1 = !flash1;
}
if (sign == 1) {
flag2 = 1;
eventTime2 = millis();
}
if (sign == 0 && flag2 == 1 && millis() — eventTime2 > TimeCount2) {
alarm = 0;
flag2 = 0;
}
if (swdelay == 1 && millis() — eventTime3 > TimeCount3) {
swdelay = 0;
}
/* Serial.print(«alarm „);
Serial.print(alarm);
Serial.print(“ swdelay „);
Serial.print(swdelay);
Serial.print(“ sign „);
Serial.print(sign);
Serial.print(“ flag2 „);
Serial.println(flag2); */
}
#include <SPI.h>
#include «nRF24L01.h»
#include «RF24.h»
int msg[1];
RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
void setup(void) {
// Serial.begin(9600);
radio.begin();
radio.openWritingPipe(pipe);
}
void loop(void) {
msg[0] = 101;
radio.write(msg, 1);
}
Приемник
#include <SPI.h>
#include «nRF24L01.h»
#include «RF24.h»
int msg[1];
RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int LED1 = 3;
int LED2 = 4;
int buzer = 5;
long previousMillis_al = 0;
long previousMillis_s1 = 0;
long previousMillis_c = 0;
unsigned long eventTime1 = 0;
unsigned long eventTime2 = 0;
unsigned long eventTime3 = 0;
unsigned long eventTime4 = 0;
long TimeCount1 = 2000; //время удержания кнопки для второго действия
long TimeCount2 = 600000; // время удержания сирены при срабатывании в миллисекундах
long interval_al = 200; // время переключения звука сирены в миллисекундах
long TimeCount3 = 1800000; // блокировка сирены кнопкой на время в миллисекундах
int flash1 = LOW;
int alarm = 0;
int swdelay = 0;
int flag = 0;
int flag2 = 0;
int sign = 0;
void setup(void) {
// Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1, pipe);
radio.startListening();
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(buzer, OUTPUT);
pinMode(7, INPUT); //2 пин — в режиме входа. Кнопка подключена к земле.
digitalWrite(7, HIGH); //подключаем подтягивающий резистор
}
void loop(void) {
if (radio.available()) {
radio.read(msg, 1);
if (msg[0] == 101) {
delay(10);
alarm = 1;
sign = 1;
}
}
else {
sign = 0;
}
// =====кнопка=====
if (digitalRead(7) == 0 && flag == 0) {
if (millis() — previousMillis_c > 500) { // убираем дребезг контатков
previousMillis_c = millis();
swdelay = !swdelay;
eventTime1 = millis();
eventTime3 = millis();
flag = 1;
}
}
if (digitalRead(7) == 0 && flag == 1 && millis() — eventTime1 > TimeCount1) { //время удержания кнопки для второго действия
alarm = 0;
swdelay = 0;
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(buzer, LOW);
}
if (digitalRead(7) == 1 && flag == 1) {
flag = 0;
}
// =================
if (alarm == 1 && swdelay == 0) {
digitalWrite(LED1, flash1);
digitalWrite(LED2, LOW);
digitalWrite(buzer, flash1);
}
if (alarm == 1 && swdelay == 1) {
digitalWrite(LED1, LOW);
digitalWrite(LED2, flash1);
digitalWrite(buzer, LOW);
}
if (alarm == 0 && swdelay == 1) {
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
digitalWrite(buzer, LOW);
}
if (alarm == 0 && swdelay == 0) {
// digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(buzer, LOW);
if (millis() — previousMillis_s1 > 3000) {
previousMillis_s1 = millis();
digitalWrite(LED1, HIGH);
eventTime4 = millis();
}
if (millis() — eventTime4 > 50) {
digitalWrite(LED1, LOW);
}
}
if (millis() — previousMillis_al > interval_al) {
previousMillis_al = millis();
flash1 = !flash1;
}
if (sign == 1) {
flag2 = 1;
eventTime2 = millis();
}
if (sign == 0 && flag2 == 1 && millis() — eventTime2 > TimeCount2) {
alarm = 0;
flag2 = 0;
}
if (swdelay == 1 && millis() — eventTime3 > TimeCount3) {
swdelay = 0;
}
/* Serial.print(«alarm „);
Serial.print(alarm);
Serial.print(“ swdelay „);
Serial.print(swdelay);
Serial.print(“ sign „);
Serial.print(sign);
Serial.print(“ flag2 „);
Serial.println(flag2); */
}
Писал вечером, правда в перерыве когда гости выходили покурить… потому скетч сегодня пришлось переписать :)
Вроде работает без нареканий — весь день тестирую. Почувствовал себя главным по вахте МЧС.
А работа у них вредная, потому пойду я пить молоко.
ЗЫ: ходил с кробкой по улице — прямая видимость работает 140 метров. Скорее всего может и больше но дальше нет видимости. Возле дома лупит кругом метров 40 через любые преграды.
+72 |
10562
40
|
Самые обсуждаемые обзоры
+69 |
3287
133
|
+50 |
3523
66
|
+28 |
2487
46
|
+37 |
2797
40
|
+55 |
2022
37
|
а как скетч прикрутить я не понял? помогайте ;)
1. как в работе программы сделать паузу на 20 минут? Допустим, идёт нагрев, достигается нужная температура и потом ардуина держит ёё ещё 20 минут… а потом программа работает дальше…
я как бы понимаю, что надо прикрутить к ардуине часы. написать что-то типа. val = current time; val20 = current time — val;
потом цикл проверку, типа if val20>20min…
никто не подскажет ссылку на разжёвывание работы со временем в ардуинах?
2. как в среде ардуино прыгать в разные места программы? 20 лет назад я писал разную срань на ассемблере на Z80, там было просто jump,,, и ты на месте. :)
а какие операторы в ардуине, например, позволяют прыгать по скетчу?
2) goto в апдуине имеется но не приветствуется.(все я спать)
Для длинных периодов — надо часы, причем сегодня лучше ds3231 — они ходят точнее, чем 1307.
NRF24L01+ это приемник и передатчик в одном флаконе. Делать будет то что вы ему напишите.
— то же самое примерно с тем же радиусом действия?
Я на случай, если кто-то захочет решение по-проще в реализации…
Китайцы пишут 100, 150 метров радиозвонок. Я брал в магазине 3 штуки — вышел из дома и оно уже не работает, не говоря уже об установке в металлическом гараже. Так же эта китайская радиохрень срабатывает от соседского звонка, электробритвы и всех вибраторов в ближайшей многоэтажке…
Да и какой код вы в этот звонок зальете? В чем кайф?
у вас неправильные пчелы.
Если поставить электролит или ионистор то можно ввести ещё и код о пропаже питания. По получении этого кода коротенько попискивать. А разрядится электролит всё сработает само по себе.
Вот как приедут ESP8266 я переведу передатчик в гараже на него и увеличу количество контролируемых датчиков. Тогда уже будет и передача кода о состоянии девайса и состояние батарейки, алармы по жсм и на мыло. Но это будет позже. Пока минимум на месяц будет юзаться данный костыль в котором батареек хватит на достаточно длительный срок.
А автомобиль находился в 500м от точки наблюдения, камера в 1,2км.
Прозапас брал с собой 12Ач акум от бесперебойника на подмену так как до машины приходилось добираться иной раз ползком или по болоту или по рыхлому снегу :)
А у вас свой личный гараж :)
И в том и в другом случае не забудьте про плавное увеличение громкости.
В квартире — чтобы самому инфаркт не словить, а в гараже в целях не попасть под статью УК.
И причинение смерти по неосторожности влепят только так, и будут правы.
А так, конечно, в основном такая «самооборона» связана с растяжками, отравленными продуктами, самострелами, и т. д. — т. е. тем, где умысел уже легко доказуем.
И не факт, что самый дешёвый или менее опытный, чем у подсудимого.
А там, как известно, «закон — что дышло: куда повернёшь — туда и вышло».
www.bbc.com/russian/russia/2015/01/150120_markin_acquittal_rate_court_russia
Задолбали тупые либералы с их пакостной фашистской пропагандой.
Такой цивилизации как в росси нет больше нигде, ни на зассраном острове (ВВС) ни даже на украине.
-
pastebin.com/WeWXJgWS
Не помню откуда брал пример, но со сном повозился в своё время. Делал все это под PIR.
Кстати, с NRF-ками есть очень неприятная особенность: китайские с бика отличаются от оригинала протоколом общения с МК (где так и не выяснил), но работают ТОЛЬКО с разными версиями библиотечки (RF24 и RF24Nordic) :( Пока я узнал про эту особенность — я весь мозг сломал — почему одинаковый код не работает на разных трансиверах.
эти модулии вообще все китайские при том есть в разных модификациях с одним названием и соответсвенно работают с разными библиотеками. некоторые вообще работают по лунному календарю. потому я сразу решил с ними сильно не заморачиваться в этом проекте и был сильно удивлен когда оно заработало с полпинка. пока работает и хорошо. а как приедут esp8266-07 и я смогу научить ее красивому deep sleep`у то все свои датчики и безделушки переведу на них ну и соеденю в единую систему(во завернул) и каждый грамотный мусчанин сможет управлять моей кофемолкой :)))
ТЫЦ
Модули по питания подключены прямо к Arduino Nano к пину 3.3 В. И все работает в определенной степени нормальности. Возможно в какой то степени на это влияет длина и количество передаваемых данных, но вот в указанном проекте все работает. Позже буду пробовать передавать большие объемы.
Оригинальных этих контролеров не бывает. Это все китайское изобретение выпускаемое в разных подъездах одного дома.
Кардинально. В гараж влезли — дома включился ревун. И обокрали, и инфаркт. :)
Тем, кто собирается покупать — не попадитесь на «NRF24L01+ similar»
Выглядят почти так же (чуть меньше). Распиновка та же. Цена около $0.5
Но вот библиотеку для работы найти — то еще приключение. Год назад мне так и не удалось нормально с ними работать (очень библиотека была сырая). Махнул рукой и бросил их в дальний угол. А оригинальные NRF24L01+ — это класс.
Модули что в обзоре я брал по 60 центов, это сейчас они подорожали. Но я о них тоже не могу сказать что такие уже они хорошие. Работают — да, а вот я еще попробовал поиграться с ними что бы он отправлял несколько меседжей за определенное время — не заработало. Но у меня еще будет время с ними наиграться и понять, как приедут arduino pro mini тогда эти rf модули будут работать с ними.
Рекомендуют повесить 5-50 мкф прямо плату параллельно питающим пинам. Без этого иногда могут чудеса твориться (особенно при интенсивной передаче).
Проверенный диапазон 2.8-5.5В. Даже при 2.7В идет уверенная работа но на таком напряжении дальность я не проверял.
А вы не пробовали ESP8266? У меня есть версия 01, так она через две капитальных стены пробивает на улицу еще метров 40. Я был в легком акуе. У меня роутер еле под окном берет а тут какая то бздюлька фигачит как рентген. Правда после того эксперимента думаю может этот модуль нужно держать подальше :)))