Управление реле по ethernet при помощи arduino
В моих публикациях [1,2,3] подробно описана цепочка датчик – Arduino-интерфейс Python. В реальных условиях промышленного производства датчики находиться на значительном удалении не только друг от друга но и от места где осуществляется централизованная обработка измерительной информации. Логично передавать информацию от датчиков по компьютерной локальной сети используя хорошо разработанные сетевые технологии. Данная публикация написана в стили упражнения по сборке и настройке сетевого приложения с Arduino в домашних условиях.
Шилд Arduino Ethernet Shield
Сначала подключите шилд к плате Arduino, а затем подсоедините его к сети при помощи кабеля RJ45. Ethernet-кабель, идущий от роутера к шилду Ethernet, должен быть подключен следующим образом:
Схема
Соедините компоненты как показано на картинке ниже:
Внимание! Не трогайте провода, подключенные к сетевому напряжению. Убедитесь, что затянули все шурупы.
Разработка веб-приложений с использованием Python
Запустив веб-сервер на базе Python на вашем компьютере или других устройствах, таких как Raspberry Pi, вы можете избежать использования Arduino для размещения веб-сервера. Веб-приложения, созданные с использованием языков высокого уровня, таких как Python, также могут предоставить дополнительные возможности и расширяемость по сравнению с Arduino.
Будем использовать библиотеку Python, web.py, для создания веб-сервера Python. Мы также будем использовать эту библиотеку для создания интерактивных веб-приложений, которые позволят передавать данные между клиентом Arduino и веб-браузером.
Скетч: Управление лампочкой при помощи реле-модуля и датчика движения типа PIR
Ниже будет рассказываться, как сделать цепь с лампой, реагирующей на движение. После того, как датчик заметит движение, лампочка будет гореть в течение 10 секунд. Движение будет определяться при помощи датчика движения типа PIR. Более подробно о том, как использовать датчик типа PIR вместе с платой Arduino, читайте тут.
Схема
Соберите цепь, как показано на картинке ниже:
Реле-модуль
Реле – это переключатель с электрическим приводом. Это значит, что его можно включать и выключать, управляя тем, может ли проходить через него электрический ток. Как выглядит реле-модуль, показано на картинке ниже:
В частности, модуль на картинке выше состоит из двух реле (это синие кубы).
Что касается сетевого напряжения, то у каждого реле для работы с ним имеется три выходных контакта.
- COM (от «common») – общий контакт.
- NO (от «normally open») – нормально разомкнутый контакт. Общий контакт и нормально разомкнутый контакт между собой не соединены. Но когда вы включаете реле, эти контакты замыкаются и потребитель (в нашем случае – лампа) начинает получать питание.
- NC (от «normally closed») – нормально замкнутый контакт. Общий контакт и нормально замкнутый контакт соединены друг с другом, даже если реле выключено. Но если включить реле, цепь размыкается и питание перестает идти потребителю.
Хотя это зависит от проекта, но в нашем случае лучше использовать нормально разомкнутый контакт, потому что мы будем включать лампу время от времени. Более подробно об использовании реле-модуля с платой Arduino можно почитать тут.
Реле и плата Arduino подключаются друг к другу очень просто:
- GND – к «земле»
- IN1 – к цифровому контакту Arduino (используется для управления первым реле)
- IN2 – к цифровому контакту Arduino (используется для управления вторым реле)
- VCC – к 5 вольтам
Веб-фреймворк Python — web.py
Веб-сервер может быть разработан в Python с использованием различных веб-фреймворков, таких как Django, bottle, Pylon и web.py. Мы выбрали web.py как предпочтительную веб-структуру благодаря своим простым, но мощным функциям.
Как выключатели взаимодействуют с OpenHAB
Но чтобы использовать этот способ выключатели должны знать состояние Light_1 в OpenHAB. Чтобы, если свет выключен, отправлять команду ON и наоборот. Для этого пришлось бы использовать поллинг.
Оказалось OpenHAB поддерживает еще такие запросы:
Этот вариант позволяет не хранить состояние, поэтому я использую его.
Пока не выбрал окончательно какие действия назначить кнопками и выключателю. Сейчас три кнопки и выключатель управляют светом, а одна используется для оповещения о температуре внутри и снаружи(через генератор речи).
Часто при выключении света удобно чтобы он выключился не в момент нажатия кнопки, а чуть позже. Поэтому для выключателя я написал правило, чтобы он работал так:
- если весь свет выключен, то включается свет по умолчанию (это Items из группы SmartSwitchDefaultLights)
- если какой-то свет включен, то выключается весь дневной свет, включается свет по умолчанию и ставится таймер на 5 минут на выключение света
Вот код этого правила:
Дальше я кратко опишу хардвер выключателей.
Первое веб-приложение Python
Реализация веб-сервера с помощью web.py — очень простой и понятный процесс. Для библиотеки web.py требуется объявление обязательного метода GET для успешного запуска веб-сервера.
Когда клиент пытается получить доступ к серверу с помощью веб-браузера или другого клиента, web.py получает запрос GET и возвращает данные, указанные в этом методе. Для создания простого веб-приложения с использованием библиотеки web.py создайте файл Python, используя следующие строки кода и выполните файл с помощью Python.
При выполнении вы увидите, что сервер теперь запущен и доступен через адрес 0.0.0.0:8080. Поскольку серверная программа запущена на IP-адресе 0.0.0.0, вы можете получить к ней доступ с помощью того же компьютера, локального хоста или любого другого компьютера из той же сети.
Чтобы проверить сервер, откройте веб-браузер и перейдите по адресу 0.0.0.0:8080. Когда вы пытаетесь получить доступ к серверу с того же компьютера, вы также можете использовать 127.0.0.1:8080 или localhost:8080. 127.0.0.1 IP-адрес фактически означает localhost, то есть сетевой адрес того же компьютера, на котором запущена программа. Вы сможете увидеть ответ сервера, отображаемого в браузере, как показано на следующем снимке экрана:
Чтобы понять, как работает этот простой код, ознакомьтесь с методом GET в предыдущем фрагменте кода. Как вы можете видеть, когда веб-браузер запрашивает URL-адрес, метод GET возвращает Hello, world! в браузер.
Тем временем вы также можете наблюдать еще два обязательных компонента web.py в вашем коде: методы urls и web.application (). Библиотека web.py требует инициализации местоположения ответа в объявлении переменной urls.
Для каждого веб-приложения на основе web.py требуется, чтобы метод application(urls, global()) вызывался для инициализации веб-сервера. По умолчанию приложения web.py запускаются на порт 8080, который можно изменить на другой номер порта, указав его во время выполнения. Например, если вы хотите запустить приложение web.py на порту 8888, выполните следующую команду:
Хотя это возвращает только простой текст, вы успешно создали свое первое веб-приложение с помощью Python. Мы перейдем отсюда и создадим более сложные веб-приложения в следующих главах, используя библиотеку web.py.
Для разработки этих сложных приложений нам потребуется не только метод GET. Давайте начнем изучение предварительных концепций, чтобы еще больше улучшить ваше знакомство с библиотекой web.py.
Необходимое оборудование
Ниже – полный список компонентов, необходимых для этого проекта:
-
– на eBay – на eBay
- Реле-модуль – на eBay
- Шнур-соединитель для лампы – на eBay
- Макетная плата – на eBay
- Провода-перемычки – на eBay
Скопируйте код, показанный ниже, в IDE Arduino, но перед тем, как загружать его на плату Arduino, прочитайте раздел «Настройка сети», расположенный еще ниже.
Использование контактов
Когда шилд Ethernet подключен к плате Arduino, вы не можете использовать цифровые контакты 10, 11, 12 и 13, потому что они используются для коммуникации между платой и шилдом.
Шаблоны
После того как вы создадите экземпляр папки рендеринга, пришло время создавать файлы шаблонов для вашей программы. В соответствии с требованиями вашей программы вы можете создать столько файлов шаблонов, сколько хотите. Для создания этих файлов шаблонов в web.py используется язык под названием Templetor. Подробнее об этом можно узнать по адресу [5]. Каждый файл шаблона, созданный с использованием Templetor, должен храниться в формате HTML с расширением .html.
Давайте создадим файл test.html в папке templates с помощью текстового редактора и вставим следующий фрагмент кода в файл:
Как вы можете видеть в предыдущем фрагменте кода, файл шаблона начинается с выражения $def with (), где вам нужно указать входные аргументы как переменные в скобках.
После визуализации шаблона они будут единственными переменными, которые вы можете использовать для веб-страницы; Например, в предыдущем фрагменте кода мы передали две переменные (form и i) в качестве входных переменных. Мы использовали объект формы, используя $: form.render (), чтобы отобразить его внутри веб-страницы. Когда вам нужно отобразить объект формы, вы можете напрямую передать другую переменную, просто объявив ее (то есть, $: i). Templetor будет отображать HTML-код файла шаблона, как он есть, при использовании переменных в тех случаях, когда они используются.
Теперь у вас есть файл шаблона test.html, готовый к использованию в вашей программе web.py. Всякий раз, когда выполняется функция GET () или POST (), вам необходимо вернуть значение запрашивающему клиенту. Хотя вы можете вернуть любую переменную для этих запросов, в том числе None, вам придется отобразить файл шаблона, где ответ связан с загрузкой веб-страницы. Вы можете вернуть файл шаблона с помощью функции render (), за которым следует имя файла шаблона и входные аргументы:
Как видно из предыдущей строки кода, мы возвращаем визуализированную страницу test.html, указав функцию render.test (), где test () — это просто имя файла без расширения .html. Функция также включает объект формы, f и переменную i, которые будут переданы в качестве входных аргументов.
Arduino Nano + Ehernet Shield
Питание идет по четырем жилам UTP-кабеля, две жилы +5v и две жилы Gnd.
В этом выключателе я использую Ehernet Shield на основе чипа ENC28J60, это бюджетный и менее распространенный вариант, по сравнению с шилдами на основе w5100.
При его использовании нужно вместо стандартной библиотеки Ethernet подключить arduino_uip
После этого, чтобы скрипты для стандартных модулей заработали, нужно заменить:
Так же надо сделать в используемых библиотеках, если они подключают Ethernet.h
Из 2kB доступной памяти arduino_uip использует 400-600B, это стоит учитывать.
Демонстрация
Эта статья рассказывает, как использовать релейный модуль вместе с платой Arduino. Она начинается с объяснения того, как подключить реле к сетевому напряжению и Arduino. Затем будет представлен проект с лампой, управляемой релейным модулем и датчиком движения типа PIR (вместо лампы можно использовать и другое устройство, управляемое при помощи переменного тока).
Формы
Библиотека web.py предоставляет простые способы создания элементов формы с использованием модуля Form. Этот модуль включает в себя возможность создавать элементы формы HTML, получать входные данные от пользователей и проверять эти входы до их использования в программе Python. В следующем фрагменте кода мы создаем два элемента формы: Textbox и Button, используя библиотеку Form:
Помимо Textbox (который получает ввод текста от пользователей) и Button (который отправляет форму), модуль Form также предоставляет несколько других элементов формы, таких как Password для получения скрытого ввода текста, Dropbox для получения взаимоисключающего выпадающего списка, Radioto получает взаимоисключающие входы из нескольких опций, а Checkbox — выбор бинарного входа из заданных опций. Хотя все эти элементы очень просты в реализации, вы должны выбрать элементы формы только в соответствии с вашими требованиями к программе
В реализации формы через web.py веб-страница должна выполнять метод POST каждый раз, когда форма отправляется. Как вы можете видеть в следующей реализации формы в файле шаблона, мы явно объявляем метод отправки формы как POST:
Описание
Реле – это устройство, предназначенное для замыкания/размыкания электроцепи. Включая и выключая реле, вы можете управлять тем, будет ли проходить через него электроток или нет. Управлять реле при помощи Arduino так же просто, как и светодиодом. То, как выглядит реле, можно посмотреть на картинке ниже:
Этапы решения поставленной задачи
- Проектирование и создание аппаратных средств для использования Arduino и Ethernet Shield.
- Запуск примера по умолчанию из среды разработки Arduino как начальную точку создания сервера.
- Изменение примера для размещения вашего оборудования и повторного развертывания кода.
- Разработка веб-приложений с использованием Python.
Raspberry Pi
Немного странно обновлять Linux на выключателе, это я к тому что использовать Raspberry только для включения света это, конечно, не оптимально. Сейчас, кроме кнопок, к Raspberry подключен только датчик двери(геркон).
Питание
У Raspberry Pi есть контрольные точки для измерения напряжения во время работы. Напряжение между точками должно быть в диапазоне 4.75 — 5.25V. После подключения к линии 5V от БП напряжение было ниже минимума(слишком длинный провод) и пришлось использовать регулятор.
Используется простой линейный регулятор 7805, который я закрепил на радиаторе. До и после регулятора установлены конденсаторы как на схеме.
Чтобы снизить мощность, которая рассеивается на радиаторе регулятора, между ним и БП последовательно подключены три диода her801. Если считать что на каждом диоде падение напряжения составляет 1V, то на входе регулятора получаем примерно 9V. Напряжение на входе должно быть не менее чем на 2,5V выше чем выходное, то есть для 7805 7,5v на входе это минимум.
Чтобы не было ложных срабатываний кнопки
Код для Raspberry Pi написан на Python, смотреть можно в файле light_switch.py3
В завершение первой части расскажу про сервис от создателей OpenHAB, он позволят подключится к OpenHABу находясь за перделами локальной сети. Для меня это удобно так как у мастерской нет отдельного внешнего ip. Подключаться можно как через браузер, так и из мобильных приложений(Android, iOS). Пока проект в закрытой бете, заявку на инвайт можно подать тут.
Вывод
Публикация содержит все необходимые данные для сборки в домашних условиях сетевого приложения для дистанционного контроля температуры влажности и перемещения.
Это руководство рассказывает, как при помощи платы Arduino и шилда Arduino Ethernet создать веб-сервер, управляющий реле, к которому подключена к лампе.
Доступ к веб-серверу можно получить с любого устройства, на котором установлен браузер и которое подключено к той же сети.
СОБЛЮДАЙТЕ ТЕХНИКУ БЕЗОПАСНОСТИ! При работе с проектами, использующими сетевое напряжение, вы должны действительно разбираться в том, что делаете. В противном случае можно получить удар электрическим током. Это очень серьезно, и я не хочу, чтобы работа над этим проектом принесла вред вашему здоровью. Если вы не на 100% уверены в том, что делаете, сделайте себе одолжение и ничего не трогайте. Попросите того, кто знает!
Примечание: Если вам не хочется иметь дело с сетевым напряжением, но вы по-прежнему хотите поработать над проектом, то реле-модуль можно заменить, к примеру, на светодиод. Для этого придется изменить код и схему, но эти изменения будут незначительными.
Где купить?
Реле-модуль можно купить примерно за 2 доллара (см. на eBay).
Arduino Uno
При развертывании аппаратного обеспечения Arduino для удаленного подключения без USB вам необходимо будет обеспечить внешнее питание платы, поскольку у вас больше нет подключения USB для питания платы.
Теперь подключите Arduino Uno к компьютеру с помощью USB-кабеля. Вам также необходимо подключить Arduino к локальной домашней сети с помощью кабеля Ethernet. Для этого используйте прямой кабель CAT5 или CAT6 и подключите один конец кабеля к домашнему маршрутизатору.
Этот маршрутизатор должен быть тем же устройством, которое обеспечивает сетевой доступ к компьютеру, который вы используете. Подключите другой конец кабеля Ethernet к порту Ethernet платы Arduino Ethernet Shield. Если соединение физического уровня установлено правильно, вы должны увидеть зеленый свет на порту.
Теперь пришло время начать кодирование вашего первого примера Ethernet.В коде вам нужно будет изменить MAC и IP-адреса, чтобы он работал для вашей конфигурации. Хотя вы можете получить MAC-адрес Ethernet Shield с задней стороны платы, вам придется выбрать IP-адрес в соответствии с конфигурацией вашей домашней сети.
Когда вы уже получили IP-адрес компьютера, с которым работаете, выберите другой адрес в диапазоне. Убедитесь, что ни один другой сетевой узел не использует этот IP-адрес. Используйте эти MAC и IP-адреса для обновления следующих значений в коде.
В IP-сети видимый диапазон IP-адресов для вашей сети является функцией другого адреса, называемого subnetwork или subnet. Subnet вашей сети LAN IP может помочь вам выбрать соответствующий IP-адрес для Ethernet Shield в диапазоне IP-адресов вашего компьютера. Вы можете узнать об основах подсети по адресу [4].
Прежде чем углубляться в код, скомпилируйте код с этими изменениями и загрузите его в Arduino. После успешного завершения процесса загрузки откройте веб-браузер и введите IP-адрес, указанный в скетче Arduino. Если все будет хорошо, вы должны увидеть текст, отображающий значения аналоговых контактов.
Чтобы лучше понять, что здесь произошло, вернемся к коду. Как вы можете видеть, в начале кода мы инициализируем библиотеку Ethernet-сервера на порту 80, используя метод EthernetServer из библиотеки Ethernet:
Во время выполнения setup () программа инициализирует Ethernet-соединение через Ethernet Shield с помощью метода Ethernet.being () с переменными mac и ip, которые вы определили ранее. Метод server.begin () запустит сервер отсюда. Оба этих шага являются обязательными для запуска сервера, если вы используете библиотеку Ethernet для кода сервера:
В функции loop () мы инициализируем client объект для прослушивания входящих клиентских запросов с использованием метода EthernetClient. Этот объект будет отвечать на любой запрос, поступающий от подключенных клиентов, которые пытаются получить доступ к серверу Ethernet через порт 80:
После получения запроса программа будет ожидать окончания загрузки запроса. Затем он будет отвечать клиенту с форматированными данными HTML, используя метод:
Если вы попытаетесь получить доступ к серверу Arduino из браузера, вы увидите, что веб-сервер отвечает клиентам с помощью данных на аналоговых контактах. Теперь, чтобы получить правильные значения датчиков влажности и PIR, которые мы соединили в аппаратном дизайне, вам придется выполнить следующую модификацию кода.
Здесь вы заметите, что мы отвечаем клиентам с вычисленными значениями относительной влажности вместо необработанных показаний со всех аналоговых выводов. Мы также изменили текст, который будет напечатан в веб-браузере, чтобы соответствовать правильному названию датчика:
В этом процессе мы также добавили функцию Arduino, getHumidity (), которая будет вычислять относительную влажность по значениям, наблюдаемым с аналоговых выводов.
Эти изменения можно применить к примеру, WebServer Arduino для фазы тестирования или просто открыть скетч WebServer_Custom.ino из папки Exercise 1 — Web Server в каталоге вашего кода. Как вы можете видеть в открытом файле скетча, мы уже модифицировали код, чтобы отразить изменения, но вам все равно придется изменить MAC и IP-адреса на соответствующие адреса.
После того как вы закончите с этими незначительными изменениями, скомпилируйте и загрузите скетч в Arduino. Если все пойдет по плану, вы должны иметь доступ к веб-серверу с помощью веб-браузера. Откройте IP-адрес недавно подготовленного Arduino в веб-браузере.
Вы должны получить такой же ответ, как показано на следующем скриншоте. Хотя мы показываем значения влажности только через этот скетч, вы можете легко прикрепить значения датчика движения, используя дополнительные методы client.print ().
Подобно механизму, который мы реализовали в этом упражнении, веб-сервер отвечает на запрос, сделанный веб-браузером, и предоставляет веб-страницы, которые вы ищете. Хотя этот метод очень популярен и универсален для доставки веб-страниц, полезная нагрузка содержит много дополнительных метаданных (данные о данных) по сравнению с фактическим размером информации датчика.
Кроме того, реализация сервера с использованием библиотеки серверов Ethernet занимает много ресурсов Arduino. Arduino, будучи устройством с ограниченными ресурсами, не подходит для запуска серверного приложения, поскольку ресурсы Arduino должны быть приоритетными для обработки датчиков, а не связи.
Веб-сервер, созданный с использованием библиотеки Ethernet, поддерживает очень ограниченное количество подключений, что делает его непригодным для крупномасштабных приложений и многопользовательских систем.
Лучшим подходом к решению этой проблемы является использование Arduino в качестве клиентского устройства или использование легких коммуникационных протоколов, предназначенных для работы с аппаратными устройствами с ограниченными ресурсами. В следующих нескольких разделах вы узнаете и реализуете эти подходы для коммуникации Arduino на Ethernet.
Подключение Ethernet Shield поверх Arduino Uno
Arduino Ethernet Shield — официально поддерживаемое сетевое расширение с открытым исходным кодом, предназначенное для работы с Arduino Uno. Ethernet Shield оснащен разъемом RJ45 для подключения к сети Ethernet. Ethernet Shield предназначен для установки на Arduino Uno, и он расширяет выводы(пины) от Arduino Uno в верхней части платы. Ethernet Shield также оснащен гнездом для карт памяти microSD для хранения важных файлов по сети. Как и большинство расширений, Ethernet Shield питается от платы Arduino, к которой он присоединен.
Каждая плата Ethernet Shield оснащена уникальным аппаратным (MAC) адресом. Вы можете видеть это на обратной стороне платы. Вы можете записать этот аппаратный адрес, поскольку он будет часто требоваться в предстоящих упражнениях. Также убедитесь, что вы знакомы с установкой Arduino Ethernet Shield для выполнения последующих упражнений.
Ниже приведена диаграмма Fritzing схемы, требуемой для этого упражнения. Первое, что вам нужно сделать, это подключить Ethernet Shield поверх вашего Arduino Uno.
Постановка задачи
- Использовать библиотеку Arduino Ethernet с расширением Arduino Ethernet Shield для создания веб-сервера.
- Создать удаленный доступ к Arduino с использованием сети вашего домашнего компьютера.
- Использовать стандартный пример Arduino для обеспечения значений влажности и датчика движения с помощью веб-сервера.
- Разработать веб-приложений с использованием Python.
Подключение к сетевому питанию
У реле есть три контакта, предназначенных для подключения к сетевому питанию:
- COM (от «common») – это общий контакт.
- NO (от «normally open») – это нормально разомкнутый контакт. Общий контакт и нормально разомкнутый контакт между собой не соединены. Но когда вы включаете реле, эти контакты соединяются друг с другом, и потребитель начинает получать питание.
- NC (от «normally closed») – это нормально замкнутый контакт. Общий контакт и нормально замкнутый контакт соединены друг с другом, даже если реле выключено. Но когда вы включаете реле, цепь размыкается, и потребитель перестает получать питание.
Если вы хотите управлять, к примеру, лампой, то лучше использовать нормально разомкнутый контакт, потому что лампа не будет гореть всегда (но вы будете включать ее время от времени).
Установка web.py
Чтобы начать работу с web.py, вам нужно установить библиотеку web.py с помощью Setuptools. В Linux и Mac OS X выполните одну из этих команд на терминале, чтобы установить web.py:
В Windows откройте командную строку и выполните следующую команду:
Для pythn 3.61 надо набрать в командной строке:
Если Setuptools настроен правильно, вы можете установить библиотеку без каких-либо трудностей. Чтобы проверить установку библиотеки, откройте интерактивную подсказку Python и запустите эту команду, чтобы убедиться, что вы импортировали библиотеку без каких-либо ошибок:
Демонстрация
Около года назад я написал небольшую обзорную статью для управления Arduino через интернет, с помощью сервера NinjaBlocks. Это было довольно хорошее и удобное решение и оно отлично работало, пока в один прекрасный момент не начались проблемы с соединением. Попытки уговорить разработчиков через форум решить проблемы были напрасны — они просто игнорировали мои просьбы и не удосужились даже ответить, что было очень печально.
1. Как это всё работает.
У нас имеется:
— сервер на php расположенный на хостинге который привязанный к доменному имени
— клиент в виде arduino
— панель управления
Arduino подключается к серверу и отправляет GET запрос, где содержатся значения датчиков температуры.
Сервер принимает запрос, и записывает значения температур в текстовые файлы. При этом читает из текстового файла значение установленного выхода для arduino и отправляет в ответ на запрос контроллера.
Arduino принимает ответ от сервера и согласно ему устанавливает состояние своего выхода
Панель управления, используя Ajax, считывает значение температуры из текстовых файлов и обновляет показания датчиков. А также считывает их текстового файла состояние выхода и обновляет его на странице. С помощью того же Ajax через форму в текстовый файл записывается значение выхода контроллера, откуда потом будет брать значение сервер и отправлять контроллеру.
2. Клиент на Arduino
Скетч довольно простой, всё что он делает — это собирает значение датчиков и отправляет их на сервер, получает ответ, включает или отключает выход.
EthernetClient client;
char server[] = "*************"; // имя вашего сервера
int buff=0;
const int led=5;
void setup()
Ethernet.begin(mac);
sensors.begin();
pinMode( led, OUTPUT);
digitalWrite(led, LOW);
>
if (client.connect(server, 80))
client.print( «GET /add_data.php?»);
client.print(«temperature=»);
client.print( sensors.getTempCByIndex(0) );
client.print("&");
client.print("&");
client.print(«temperature1=»);
client.print( sensors.getTempCByIndex(1) );
client.println( " HTTP/1.1");
client.print( «Host: » );
client.println(server);
client.println( «Connection: close» );
client.println();
client.println();
while (client.available())
char c = client.read();
if ( c=='1')
buff=1;
>
if ( c=='0')
buff=0;
>
>
client.stop();
client.flush();
delay(100);
>
else
client.stop();
delay(1000);
client.connect(server, 80);
>
if ( buff==1)
digitalWrite (led, HIGH);
>
else
digitalWrite(led, LOW);
>
delay(500);
>
3. Сервер и панель управления
Сервер состоит всего из нескольких файлов:
index.php — панель управления
add_data.php — файл обрабатывающий запросы с контроллера и отсылающий ответ обратно на arduino
style.css — определяет внешний вид панели
Папка transfer — содержит файлы, с помощью которых происходит считывание и запись значений из текстовых файлов.
led.php — записывает состояние выхода в файл out-1.txt, отправленное через форму в панели управления
ledstate.php — считывает состояние из текстового файла out-1.txt и выводит на панели в виде «ON» или «OFF»
temp-1.php и temp-2.php — считывают значения температуры из файлов in-1.txt и in-2.txt и отправляют на панель управления.
Папка txt — своего рода база данных для хранения информации.
Сервер на самом деле очень простой и его сможет установить себе любой человек с минимальными познаниями, например, как я. До работы над этим проектом у меня был опыт работы только с arduino, поэтому php, ajax, html и css пришлось изучать буквально с нуля.
Установка очень простая. Просто скопируйте файлы на сервер и загрузите скетч в контроллер, при этом в скетче подправьте доменное имя, подключите датчики и светодиод, и у вас все должно работать.
Уверен, что матерые программисты будут пинать меня и тыкать носом в те места где можно было бы написать код более лаконично и правильно. Я это только приветствую.
Если вы увидели, что некоторые вещи можно сделать проще и быстрее, то сообщите мне.
Что в итоге мы имеем?
— все просто и понятно
— можно настроить под свои нужды и задачи
— хорошая стабильность
— сервер можно развернуть на любом бесплатном хостинге
— большое количество запросов на сервер ( некоторым хостерам это может не понравиться, в этом случае нужно увеличить паузу между запросами в скетче)
— кушает много трафика со стороны клиента ( при 1 запросе в секунду выходит около 300 Мб в сутки)
— существует небольшая задержка на включение выходов ( может быть критично для некоторых случаев)
Планы на будущее:
— добавить кнопку на контролере для включения и выключения реле с изменением состояния на сервер
— добавить авторизацию
— добавить идентификационные ключи в запросах
— организовать работу нескольких плат одновременно с одной панелью управления
— добавить подтверждения от контроллера о включении выхода
— очень хотелось бы использовать протоколы websockets или mqtt, но всё же склоняюсь к использованию websockets c использованием socket.io
Возможно, если будет интересно, напишу статью об управлении через интернет wifi модулем esp8266. Его я уже успел успешно опробовать и убедился, что все работает, правда, там есть свои нюансы в работе.
А если наберется достаточное количество желающих напишу, будет подробная статья, где мы рассмотрим добавление новых блоков с датчиками и управлением дополнительными выходами в панель управления.
Прошу дать совет как лучше реализовать авторизацию в панели управления, чтобы была относительно простая и понятная установка и приемлемый уровень безопасности.
Смотрим видео
Всем спасибо за внимание!
UPD. Добавил обратную связь в панель в виде фоторезистора. Когда лампочка выключена, показания около 130, когда включена — 900.
Моя прошлая статья была о выборе ламп освещения для жилой мастерской. В этот раз расскажу про реализацию домашней автоматизации в том же помещении. Мастерская отапливается двумя электрическими обогревателями. Хотелось удаленно их включать, чтобы не приезжать в холодное помещение. И еще хотелось поддерживать заданную температуру, до этого при изменении температуры на улице приходилось каждый раз крутить «термостаты» обогревателей. Ну и управление освещением, датчик открытия двери и т.д.
Часть 2
Управление обогревателями
Термодатчики
Хранение данных
Графики
Удаленное управление
Впечатления от OpenHAB
Persistence
Интерфейсы
Мониторинг
Хардвер я использовал вполне стандартный, местами не оптимальный, про него особенно интересны замечания и рекомендации.
Выбор софта частично сделан с целью попробовать незнакомые инструменты, к примеру, таким образом для хранения данных вабрана InfluxDB
После беглого поиска open-source решений для домашней автоматизации был выбран OpenHAB, довольно зрелый инструмент с модульной архитектурой, кроме того, он активно развивается. Про него уже есть статья на хабре, рекомендую ее посмотреть тем кто захочет использовать OpenHAB.
Еще можно взглянуть на демо-интерфейс.
Я опишу хардверную часть моего решения и попутно приведу выдержки из конфигурации OpenHAB.
- Items — что-то вроде глобально доступного объекта, обычно представляет внешнее устройство или источник данных. Могут быть разных типов, например Switch для выключателя, Dimmer для диммера. Есть также String и Number, это Items которые содержат строку и число.
- Sitemaps — описывают интерфейс. Фактически это перечисление Items с добавлением настроек отображения.
- Rules — скрипты, которые выполняются по расписанию или по событию. События наступают при изменении состояния Items, например, когда выключатель Light_1 получил значение ON.
- Persistence — файлы, в которых описываются правила сохранения состояния Items в разные БД.
- Bindings — подключаемые модули, наверное можно назвать плагинами. Используются чтобы добавить в OpenHAB возможность взаимодействовать с разным хардом и софтом. Например binding для KNX или для MySQL и т.д.
Конфигурация OpenHAB, скрипты для выключателей и т.д. доступны в репозитории homeAutomationExample
Техника безопасности
Перед тем, как приступить к проекту, обязательно ознакомьтесь с техникой безопасности, потому что в этом проекте придется иметь дело с сетевым напряжением.
Внимание! Работая над проектами, где используется сетевое напряжение, вы должны хорошо понимать, что делаете, т.к. при неосторожности можно получить удар электрическим током. Это очень серьезно, и я не хочу, чтобы вы пострадали. Если вы не на 100% уверены в том, что делаете, ничего не трогайте. Попросите помочь того, кто хорошо в этом разбирается.
Подключение контактов
В подключении реле к Arduino нет ничего сложного:
- Контакт GND на реле – к контакту GND на плате Arduino
- Контакт IN1 (управляет первым реле) – к цифровому контакту
- Контакт IN2 (управляет вторым реле) – тоже к цифровому контакту; но подключайте его, только если действительно используете второе реле
- Контакт VCC – к контакту 5V
Методы GET и POST
Мы создали веб-сервер на основе Arduino, работающий через порт 80, мы использовали веб-браузер для доступа к веб-серверу. Веб-браузеры являются одним из самых популярных типов веб-клиентов, используемых для доступа к веб-серверу; Другие типы c URL, Wget и веб-сканеры.
В разделе «Обработка URL-адресов» мы узнали, как связать классы web.py с местами размещения URL-адресов. Используя метод GET, предоставляемый библиотекой web.py, вы можете связать запрос GET с отдельными классами. После того как вы получили запрос GET, вам необходимо вернуть соответствующие значения в качестве ответа клиенту. Следующий фрагмент кода показывает, как будет вызываться функция GET (), когда кто-либо делает запрос GET в местоположение «/»:
Необходимые компоненты
Для этого проекта понадобятся следующие компоненты:
- Реле-модуль (см. на eBay) (см. наeBay)
- Датчик движения PIR (см. на eBay)
- Шнур-соединитель для лампы (см. на eBay)
Скопируйте код, показанный ниже, в IDE Arduino, а затем загрузите его на плату Arduino.
Внимание! Не загружайте код, когда Arduino подключена к реле.
Выключатели
Я сделал два выключателя, у каждого четыре кнопки и один стандартный выключатель. (Чтобы в предыдущем предложении не возникло рекурсии, выключатель написан курсивом и означает весь модуль с кнопками, в отличии от выключателя — обычного выключателя.)
Сначала были сделаны только кнопки, но оказалось, что нащупывать их в темноте неудобно и я добавил обычный выключатель. Три кнопки и обычный выключатель управляют светом, а одна кнопка используется для информирования о температуре внутри и снаружи(с помошью генератора речи).
Настройка сети
Обратите внимание на фрагмент в коде выше, где находятся данные для подключения к сети:
Важно: Возможно, понадобится заменить переменную XXX в конце этого кода на значение, соответствующее вашей сети. В противном случае Arduino не сможет установить соединение с сетью.
Кроме того, возможно, придется заменить все значения в строчке для IP-адреса:
В моем случае IP-адрес был в диапазоне «192.168.1.X», и при помощи программы Angry IP Scanner я узнал, что в моей сети доступен IP-адрес «192.168.1.111». То есть в моей сети не было активных устройств, использующих тот же самый адрес.
Обработка URL-адресов
Вы могли заметить, что в нашей первой программе web.py мы определили переменную urls, которая указывает на корневую папку (/) of the Index class:
В предыдущем объявлении первая часть, '/', является обычным выражением, используемым для сопоставления фактических запросов URL. Вы можете использовать такие выражения для обработки сложных запросов, поступающих на ваш сервер web.py, и указывать их на соответствующий класс.
Постановка задачи
- Использовать библиотеку Arduino Ethernet с расширением Arduino Ethernet Shield для создания веб-сервера.
- Создать удаленный доступ к Arduino с использованием сети вашего домашнего компьютера.
- Использовать стандартный пример Arduino для обеспечения значений влажности и датчика движения с помощью веб-сервера.
- Разработать веб-приложений с использованием Python.
Общее описание
Компоненты системы:
- Сервер (OpenHAB, InfluxDB, . )
- Модуль управления реле Arduino MEGA + Ehernet Shield
- Выключатель пять кнопок Arduino Nano + Ehernet Shield
- Выключатель пять кнопок Raspberry Pi
Нагрузка управляется с помощью реле, сейчас их семь штук. От каждого реле идет отдельная жила кабеля, то есть для трех управляемых розеток используется 4-х жильный кабель(три для фазы и одна жила для ноля).
- 3 розетки, к двум из них подключены обогреватели (220v)
- 2 линии дневного освещения (220v)
- 1 вечерний свет, лампа накаливания (12v)
- 1 диодная лента (12v)
Все потребители постоянного тока подключены к одному компьютерному блоку питания.
Так можно избежать кратковременного включения реле при включении Arduino.
У всех реле, кроме одного, используется нормально-разомкнутый контакт(NO, Normally Open), чтобы по умолчанию вся нагрузка была выключена, например после временного отключения электричества. Исключение сделано для диодной ленты — она подключена к нормально-замкнутому контакту, для аварийного освещения.
В целом Arduino + Ehernet Shield работают без проблем, перебои были только когда я включил их мониторинг из OpenHAB. Есть предположение что OpenHAB открывал keepalive соединение и из-за этого другие соединения не устанавливалсь.
А еще есть неприятный момент в работе Ethernet Shield:
ПРОБЛЕМА:
Ehernet Shield не работает после включения питания Arduino, а только после ресета. Как я понял, это проблема первой версии шилда на чипе w5100. Вот возможный вариант решения.
Исходники API для Arduino в репозитории minimalArduinoWebApi.
Вот пример запроса состояния пина 40, к которому подключено реле управляющее одной из ламп:
Текст ответа будет ON или OFF.
Например, вот описание пина 40 из файла main.items:
Тут определяется Switch с именем Light_1, входящий в группы Lights и DayLights:
(Группы в OpenHAB удобно использовать, например, чтобы выключить весь свет или взять среднее с температурных датчиков.)
(Переносы строк добавлены для удобства чтения, в таком виде работать не будет.)
то OpenHAB отправит запрос PUT 192.168.2.15/pins/40/ON.
Кроме консоли управлять Light_1 можно через REST API самого OpenHAB.
Чтобы переключатель Light_1 появился в веб-интерфейсе OpenHAB, его нужно добавить в Sitemap, например так:
Основные концепции web.py для разработки сложных веб-приложений
Библиотека web.py была разработана для обеспечения удобных и простых методов разработки динамических веб-сайтов и веб-приложений с использованием Python. Используя web.py, очень просто создавать сложные веб-сайты, используя лишь несколько дополнительных концепций Python.
Благодаря этому ограниченному курсу обучения и простым в использовании методам, web.py является одним из самых быстрых способов создания веб-приложений из языков программирования. Давайте начнем с понимания этих понятий web.py в деталях.
Читайте также: