Керований по радіо вимикач своїми руками
У попередніх постах ми спроектували, зробили і всебічно протестували блок двоканального радіокерованого вимикача.

Але до сих пір це була «бездушна залізяка», яка незважаючи на всю свою потенційну міць, закладену в МК, - нічого не вміє.
В общем-то, наше основне пристрій (якщо не розглядати підключення радиомодуля) - анітрохи не складніше звичайнісінькою Ардуінкі, до якої підключено дві кнопки і пара світлодіодів (в результуючому пристрої - світлодіоди замінені на транзисторні ключі, керуючі релюшкой, але суть це не міняє ).
Виготовлений модуль радіовиключатель не надто налаштовує на те, щоб прямо на ньому проводити розробку і налагодження:
- немає можливості отримати діагностичні повідомлення в «моніторі порту»,
- відсутня візуальне підтвердження, яке з реле і в якому стані знаходиться і т.п.
Але, як я раніше вже помітив, для «оживлення» нашого модуля все-то потрібно написати скетч, який би відпрацьовував різні натискання (дві кнопки) і міг би на нашу алгоритму вмикати / вимикати два навантаження (в макеті це буде пара світлодіодів). Природно, це «базовий функціонал», після того, як розберемося з ним - додамо і «радіоканальні» функції.
Взагалі, звичайно, з «макетке» правильніше було б почати, але в даному випадку - так вийшло, що прототип робився пізніше, ніж результуючий пристрій.
Отже, щоб отримати «зручну» середовище для підготовки нашого скетчу, візьмемо беспаечное макетке, будь-яку Ардуіно-сумісну плату (в моєму випадку це cArduino Nano), дві тактові кнопки, два світлодіоди (з струмообмежувальні резистори) і кілька перемичок:

Збираємо макет, згідно принципової схеми з першого поста.
- Кнопку для першого каналу підключаємо між піном A1 і «землею» (GND),
- Кнопку другого каналу - A0 і GND.
- Світлодіоди (індикатори роботи відповідних транзисторних ключів і реле в радіовиключатель) підключаємо до D3 і D4, відповідно.
Власне, такий макет дозволить нам написати й налагодити основний функціонал.
Надалі потрібно буде цей скетч завантажити за допомогою програматора в фінальне пристрій без переробок.
Перед початком розробки слід зафіксувати базові функції, які хотілося б реалізувати.
бажаний функціонал
Природно, цей список «хотелок» знаходиться в голові ще перед початком роботи над проектом, зараз просто сформулюю.
базові функції
Двоканальний вимикач буде використовуватися для управління світлом і вентиляцією в санвузлі, тому список можливостей вийшов такий:
- За короткому натискання вмикати / вимикати відповідний канал навантаження (канал 1 - світло, канал 2 - вентиляція).
- По довгому натисненню (більше 2 секунд) - фіксувати факт такого натискання ( «зводити прапор»), але поки нічого не робити додатково.
- Якщо світло увімкнено більш, ніж 1,5 хвилини - автоматично включити витяжку (наприклад, хтось пішов в душ і забув включити вентиляцію).
- Якщо були включені обидва канали та перший канал вимикається, автоматично вимкнути другий канал через 10 хвилин.
- У разі, якщо будь-яке навантаження включили, але забули вимкнути - автоматично вимкнути (у кожного каналу - свого часу автоматичного вимкнення: 60 і 10 хвилин відповідно).
При формуванні списку функцій - активно спілкуйтеся з домашніми. Наприклад, мені розумно підказали, що час, після якого має відбуватися автоматичне включення вентиляції занадто мало і будуть непотрібні спрацьовування і взагалі, всі тимчасові параметри треба мати можливість в ході експлуатації коригувати.
радіоуправління
Ці функції будуть реалізовуватися трохи пізніше, але їх відразу варто тримати в голові (менше доведеться переписувати):
- Команди включення / вимикання, що надійшли по радіоканалу повинні відпрацьовуватися так, як якщо б фізично натискалися кнопки вимикача (тобто повне збереження базової логіки).
- Через радіоканал потрібно мати можливість змінювати всі тимчасові параметри роботи вимикача.
- Тимчасові параметри роботи вимикача повинні зберігатися в енергонезалежній пам'яті (щоб після кожного вимкнення електрики не доводилося «переучувати» модуль).
- Всі параметри (поточний стан, прапори «довгого натискання», тимчасові) повинні бути доступні по радіоканалу як за запитом (відповідь на запит), так і на регулярній основі (раз в 15 секунд - «флуд» в ефір з поточними значеннями параметрів).
програмування
В ході створення ПО для реалізації базових функцій будемо враховувати наступне:
- Зараз каналів два, але в подальшому їх може бути більше / менше і код повинен бути таким, щоб це можна було просто коригувати (без істотного переписування).
- Пристрій вбудовується і в разі будь-якого збою діставати його зі стіни вкрай проблематично.
Перша вимога призводить до використання масиву структур для зберігання параметрів роботи модуля, а друге - диктує використання сторожового таймера (watchdog).
Для зберігання параметрів каналу я створив таку структуру:
Тепер уже можна написати нескладний скетч.
У функції setup () проводимо всю необхідну ініціалізацію і зводимо «сторожового собаку».
Далі все просто: в основному циклі програми (loop ()) будемо послідовно робити наступні кроки:
- Працюємо з кнопками (функція button_read ()).
- Відпрацьовуємо автовимкнення (autoOff ()).
- Реалізуємо додаткову логіку роботи (chkLogic ()).
- Скидаємо сторожовий таймер (wdt_reset ()).
Якщо додаткова логіка роботи не потрібна (в моєму випадку це автоматичне включення і виключення вентиляції в залежності від стану світла) - функцію chkLogic () можна просто видалити.
У мене вийшов ось такий скетч
Базові функції працюють рівно так, як хотілося.
Короткі натискання кнопок включають відповідні світлодіоди, доп.логіка спрацьовує. По довгому натисненню будь-яку кнопку - на одну секунду запалюється вбудований світлодіод (D13) на Ардуіно.
Тепер можна реалізовувати і бездротові функції.
Для цього звернемося до одного з моїх ранніх постів: Бездротові комунікації «розумного будинку».
Основні принципи, які я там описував - витримали перевірку часом і зазнали дуже незначні зміни.
Для роботи з параметрами підійде структура:
Для переданих даних буду використовувати наступну структуру:
Згідно вищесказаного, мій модуль буде описуватися наступним чином:
Видно, що всі ключові параметри, що описують поточний стан і тимчасові параметри, присутні.
Ще трохи програмування і код готовий.
Власне, тепер залишилося прошити наш модуль.
Прошив, перевірив роботу - все ок, але виявилося, що в «чистому» МК все байти EEPROM встановлені в 255, що дає відповідні затримки.
За кодом, який наведено вище, видно, що установка всіх часових параметрів проводиться тільки через радіоканал. Але про «керуючий модуль» я ще нічого не написав - тому треба якось «ізольовано» вирішити цю проблему.
Для цього можна скористатися прикладами з бібліотеки EEPROM і прямо з них прописати первинні (більш актуальні) значення у відповідні комірки незалежній пам'яті.
Подальша перевірка показала, що тепер все працює як раз так, як хотілося.
Ще раз повторю свій основний принцип пристроїв мого «розумного будинку»: кожне створене пристрій зроблено для досягнення якоїсь певної мети і воно повинно працювати самостійно.
Тепер пристрій самодостатньо і готовий виконувати свою основну функцію (навіть без радіоканалу). Можна монтувати.
установка модуля
Керований по радіо модуль буде монтуватися всередину стіни з гіпсокартону - тому декілька найбільш прийнятних корпус (щоб в нього вліз власне модуль і блок живлення для нього і щоб цей корпус можна було без проблем пропхати в отвір для установки монтажної коробки).
Плату блоку живлення взяв там же, де і минулого разу - розпиляв блок живлення для iPhone. В принципі, можна зробити конденсаторний блок живлення або пошукати вже готові варіанти (наприклад, тут).
Вийшло якось так (тут вже все підключено - проводив останні тести перед монтажем в стіну):

Корпус виявився дещо завеликий, але наявний в господарстві дрібніший - не підійшов.
Правильніше було б, звичайно, спочатку вибрати конкретний корпус і робити під нього, але у мене не було особливих обмежень на розмір, тому «як вийшло».
Тепер можна зайнятися безпосередньо «встраиванием» модуля в стіну (на жаль, захопився процесом і забув фотографувати, тому тільки текстовий опис):
- Знеструмлюємо відповідну ланцюг освітлення.
- Демонтуємо наявний вимикач (не забуваємо промаркувати, які пари йдуть на світло, а які - на витяжку).
- Знімаємо монтажну коробку
- Підключаємо радіовимикач до відповідних проводам (попутно позбуваючись від «скруток», які залишили «добрі будівельники»).
- Акуратно заштовхуємо всі дроти і радіовимикач в проміжок між листами гіпсокартону (я вирішив розташувати модуль вище вимикача, щоб його було простіше дістати при необхідності).
- Виводимо проводу, до яких будемо підключати кнопковий вимикач в отвір для установки монтажної коробки (спеціально взяв принципово відрізняється від решти проводки кабель - МГТФ, щоб в разі чого електрику було зрозуміло, що тут «щось дивне» і з цим треба спочатку розібратися) .
- Тепер можна встановити монтажну коробку і підключити кнопковий вимикач.
Все готово. Включаємо електрику і перевіряємо, що все працює так, як хотілося.
Створене пристрій успішно змонтовано і відмінно замінило «тупий» вимикач, додавши до нього трішки «розуму» (економію електроенергії у випадках «забудькуватості» господарів, автоматичне включення / вимикання витяжки тощо).
P.S. В обговоренні першого поста були питання з приводу використання іншої елементної бази, в тому числі і для досягнення більш компактних розмірів.
Нещодавно в руки мені потрапив ось такий звір:

Це звичайне реле (дуже тихе) з двома групами комутованих контактів. Може вмикати / вимикати ланцюга на 220В (потужність невелика, але для світлодіодних ламп - цілком підійде). Управляється 5В, можна підключати безпосередньо до висновку МК (без транзистора).
Це я до того, що не варто до всього ставитися як до догми (повторювати всі проекти «один в один») - шукайте, підбирайте найбільш адекватні (для кожного конкретного завдання) рішення, змінюйте!