![]() |
|
![]() |
#1 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1312 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Это простейший вариант, в дальнейшем буду добавлять функционал.
Понажимать можно здесь. ![]() Требования: Любой сервер с поддержкой php, например Lighttpd и сам PHP. Ардуина подключается либо к USB, либо к UART, кому как удобнее. Описание на примере usb и ардуино nano. Установим драйвера для разных ардуин и утилиту для настройки порта stty: PHP код:
PHP код:
Устанавливаем и настраиваем небольшой прокси-сервер ser2net, он создаёт соединение между сокетом и устройством (/dev/ttyUSB0). PHP код:
PHP код:
Добавим ser2net и stty в автозагрузку: PHP код:
PHP код:
В примере используется устройство /dev/ttyUSB0, у Вас может быть другое! (ttyATH0 — консоль, ttyACM0 — мега) Если подклюаете к UART, то надо подправить файл /etc/inittab, закомментировав последнюю строчку: PHP код:
PHP код:
PHP код:
![]() . . . Скачайте архив и распакуйте его в рабочую папку сервера, чтоб было так /var/www/primer/. У Вас может быть другая рабочая папка. Прошейте в ардуину этот скетч: PHP код:
Прверить работу можно так: Вкл PHP код:
PHP код:
Для лучшего понимания откройте файлы index.html и box2.php из архива, и посмотрите комментарии. В браузере заходим по аресу ваш_роутер/primer/ Должно получится так: ![]() Если надпись stD серая, это значит что связь с ардуиной установлена, если красная, то связи нет. Нажатие на лампочку отсылает в ардуину символ включения или отключения (в зависимости от состояния), ардуина выполняет действие и посылает в ответ строку с флагами состояния (единица или ноль). Ответ разбирается в html-странице и в зависимости от флагов выводит картинку лампочки. Если открыть ещё одну страничку (или зайти с другого устройства) и включить лампочку, то на первой страничке (в течении 3 сек.) тоже включится лампочка. Для этого и нужно обновление. Интервал меняется в index.html. PHP код:
Последний раз редактировалось stD; 11.06.2015 в 18:33. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1312 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Шаблон веб-интерфейса с помощью которого можно будет включать и отключать «что-то» подключённое к пинам ардуино (D2 — D13).
![]() Посмотреть и понажимать можно здесь... Скачайте архив и распакуйте его в рабочую папку сервера (по умолчанию это /var/www), чтоб получилось так /var/www/knopki. У Вас может быть своя папка. Прошиваем скетч: PHP код:
Ардуина обрабатывает управляющий символ внутри функции switch (например включает светодиод) и отправляет ответ роутеру, который в свою очередь отдаст его клиенту. Работа с клиентом описана ниже. . Теперь в браузере зайдите по адресу ваш_роутер/knopki/ Если связь установлена, то Вы увидите это: ![]() Нажмите на D13 — загорится светодиод на ардуине и кнопка подсветится. . Как работает: Обновление страницы. index.html раз в три секунды (интервал можно изменить) запрашивает данные у ардуины (отправляя ей символ о) с помощью функции ajax (ajax позволяет не перегружать страницу). PHP код:
PHP код:
PHP код:
PHP код:
Нажатие на кнопку: Нажатие на кнопку работает так же как и «обновление», в ардуину отсылается символ включения или отключения (в зависимости от состояния), ардуина выполняет действие и посылает в ответ строку с флагами состояния (единица или ноль). Ответ разбирается в html-странице и в зависимости от флагов выводит на экран нужную кнопку. Для лучшего понимания откройте файл index.html из архива, и посмотрите комментарии. . Если связи между ардуиной и роутером нет, то будет только красная надпись stD — это индикатор работы, когда связь установлена, надпись становится серой. ![]() Подождите минуту и пообновляйте страницу. Если связь не устанавливается, то проверьте настройки роутера. Проверьте права на файлы, правильность путей и устройств. . Дизайн Названия кнопок меняются в конце файла index.html PHP код:
PHP код:
PHP код:
PHP код:
Последний раз редактировалось stD; 05.05.2015 в 10:21. |
![]() |
![]() |
![]() |
#3 |
Junior Member
Регистрация: 17.03.2015
Сообщений: 27
Вес репутации: 0 ![]() |
![]()
посмотрите в Test модуль Light Control - в нем реализуется аналогичная функциональность с несколько расширенными возможностями. Для своего модуля можете почерпнуть, в частности, как можно организовать более хитрое ajax-взаимодействие: устанавливать на клиенте соединение с большим таймаутом, а в cgi-скрипте придерживать ответ, если нет обновлений от Arduino. А при обновлении отвечать сразу, в результате лаг считывания состояния - порядка 1,5 секунд, при редких (не более 3х в минуту) запросах от клиентов к http-серверу.
В модуле Light Control пошли по пути "утяжеления" решения введением БД: 1. это позволит не конфликтовать множеству параллельных запросов к порту, если подключается несколько клиентов. 2. можно будет хранить не только текущее состояние пинов, но и историю по некоторым, что позволит просматривать логи, строить графики. |
![]() |
![]() |
![]() |
#4 | |||
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1312 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
... Цитата:
У себя, я реализовал подобное решение давно. Просто здесь я буду выкладывать всё поэтапно, чтоб не выглядело громоздко. ... А спросить я хотел про это: Цитата:
Я не до конца понял Вашу мысль, в частности мне не понятно вот это "если нет обновлений от Arduino". |
|||
![]() |
![]() |
![]() |
#5 | |||
Junior Member
Регистрация: 17.03.2015
Сообщений: 27
Вес репутации: 0 ![]() |
![]() Цитата:
Цитата:
Если нужен код, а Cyberwrt нет - напишите в личку, я пришлю отдельно cgi Цитата:
PHP код:
это позволяет не создавать постоянно новых процессов на сервере для данного клиента, а клиент не создает слишком часто ajax-запросов и не увеличивает трафик. Основное назначение Light Control - управление светом, поэтому задержка обновления состояния в 1-2 секунды не напрягала. А в исходном посте я предложил вам посмотреть модуль, чтобы не гонять впустую ajax каждые 3 секунды. Последний раз редактировалось Prana; 05.05.2015 в 14:13. |
|||
![]() |
![]() |
![]() |
#6 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1312 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Да, забыл сказать, что использование БД для хранения состояний не всегда удобно, а в некоторых случаях не допустимо.
С таймаутами аякса, тоже есть нюансы, при некоторых обстоятельствах. Например в одном из "проектов", было жизнено необходимо мгновенное обновление страницы. Устройство находилось за 200 км от города, пинги о-го-го, приходилось искать компромисс между таймаутами, пингами и потерей пакетов. Вобщем интервал обновления около 100 мс. Разумется запись в базу данных и параллельное чтение не совсем разумно. Последний раз редактировалось stD; 05.05.2015 в 14:06. |
![]() |
![]() |
![]() |
#7 |
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1312 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Я понял Вашу мысль.
Получается, что когда Вы смотрите на экран (например планшета), Вы не можете быть уверены в том, есть ли связь с ардуиной или нет. ... Собственно я и "гоняю" пакеты так часто, чтобы видеть что связь есть. Если ардуина отвалилась от роутера или отвалился инет, как Вы об этом узнаете? ... Не подумайте что я придираюсь, просто пытаюсь вникнуть. Последний раз редактировалось stD; 05.05.2015 в 14:59. |
![]() |
![]() |
![]() |
#8 | ||
Junior Member
Регистрация: 17.03.2015
Сообщений: 27
Вес репутации: 0 ![]() |
![]() Цитата:
Цитата:
В любом случае, я не считаю веб-приложение пригодным для ответственной realtime работы, а простое управление нагрузками вроде света или отопления, по локальной сети или даже через Интернет, вполне можно на нем строить. Если нужно что-то серьезнее, то я бы ушел от ajax к сокетам и отдельному демону, слушающему tcp-порт. |
||
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Регистрация: 02.04.2012
Адрес: Питер
Сообщений: 1,125
Вес репутации: 1312 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Цитата:
Последний раз редактировалось stD; 05.05.2015 в 15:19. |
||
![]() |
![]() |
![]() |
#10 | |
Junior Member
Регистрация: 17.03.2015
Сообщений: 27
Вес репутации: 0 ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|