Автомат включения освещения от радио датчиков и проводных датчиков
- Войдите на сайт для отправки комментариев
Есть такие недорогие радио датчики у китайских друзей для сигнализаций. PIR датчики и датчики дверные. Решил их же использовать для автоматизации освещения. Помимо этого есть возможность подключить PIR датчик типа HC-SR50 и внешний герконовый датчик или микропереключатель. Управление светильником двойное - по цепи 220В используя твердотельное реле и по цепи питания светодиодов используя ШИМ и мосфет. Подключать можно один из них либо оба. Для связи с радио датчиками применен вот такого типа приемник
Кроме того еще есть фоторезистор с подстроечником и подстроечник для настройки времени свечения
Получилась вот такая схема:
Для подключения радио датчика (не важно какого - PIR или дверного) используется кнопка. При первом нажатии входим в режим програмирования. светодиод начинает мигать. При получении первого радио сообщения провряется нет ли уже этого кода и если нет, то он запоминается и выходим из режима програмирования. Кол-во датчиков задано в программе сейчас как 6. Все они сохраняются в EEPROM. Из режима програмирования еще одним нажатием можно войти в режим сброса, светодиод начинает быстро моргать, если еще раз нажать кнопку то все устройства забываются
Еще не реализовал подстройку освещенности и времени, применение проводных датчиков. Но там все просто. Было важно отладить радио. Для радио применил RCSwitch библиотеку которая декодирует сообщения от примененных в датчиках микросхем.
#define LIGHT_HALF_OFF_PWM 40 // % частичная яркость #define LIGHT_TIMEOUT_ON_MIN 10 // время в минутах скоько будет полная яркость после последнего радио сообщения #define LIGHT_TIMEOUT_HALF_OFF_MIN 2 // время ожидания без событий в частичной яркости #define LEDPIN 13 #define LIGHTPWM 10 #define LIGHTRELAY 9 #define BUTTONPIN 3 #define NUM_DEVICES 6 #include <avr/eeprom.h> #include <avr/wdt.h> #include <RCSwitch.h> typedef enum { status_off=0, // все выключено status_half_off=1, // яркость в половину status_on=2 // полная яркость } status_enum; typedef struct { uint32_t id[NUM_DEVICES]; uint8_t num; } radio_devices_struct; radio_devices_struct radio_devices; radio_devices_struct eemem_radio_devices EEMEM; struct { status_enum status; uint8_t light_pwm; unsigned long timer; } var; RCSwitch mySwitch = RCSwitch(); void setStatus(int status) { switch(var.status) { case status_off: switch(status) { case status_on: lightUp(); break; case status_half_off: case status_off: break; } break; case status_half_off: switch(status) { case status_off: lightDown(0); break; case status_half_off: break; case status_on: lightUp(); break; } break; case status_on: switch(status) { case status_off: lightUp(); break; case status_half_off: lightDown(LIGHT_HALF_OFF_PWM * 256 / 100); break; case status_on: break; } break; } switch(status) { case status_off: var.timer = 0; var.status = status_off; break; case status_half_off: var.timer = millis() + (LIGHT_TIMEOUT_HALF_OFF_MIN * 60 * 1000LL); var.status = status_half_off; break; case status_on: var.timer = millis() + (LIGHT_TIMEOUT_ON_MIN * 60 * 1000LL); var.status = status_on; break; } } void setup() { // индикаторный светодиод pinMode(LEDPIN, OUTPUT); // управляющая кнопка digitalWrite(BUTTONPIN, HIGH); // выход управления яркостью лампы pinMode(LIGHTPWM, OUTPUT); analogWrite(LIGHTPWM, 0); // выход управления реле лампы pinMode(LIGHTRELAY, OUTPUT); mySwitch.enableReceive(0); eeprom_read_block(&radio_devices, &eemem_radio_devices, sizeof(radio_devices_struct)); if(radio_devices.num >= NUM_DEVICES) radio_devices.num = 0; blinkLED(radio_devices.num, 1000, 500); var.status = status_off; } void loop() { if(mySwitch.available()) { // получено радио сообщение int value = mySwitch.getReceivedValue(); mySwitch.resetAvailable(); // реакция на событие if(searchDevice(value) >= 0) { blinkLED(1, 50, 0); setStatus(status_on); } } // проверяем не вышо ли время и не пора ли выключать полностью или частично if(var.timer && (millis() > var.timer)) { blinkLED(6, 50, 50); switch(var.status) { case status_on: setStatus(status_half_off); break; case status_half_off: setStatus(status_off); break; case status_off: break; } } if(digitalRead(BUTTONPIN) == 0) { delay(200); unsigned long time1 = millis(); while(millis() - time1 < 30 * 1000) { // нажата кнопка if(radio_devices.num < NUM_DEVICES) { if(mySwitch.available()) { int value = mySwitch.getReceivedValue(); if(searchDevice(value) < 0) { radio_devices.id[radio_devices.num] = value; eeprom_write_block(&radio_devices.id[radio_devices.num], &eemem_radio_devices.id[radio_devices.num], sizeof(uint32_t)); radio_devices.num++; eeprom_write_byte(&eemem_radio_devices.num, radio_devices.num); break; } //while(mySwitch.available()) { mySwitch.resetAvailable(); // delay(100); //} } blinkLED(1, 200, 200); } else { // нет места для новых устройств blinkLED(1, 600, 100); } if(digitalRead(BUTTONPIN) == 0) { // кнопка нажата повторно delay(500); time1 = millis(); while(millis() - time1 < 10 * 1000) { blinkLED(1, 50, 50); if(digitalRead(BUTTONPIN) == 0) { // очитска списка устройств radio_devices.num = 0; eeprom_write_byte(&eemem_radio_devices.num, radio_devices.num); blinkLED(5, 1000, 200); break; } } } } } } int searchDevice(int value) { // поиск ID for(uint8_t i=0; i<radio_devices.num; i++) { if(radio_devices.id[i] == value) return i; } return -1; } void ledCB(void) { digitalWrite(LEDPIN, (digitalRead(LEDPIN))?LOW:HIGH); } void setLightPWM(uint8_t pwm) { digitalWrite(LIGHTRELAY, (pwm)?HIGH:LOW); analogWrite(LIGHTPWM, pwm); var.light_pwm = pwm; } void lightUp() { for(uint16_t pwm=var.light_pwm; pwm < 256; pwm++) { setLightPWM(pwm); delay(10); } } void lightDown(uint8_t to_pwm) { for(uint8_t pwm=var.light_pwm; pwm > to_pwm;) { setLightPWM(--pwm); delay(50); } } void blinkLED(uint8_t cnt, uint16_t time_on, uint16_t time_off) { for(uint8_t i=0; i<cnt; i++) { digitalWrite(LEDPIN, HIGH); delay(time_on); digitalWrite(LEDPIN, LOW); delay(time_off); } }
а это моя "ардуиа" сейчас )) делаю платку
так должно получиться
класно
я уже забыл такие атмеловские макетки
делись с шаблоном платки я буду ЛУТ-ом развлекатся :)
только я не понял цель
В сартир когда пришел светодиодная лампочка зажглась на 10 минут, а ты злодей в самый ответсвенный момент темную радейкой устраиваешь?
надо код посмотреть
может там спрятаны сакральнЫе знаниЯ целеуказаниЯ :-)
плин тебя что на с шарпе учить начинали
ну нет мне не по душе такой стиль
простые вещи структуировать
когда я учился програмировать не было ни сишарпа ни джавы, даже сипласплас был в зачатке)))
на вкус и цвет товарищей нет
насчет туалета пока не знаю. Если буду делать то там будет связка датчика движения с датчиком двери. Нормально можно сдделать, но там радио датчик особо не потребуется, достаточно проводного будет
в первую очередь эта штука пойдет в коридор
вот оно, сразу три штуки
в режиме покоя из сети потребляет 0.9Вт
Приемник без антенны ?? Работает ? Просто у меня такие же "радиомосты" в пределах квартиры работают достаточно нестабильно, прохождение сигнала зачастую зависит от расположения звезд, направления ветра и цены за куб дров в Жмеринке )) Антенны пробовал разные.
Да, приемники без антенн. Практика покажет
в логике работы моего устройства мне нужна дальность в рамках одного помещения - включать свет там же где установлены сенсоры с передатчиками
Да, приемники без антенн. Практика покажет
Удивлен. У меня без антенн "дальнобойность" была меньше метра.
еще не тестировал дальность, пока все лежало на одном столе, но в моем случае у передатчиков есть антенны
протестировал, все не так плохо
с брелка пробивает через две стены, а вот с датчика движения с выдвижной антенной из любого угла квартиры добивает
А все таки платочку можно? Могу обещать все перелопатить но ссылаться буду. Что там у Вас sprint ? Вчера на день рождения сотруднику подарили arduino uno r3. Нас ардуинщиков оказалось 2-ое. Мы в двоем подсаживаем его 3-его на этот наркотик. :) За вчера мы ему выдрали из системника кнопки и светодиоды. Подопытным blink fade и button были пройдены, под наши пинки ногами. Восторженный взгляд в его глазах был замечен. Мы поняли наркотик подействовал. Начинает донимать вопросами не пролистав "примеры". Был послан на пердварительную оплату 100$ за разьяснение на С. Посмотрим, денежная стимуляция заставила его пролистать и прочитать примеры? Ваш покорный слуга превратился в arduino-наркодилера в составе организованной преступной группы. Ардуино-ОПГ в действии. ;)
Да можно. Только она в альиум дизайнер
реализовал весь функционал
есть еще желание избавиться оот delay() вынеся все в обработчик прерывания от таймера, но функции и без этого работают
Так оно выглядит в натуре:
заработало! установил вот в этот светильник
в него незаметно встроена коробочка
Респект! Датчик движения прямо в люстре за стеклом? Стекло не мешает,ном работает?
спасибо! если посмотрите на пост #12 там на фото два варианта моего устройства - с установленным датчиком движения и без него
фото с люстрой там вариант без датчика движения. Эта люстра работает исключительно с радио датчиками, к ней запрограмрованы два дверных датчика и один датчик движения, поэтому установка здесь полностью скрытая
Чуть позже в этот светильник встрою вместо лампочек свои светодиоды и тогда мое устройство будет не просто включать и выключать, а делать плавное включение и двух этапное выключение. Для этого в устройстве уже все есть.
в другом месте в примерно такую же люстру поставил модуль с встроенным датчиком движения, только фото не сделал. Там мое устройство стоит на потолке в 20 сантиметрах от подвеса светильника. Там тоже есть радио датчик движения и получается что идет дублирование встроенным датчиков и радио датчиком. Специально делал такую универсальную вещь.
Третье устройство будет тоже скрытой установки внутри люстры.
Если все правильно заработает буду делать еще штук пять. У них так же предусмотрено подключение проводного дверного датчика (геркон). Это удобно для установки в таких помещениях как гардеробная, кладовая, туалет.
Есть идея сделать еще вариант который будет ставится вместо настенного выключателя. Он тоже будет двух вариантов - с установленным датчиком движения и без него (наверно с сенсорным управлением). Есть как минимум два места где удобна такая установка. Нужно будет только сделать другой формат платы и другой корпус. Схема не изменится и скетч будет тот же
Если я правильно понял ,то датчики работают через стекло люстры без проблем ?
Я во все свои поделки вроде радиовыключателей стал использывать блоки питания такого типа http://www.ebay.com/itm/AC-DC-Power-Supply-Step-Down-Module-Buck-Converter-5V-700mA-85-265V-for-Arduino-/351202429651?&_trksid=p2056016.m2518.l4276
получается что то типа этого
Врядли датчик движения будет работать через стекло. На моих фото светильника нет датчика движения
классный у вас модуль. Для управления нагрузкой симистор? Что то не вижу оптопары, есть гальваническая развязка от сети?
такие блоки питания у меня тоже есть. В выключатели я буду ставить схему на LNK306, как самую компактную. Разбирал несколько фирменных диммеров и радиовыключателей - там именно схема на lnk306
Но еще нужно решение для двухпроводного включения. Тогда можно будет легко заменять обычные выключатели там где нет нулевого провода. Уже есть понимание как это делать, нужно реализовать
Считается, что обычное стекло непрозрачно для ИК излучения. На экранах тепловизоров оно выглядит как зеркало.
Поскольку ИК датчики движения по сути своей тепловые, через обычное стекло движение они не "видят".
Что то не вижу оптопары, есть гальваническая развязка от сети?
он притаился под семистором )
для двухпроводной схемы у меня другое решение,правда пришлось поменять распаячные коробки в стене ) Но зато модули докучи собирают данные о влажности ,температуре , давление, освешенности и движение .
Считается, что обычное стекло непрозрачно для ИК излучения. На экранах тепловизоров оно выглядит как зеркало.
Поскольку ИК датчики движения по сути своей тепловые, через обычное стекло движение они не "видят".
уверен, что все именно так)) просто не стал умничать)
он притаился под семистором )
ясно)) подключение по трем проводам? L + N + нагрузка?
если сделаю на LNK306 - это БП без трансформатора, то можно будет в принципе сэкономить и на оптопаре, она уже как таковая не нужна, но буду делать сэндвич - отдельно силовая плата, отдельно плата с МК, при отладке плату с МК подключать к лабораторному БП и безопасно отлаживать, а потом втыкаешь в силовую плату и ставишь на место
Считается, что обычное стекло непрозрачно для ИК излучения. На экранах тепловизоров оно выглядит как зеркало.
Поскольку ИК датчики движения по сути своей тепловые, через обычное стекло движение они не "видят".
Только что проверил эксперементально,Вы оказались правы )
не поделитесь своей схемкой на LNK306 ?
L + N + нагрузка? - именно так
Только что проверил эксперементально,Вы оказались правы )
даже если применить специальное стекло через которое инфракрассный свет проходит, оно изменить оптическую геометрию и все равно бы нормально датчик не смог бы работать
не поделитесь своей схемкой на LNK306 ?
схема стандартная из даташита, только я подобрал SMD компоненты, выглядит на отдельной плате так:
хорошо когда так можно подключить. Но бывает без капремонта или порчи внешнего вида нулевой провод не провести. Вот и нужен вариант с двумя проводами
у меня обошлось относительно малой кровью плюс удачное расположение распаячной коробки,прямо над выключателем на стене
ну так да, есть такие удачные места)) но их количество ограничено