Стаття про те, як з дешевого китайського пристрою створити програмований логічний контролер. Такий пристрій знайде своє застосування як у домашній автоматизації, так і як практичні заняття з шкільної інформатики.
Для довідки, за умовчанням програма Sonoff Basic працює з мобільним додатком через китайський хмарний сервіс, після пропонованої переробки, вся подальша взаємодія з цим пристроєм стане можливим у браузері.
Розділ I. Підключення Sonoff до сервісу MGT24
Крок 1. Створення панелі керування
Зареєструйтесь на сайті
Вхід в систему
Щоб створити панель керування для нового пристрою, натисніть кнопку «+».
Приклад створення панелі
Після того, як панель буде створена, вона з'явиться у списку панелей.
У вкладці «Установка», створеній панелі, знайдіть поля «ID пристрою» та «Ключ авторизації», надалі ця інформація буде потрібна при налаштуванні Sonoff пристрою.
Приклад вкладки
Крок 2. Перепрошивка пристрою
За допомогою утиліти
Крок 3. Налаштування пристрою
Подайте на пристрій живлення, після того як засвітиться світлодіод, натисніть кнопку і утримуйте її в натиснутому стані до тих пір, поки світлодіод не почне періодично рівномірно блимати.
У цей момент з'явиться нова wi-fi мережа під назвою «PLC Sonoff Basic», підключіть свій комп'ютер до цієї мережі.
Розшифрування світлодіодної індикації
індикація
Состояние пристрою
періодичне подвійне миготіння
немає зв'язку з роутером
безперервно світить
встановлений зв'язок з роутером
періодичне рівномірне миготіння
режим wi-fi точки доступу
згашена
немає харчування
Відкрийте веб-браузер і введіть в адресний рядок текст «192.168.4.1», перейдіть на сторінку установок параметрів мережі пристрою.
Заповніть поля наступним чином:
- "Ім'я мережі" та "Пароль" (для прив'язки пристрою до домашнього wi-fi роутера).
- "ID пристрою" та "Ключ авторизації" (для авторизації пристрою на сервісі MGT24).
Приклад налаштування параметрів мережі пристрою
Збережіть налаштування та перезавантажте пристрій.
Тут
Крок 4. Підключення датчиків (опціонально)
Поточна прошивка підтримує чотири датчики температури ds18b20. Тут
Розділ ІІ. Візуальне програмування
Крок 1. Створення сценаріїв
Як середовище програмування використовується
Я додав спеціалізовані блоки для запису та читання параметрів пристрою. Доступ до будь-якого параметра здійснюється на ім'я. Для параметрів віддалених пристроїв використовуються складові імена: параметр@пристрій.
Список параметрів, що випадають
Приклад сценарію циклічного включення та вимкнення навантаження (1Гц):
Приклад сценарію, що синхронізує роботу двох окремих пристроїв. Зокрема, реле цільового пристрою повторює роботу реле віддаленого пристрою.
Сценарій для термостату (без гістерези):
Щоб створювати більш складні сценарії, можна використовувати змінні, цикли, функції (з аргументами) та інші конструкції. Не буду тут все це розписувати докладно, в мережі вже є чимало
Крок 2. Порядок виконання сценаріїв
Сценарій працює в безперервному режимі, і як тільки він доходить до свого закінчення, він запускається знову. При цьому є два блоки, які можуть призупинити роботу сценарію, «delay» і «pause».
Блок delay використовується для мілісекундних або мікросекундних затримок. Цей блок витримує тимчасовий інтервал, блокуючи роботу всього пристрою.
Блок "pause" використовується для секундних (можна і менше) затримок, і він не блокує виконання інших процесів у пристрої.
Якщо сценарій у собі містить нескінченний цикл, у тілі якого немає «pause», інтерпретатор самостійно ініціює маленьку паузу.
У разі вичерпання виділеного стека пам'яті інтерпретатор зупинить виконання такого ненажерливого сценарію (будьте обережні з рекурсивними функціями).
Крок 3. Налагодження сценаріїв
Для налагодження вже завантаженого у пристрій сценарію можна запустити трасування програми по кроках. Це буває вкрай корисно, коли поведінка сценарію виявилася не такою, як задумував автор. У цьому випадку трасування дозволяє автору швидко знайти джерело проблеми та виправити помилку в сценарії.
Сценарій обчислення факторіалу у налагоджувальному режимі:
Інструмент налагодження дуже простий і складається з трьох основних кнопок: "пуск", "один крок вперед" і "зупинка" (також не забудемо про "вхід" і "вихід" з режиму налагодження). Крім покрокового трасування можна встановити точку зупинки на будь-якому блоці (клацанням миші над блоком).
Щоб вивести в монітор поточні параметри (датчики, реле) використовуйте блок «print».
Тут
Розділ для допитливих. А що ж під капотом?
Для того, щоб сценарії працювали на цільовому пристрої, був розроблений інтерпретатор байт-коду та асемблер на 38 інструкцій. У вихідний код blockly був вбудований спеціалізований генератор коду, який конвертує візуальні блоки в інструкції асемблерів. Надалі ця асемблерна програма перетворюється на байт-код і передається у пристрій виконання.
Архітектура цієї віртуальної машини досить проста і описувати її особливого сенсу немає, в мережі ви знайдете багато статей про проектування найпростіших віртуальних машин.
Під стек своєї віртуальної машини зазвичай виділяю 1000 байт, цього вистачає із запасом. Звичайно, глибокі рекурсії можуть вичерпати будь-який стек, але навряд чи знайдеться практичне застосування.
Підсумковий байт-код виходить досить компактним. Як приклад, байт-код обчислення того самого факторіалу складає всього 49 байт. Це його візуальна форма уявлення:
А це його асемблерна програма:
shift -1
ldi 10
call factorial, 1
print
exit
:factorial
ld_arg 0
ldi 1
gt
je 8
ld_arg 0
ld_arg 0
ldi 1
sub
call factorial, 1
mul
ret
ldi 1
ret
Якщо асемблерна форма уявлення не має будь-якої практичної цінності, то вкладка «javascrit», навпаки, дає більш звичний вигляд ніж візуальні блоки:
function factorial(num) {
if (num > 1) {
return num + factorial(num - 1);
}
return 1;
}
window.alert(factorial(10));
Щодо продуктивності. При запуску найпростішого сценарію мигалки на екрані осцилографа я отримав меандр 47кГц (при тактовій частоті процесора 80МГц).
Вважаю це непоганим результатом, принаймні ця швидкість майже в десять разів швидше ніж у
Заключна частина
Підсумовуючи, скажу, що застосування сценаріїв дозволяє нам не тільки запрограмувати логіку роботи окремого пристрою, а й дає можливість зв'язати декілька пристроїв у єдиний механізм, де одні пристрої впливають на поведінку інших.
Також зазначу, що вибраний спосіб зберігання сценаріїв (безпосередньо в самих пристроях, а не на сервері), спрощує перемикання пристроїв, що вже працюють, на інший сервер, наприклад на домашній Raspberry, тут
На цьому все буду радий почути поради та конструктивну критику.
Джерело: habr.com