Подключение ардуино к интернету

Подключение ардуино к интернету

Предисловие

Здравствуй уважаемый читатель, если ты набрел на эту статью, то скорее всего тебя интересует вопрос организации связи устройства на базе Ардуино со Всемирной сетью. В данной статье подробно рассматриваются вопросы настройки устройства на базе Ардуино в качестве клиента и сервера, генерирование HTML-страницы, основные способы обработки POST и GET запросов средствами Ардуино и многое другое.

Доступ к Интернету – очень сложная тема, можно написать целые тома книг о лучшем способе подключения Ардуино к Интернету. В этой статье мы рассмотрим использование платы расширения Arduino Ethernet Shield для создания веб-страницы и отправки данных в Сеть. Объяснить в одной статье, как работает Всемирная паутина, – слишком амбициозная затея, поэтому я ограничусь лишь описанием технологий, с которыми вам в процессе работы придется сталкиваться.

Введение

С долей иронии вспоминаю свои первые попытки поднять сервер на Ардуино, изнурительное блуждание по Всемирной паутине с целью найти пример обработки GET и POST данных, к сожалению, на тот момент до многих вещей приходилось доходить методом проб и ошибок. Данная статья должна избавить вас от типичных ошибок, с которыми сталкиваются разработчики при работе в сети с помощью Aрдуино. Статья рассчитана в первую очередь на новичков, однако и бывалые разработчики найдут в ней много интересного.

Все листинги программ, приведенные в данной статье, написаны для Arduino UNO R3 и Ethernet Shield 2.

Пользователи, которые имели дело с Ардуино уно, знают, что сама по себе плата работать с сетью не может, так как на ней попросту отсутствуют аппаратные для этого средства, однако, благодаря модульной структуре платформы, мы можем использовать дополнительные платы расширения возможностей. Одной из таких плат является Ethenet Shield 2, позволяющая выступать Ардуино в виде полноценного сетевого устройства: общаться с аналогичными устройствами, с персональными компьютерами, принтерами и тд. Как сказано в даташите, плата построена на чипе Wiznet W5500 и поддерживает протоколы TCP/UDP и до восьми открытых соединений. Забегая вперед, скажу, если в вашем проекте планируется, что устройство должно обрабатывать запросы от нескольких хостов одновременно, то можете сразу забыть про Ардуино. Для этого данная платформа никак не подходит, и лучшим вариантом будет использовать платформу, специально созданную для этих целей и имеющую достаточно ресурсов.

Для работы с данной платой никаких сторонних библиотек устанавливать не нужно, т.к. необходимая библиотека уже содержится в ArduinoIDE. Данная библиотека позволяет использовать Ардуино как в качестве клиента, так и в качестве сервера.

Отходя от темы Ардуино, скажу, что в большинстве случаев одни устройства в сети выступают в качестве клиентов, другие – в качестве серверов, иные варианты нас попросту не интересуют. Взаимодействие между сервером и клиентом осуществляется с помощью HTTP-запросов. Клиентское приложение формирует запрос и отправляет его на сервер, после чего серверное программное обеспечение обрабатывает данный запрос, формирует ответ и передаёт его обратно клиенту. После этого клиентское приложение может продолжить отправлять другие запросы, которые будут обработаны аналогичным образом.

Рассмотрим такой пример, в один из прекрасных дней вам захотелось почитать что-нибудь интересное на сайте хабр. Для этого вы открываете браузер и набираете в адресной строке habrahabr.ru. После чего ваш браузер посылает запрос на то, чтобы сервер сайта Хабрахабр предоставил вам HTML-страницу. Сразу хочу заметить, что сам по себе сервер никому и никогда ничто не отправит, его для этого должен попросить клиент (браузер). Самый простой запрос, который можно будет отправить, будет иметь следующий вид:

И примерно такой мы получим ответ, когда сервер обработает наш запрос:

На данном этапе я не буду пояснять значение всех этих строк в запросе и ответе, о них мы поговорим позднее. Вы лишь должны понять, что для того, чтобы Арудино могло общаться с различными сетевыми устройствами, нам нужно будет посылать такие же запросы, и обрабатывать похожие ответы, и так как ресурсы Ардуино весьма ограниченные, то мы будем учиться правильно парсить ответ, не учитывая при этом все лишние для нас данные.

Ардуино в режиме клиента

В режиме клиента Ардуино организует соединение с удаленным сервером, на который с заданной периодичностью посылаются пакеты с данными. Данные можно отправлять как со стороны компьютера, подключенного к Ардуино, так и со стороны микроконтроллера.

Как было сказано ранее, библиотека Ethernet позволяет использовать Арудино в качестве клиента, для этого в ней есть специальный класс Client, который дает нам доступ к нескольким функциям, а именно:

Прежде чем приступить к непосредственному программированию, хотелось бы пару слов сказать об IP-адресах. Определение «IP – маршрутизируемый протокол сетевого уровня стека …», на мой взгляд, довольно трудное для восприятия человеку, не имеющего опыта работы с ним. Проводя аналогию, можно сказать, что IP – это своеобразный адрес в сети, такой же как почтовый индекс или телефонный номер. Как мы с вами знаем, одинаковых почтовых индексов и телефонных номеров не существует, это же распространяется и на IP-адреса. Сетевые адреса имеют все устройства, подключенные к сети. Как и за телефонные номера (ресурс нумерации), за IP-адреса тоже приходится платить (прим. В большинстве случаев нам предоставляется временный IP-адрес, плата за который не взимается).

Если вы используете домашний роутер, то с большой вероятностью, диапазон ваших IP-адресов равен 192.168.0.N, где N может быть от 1 до 254. Помимо этого, стоит знать также маску подсети, чтобы точно можно было определить, находится рассматриваемый нами IP-адрес в данной сети или нет. Понимаю, что довольно трудно понять суть вещей, о которых не имеешь представления. По большей части нам эти знания и не понадобятся, а тем, кто желает узнать больше об IP и сабнетинге, стоит почитать пару статей на хабре.

Узнать сетевые параметры вы можете через командную строку, введя в нее команду ipconfig. Все эти данные нужны для того, чтобы выбрать свободный ip-адрес для Arduino. Мой вам совет, задайте IP-адрес Ардуино в диапазоне от 192.168.0.100-192.168.0.200, при маске подсети 255.255.255.0. Сильно не пугайтесь выше изложенной информации, так как на практике я еще ни разу не сталкивался с тем, чтобы в домашней сети какие-либо устройства не могли поделить между собой IP-адрес.

Теперь, когда мы разобрались, что такое IP-адрес, переходим непосредственно программированию. В данном разделе мы создадим простой HTTP-запрос и отправим его на сервер сайта www.timeapi.org (онлайн время) с целью получить точное время по Гринвичу. Полученный ответ мы выведем через serial-порт на экран нашего компьютера.

Загрузим в память Ардуино следующий скетч:

Открыв функцию мониторинга порта, мы увидим, что сервер прислал нам следующий ответ:

Как мы видим, ответ содержит множество параметров (заголовков), однако интересовать нас будет лишь первая строка, и то, что содержится после двух переносов строк, (прим. Два переноса используются для разграничения заголовков и тела ответа, заголовок Content-Length показывает размер тела ответа в байтах) по существу это и есть те данные, ради которых мы отправляли запрос серверу.

В первой строке HTTP/1.1 говорит нам о том, что используется протокол HTTP версии 1.1, второй элемент – 200 OK – это код состояния запроса, в нашем случае он означает, что запрос прошел успешно. Самые распространенные ответы, помимо 200 OK, – это 404 (не найдено) и 400 («плохой» или неправильный запрос).

Теперь вернемся к скетчу и разберем все более подробно. Первое что мы делаем, это подключаем необходимы библиотеки, а именно Ethernet.h и SPI.h (Ардуино уно взаимодействует с платой расширения по шине SPI, объединяющей в себе выводы 11, 12 и 13). Далее мы задаем MAC и IP-адреса, а также указываем IP-адрес или доменное имя ресурса, к серверу которого мы будем посылать запрос.

Читайте также:  Соковыжималка скарлетт не включается причины

В методе setup функцией Ethernet.begin(mac, ip) мы запускаем нашу плату, и проверяем, если соединение с сервером установлено, то отправляем наш запрос. Не забываем прописывать пустую строку после запроса.

В методе loop мы функцией client.available() проверяем количество непрочитанных байт (т.е. количество байт, принятых клиентом от удаленного сервера, с которым установлено соединение), и если таковые имеются, то записываем их в переменную c.

Как только мы считаем последний байт, соединение будет считаться потерянным (прерванным). Следует обратить внимание на то, что клиент считается подключённым, если подключение уже закрыто, но остались несчитанные данные.

Напоследок хочется добавить, что режим клиента для Ардуино наиболее подходящий, так как он позволяет отправлять данные с различных датчиков на сервер, обрабатывать его ответ и при этом задействовать минимальное количество ресурсов платы.

Ардуино в режиме сервера

В данном режиме Ардуино создает сервер, ожидающий входящие соединения через указанный порт, чаще всего это 80 порт. В предыдущем разделе мы отправляли запрос удаленному серверу, чтобы он предоставил нам html-страницу. В этом разделе мы рассмотрим данный пример уже с другой стороны, в качестве клиента будет выступать наш ПК, а в качестве сервера Ардуино. Мы отправим запрос к Арудино, и после того, как он его обработает, сгенерирует для нас HTML-страницу.

Класс Server библиотеки Ethernet.h предоставляет нам доступ к следующим функциям:

Прежде чем переходить к непосредственному программированию, я расскажу вам о структуре HTML-страницы. Сам по себе HTML является стандартным языком разметки документов во Всемирной паутине. Для веб-разработчиков правилом хорошего тона является разграничение кода и оформления, т.е. чтобы код HTML был свободен от элементов оформления вроде установки цвета, размера шрифта и других параметров. В идеале, веб-страница должна содержать только теги логического форматирования, а вид элементов задаётся через стили. Другими словами, это означает, что язык программирования отвечает за все вычисления, HTML за то, что должно находиться на странице, а CSS как это содержимое (контент) должно выглядеть.

Чем больше тегов и селекторов мы будем использовать в HTML и CSS соответственно, тем больше ресурсов будет затрачено платой на генерацию страницы, особенно сильно это отразится на оперативной памяти, так как все строковые значения хранятся в ней. В связи с чем, использование CSS в составе скетча Ардуино практически невозможно. В своих проектах я загружал CSS-стили с удаленного сервера, предварительно подключив их в шапке страницы.

Если открыть любую веб-страницу, то она будет содержать в себе типичные элементы, которые не меняются от вида и направленности сайта. Ниже представлен HTML-код простой страницы, содержащей в себе основные тэги.

Теперь давайте подробно разберем каждую строку нашего HTML кода. Элемент предназначен для указания типа текущего документа – DTD (document type definition, описание типа документа). Это необходимо, чтобы браузер понимал, как следует интерпретировать текущую веб-страницу, ведь HTML существует в нескольких версиях, кроме того, имеется XHTML (EXtensible Hyper Text Markup Language, расширенный язык разметки гипертекста), похожий на HTML, но различающийся с ним по синтаксису. Чтобы браузер «не путался» и понимал, согласно какому стандарту отображать веб-страницу и необходимо в первой строке кода задавать . Существует несколько видов , они различаются в зависимости от версии HTML, на которую ориентированы. В нашем случае мы использовали HTML версии 5, самая актуальная версия на момент написания статьи.

Тег определяет начало HTML-файла, внутри него хранится заголовок ( ) и тело документа ( ).Заголовок документа, как еще называют блок , может содержать текст и теги, но содержимое этого раздела не показывается напрямую на странице, за исключением контейнера .Тег является универсальным и добавляет целый класс возможностей, в частности, с помощью метатегов, как обобщенно называют этот тег, можно изменять кодировку страницы, добавлять ключевые слова, описание документа и многое другое. Тег определяет заголовок веб-страницы. В операционной системе Windows текст заголовка отображается в левом верхнем углу окна браузера. Обязательно следует добавлять закрывающий тег , чтобы показать, что блок заголовка документа завершен.Тело документа предназначено для размещения тегов и содержательной части веб-страницы.Тег

определяет абзац (параграф) текста. Если закрывающего тега нет, считается, что конец абзаца совпадает с началом следующего блочного элемента.Тег

является блочным элементом, поэтому текст всегда начинается с новой строки, абзацы идущие друг за другом разделяются между собой отбивкой (так называется пустое пространство между ними). Следует добавить закрывающий тег

Предисловие

Здравствуй уважаемый читатель, если ты набрел на эту статью, то скорее всего тебя интересует вопрос организации связи устройства на базе Ардуино со Всемирной сетью. В данной статье подробно рассматриваются вопросы настройки устройства на базе Ардуино в качестве клиента и сервера, генерирование HTML-страницы, основные способы обработки POST и GET запросов средствами Ардуино и многое другое.

Доступ к Интернету – очень сложная тема, можно написать целые тома книг о лучшем способе подключения Ардуино к Интернету. В этой статье мы рассмотрим использование платы расширения Arduino Ethernet Shield для создания веб-страницы и отправки данных в Сеть. Объяснить в одной статье, как работает Всемирная паутина, – слишком амбициозная затея, поэтому я ограничусь лишь описанием технологий, с которыми вам в процессе работы придется сталкиваться.

Введение

С долей иронии вспоминаю свои первые попытки поднять сервер на Ардуино, изнурительное блуждание по Всемирной паутине с целью найти пример обработки GET и POST данных, к сожалению, на тот момент до многих вещей приходилось доходить методом проб и ошибок. Данная статья должна избавить вас от типичных ошибок, с которыми сталкиваются разработчики при работе в сети с помощью Aрдуино. Статья рассчитана в первую очередь на новичков, однако и бывалые разработчики найдут в ней много интересного.

Все листинги программ, приведенные в данной статье, написаны для Arduino UNO R3 и Ethernet Shield 2.

Пользователи, которые имели дело с Ардуино уно, знают, что сама по себе плата работать с сетью не может, так как на ней попросту отсутствуют аппаратные для этого средства, однако, благодаря модульной структуре платформы, мы можем использовать дополнительные платы расширения возможностей. Одной из таких плат является Ethenet Shield 2, позволяющая выступать Ардуино в виде полноценного сетевого устройства: общаться с аналогичными устройствами, с персональными компьютерами, принтерами и тд. Как сказано в даташите, плата построена на чипе Wiznet W5500 и поддерживает протоколы TCP/UDP и до восьми открытых соединений. Забегая вперед, скажу, если в вашем проекте планируется, что устройство должно обрабатывать запросы от нескольких хостов одновременно, то можете сразу забыть про Ардуино. Для этого данная платформа никак не подходит, и лучшим вариантом будет использовать платформу, специально созданную для этих целей и имеющую достаточно ресурсов.

Для работы с данной платой никаких сторонних библиотек устанавливать не нужно, т.к. необходимая библиотека уже содержится в ArduinoIDE. Данная библиотека позволяет использовать Ардуино как в качестве клиента, так и в качестве сервера.

Отходя от темы Ардуино, скажу, что в большинстве случаев одни устройства в сети выступают в качестве клиентов, другие – в качестве серверов, иные варианты нас попросту не интересуют. Взаимодействие между сервером и клиентом осуществляется с помощью HTTP-запросов. Клиентское приложение формирует запрос и отправляет его на сервер, после чего серверное программное обеспечение обрабатывает данный запрос, формирует ответ и передаёт его обратно клиенту. После этого клиентское приложение может продолжить отправлять другие запросы, которые будут обработаны аналогичным образом.

Рассмотрим такой пример, в один из прекрасных дней вам захотелось почитать что-нибудь интересное на сайте хабр. Для этого вы открываете браузер и набираете в адресной строке habrahabr.ru. После чего ваш браузер посылает запрос на то, чтобы сервер сайта Хабрахабр предоставил вам HTML-страницу. Сразу хочу заметить, что сам по себе сервер никому и никогда ничто не отправит, его для этого должен попросить клиент (браузер). Самый простой запрос, который можно будет отправить, будет иметь следующий вид:

Читайте также:  Какие жесткие диски стоят в ноутбуках

И примерно такой мы получим ответ, когда сервер обработает наш запрос:

На данном этапе я не буду пояснять значение всех этих строк в запросе и ответе, о них мы поговорим позднее. Вы лишь должны понять, что для того, чтобы Арудино могло общаться с различными сетевыми устройствами, нам нужно будет посылать такие же запросы, и обрабатывать похожие ответы, и так как ресурсы Ардуино весьма ограниченные, то мы будем учиться правильно парсить ответ, не учитывая при этом все лишние для нас данные.

Ардуино в режиме клиента

В режиме клиента Ардуино организует соединение с удаленным сервером, на который с заданной периодичностью посылаются пакеты с данными. Данные можно отправлять как со стороны компьютера, подключенного к Ардуино, так и со стороны микроконтроллера.

Как было сказано ранее, библиотека Ethernet позволяет использовать Арудино в качестве клиента, для этого в ней есть специальный класс Client, который дает нам доступ к нескольким функциям, а именно:

Прежде чем приступить к непосредственному программированию, хотелось бы пару слов сказать об IP-адресах. Определение «IP – маршрутизируемый протокол сетевого уровня стека …», на мой взгляд, довольно трудное для восприятия человеку, не имеющего опыта работы с ним. Проводя аналогию, можно сказать, что IP – это своеобразный адрес в сети, такой же как почтовый индекс или телефонный номер. Как мы с вами знаем, одинаковых почтовых индексов и телефонных номеров не существует, это же распространяется и на IP-адреса. Сетевые адреса имеют все устройства, подключенные к сети. Как и за телефонные номера (ресурс нумерации), за IP-адреса тоже приходится платить (прим. В большинстве случаев нам предоставляется временный IP-адрес, плата за который не взимается).

Если вы используете домашний роутер, то с большой вероятностью, диапазон ваших IP-адресов равен 192.168.0.N, где N может быть от 1 до 254. Помимо этого, стоит знать также маску подсети, чтобы точно можно было определить, находится рассматриваемый нами IP-адрес в данной сети или нет. Понимаю, что довольно трудно понять суть вещей, о которых не имеешь представления. По большей части нам эти знания и не понадобятся, а тем, кто желает узнать больше об IP и сабнетинге, стоит почитать пару статей на хабре.

Узнать сетевые параметры вы можете через командную строку, введя в нее команду ipconfig. Все эти данные нужны для того, чтобы выбрать свободный ip-адрес для Arduino. Мой вам совет, задайте IP-адрес Ардуино в диапазоне от 192.168.0.100-192.168.0.200, при маске подсети 255.255.255.0. Сильно не пугайтесь выше изложенной информации, так как на практике я еще ни разу не сталкивался с тем, чтобы в домашней сети какие-либо устройства не могли поделить между собой IP-адрес.

Теперь, когда мы разобрались, что такое IP-адрес, переходим непосредственно программированию. В данном разделе мы создадим простой HTTP-запрос и отправим его на сервер сайта www.timeapi.org (онлайн время) с целью получить точное время по Гринвичу. Полученный ответ мы выведем через serial-порт на экран нашего компьютера.

Загрузим в память Ардуино следующий скетч:

Открыв функцию мониторинга порта, мы увидим, что сервер прислал нам следующий ответ:

Как мы видим, ответ содержит множество параметров (заголовков), однако интересовать нас будет лишь первая строка, и то, что содержится после двух переносов строк, (прим. Два переноса используются для разграничения заголовков и тела ответа, заголовок Content-Length показывает размер тела ответа в байтах) по существу это и есть те данные, ради которых мы отправляли запрос серверу.

В первой строке HTTP/1.1 говорит нам о том, что используется протокол HTTP версии 1.1, второй элемент – 200 OK – это код состояния запроса, в нашем случае он означает, что запрос прошел успешно. Самые распространенные ответы, помимо 200 OK, – это 404 (не найдено) и 400 («плохой» или неправильный запрос).

Теперь вернемся к скетчу и разберем все более подробно. Первое что мы делаем, это подключаем необходимы библиотеки, а именно Ethernet.h и SPI.h (Ардуино уно взаимодействует с платой расширения по шине SPI, объединяющей в себе выводы 11, 12 и 13). Далее мы задаем MAC и IP-адреса, а также указываем IP-адрес или доменное имя ресурса, к серверу которого мы будем посылать запрос.

В методе setup функцией Ethernet.begin(mac, ip) мы запускаем нашу плату, и проверяем, если соединение с сервером установлено, то отправляем наш запрос. Не забываем прописывать пустую строку после запроса.

В методе loop мы функцией client.available() проверяем количество непрочитанных байт (т.е. количество байт, принятых клиентом от удаленного сервера, с которым установлено соединение), и если таковые имеются, то записываем их в переменную c.

Как только мы считаем последний байт, соединение будет считаться потерянным (прерванным). Следует обратить внимание на то, что клиент считается подключённым, если подключение уже закрыто, но остались несчитанные данные.

Напоследок хочется добавить, что режим клиента для Ардуино наиболее подходящий, так как он позволяет отправлять данные с различных датчиков на сервер, обрабатывать его ответ и при этом задействовать минимальное количество ресурсов платы.

Ардуино в режиме сервера

В данном режиме Ардуино создает сервер, ожидающий входящие соединения через указанный порт, чаще всего это 80 порт. В предыдущем разделе мы отправляли запрос удаленному серверу, чтобы он предоставил нам html-страницу. В этом разделе мы рассмотрим данный пример уже с другой стороны, в качестве клиента будет выступать наш ПК, а в качестве сервера Ардуино. Мы отправим запрос к Арудино, и после того, как он его обработает, сгенерирует для нас HTML-страницу.

Класс Server библиотеки Ethernet.h предоставляет нам доступ к следующим функциям:

Прежде чем переходить к непосредственному программированию, я расскажу вам о структуре HTML-страницы. Сам по себе HTML является стандартным языком разметки документов во Всемирной паутине. Для веб-разработчиков правилом хорошего тона является разграничение кода и оформления, т.е. чтобы код HTML был свободен от элементов оформления вроде установки цвета, размера шрифта и других параметров. В идеале, веб-страница должна содержать только теги логического форматирования, а вид элементов задаётся через стили. Другими словами, это означает, что язык программирования отвечает за все вычисления, HTML за то, что должно находиться на странице, а CSS как это содержимое (контент) должно выглядеть.

Чем больше тегов и селекторов мы будем использовать в HTML и CSS соответственно, тем больше ресурсов будет затрачено платой на генерацию страницы, особенно сильно это отразится на оперативной памяти, так как все строковые значения хранятся в ней. В связи с чем, использование CSS в составе скетча Ардуино практически невозможно. В своих проектах я загружал CSS-стили с удаленного сервера, предварительно подключив их в шапке страницы.

Если открыть любую веб-страницу, то она будет содержать в себе типичные элементы, которые не меняются от вида и направленности сайта. Ниже представлен HTML-код простой страницы, содержащей в себе основные тэги.

Теперь давайте подробно разберем каждую строку нашего HTML кода. Элемент предназначен для указания типа текущего документа – DTD (document type definition, описание типа документа). Это необходимо, чтобы браузер понимал, как следует интерпретировать текущую веб-страницу, ведь HTML существует в нескольких версиях, кроме того, имеется XHTML (EXtensible Hyper Text Markup Language, расширенный язык разметки гипертекста), похожий на HTML, но различающийся с ним по синтаксису. Чтобы браузер «не путался» и понимал, согласно какому стандарту отображать веб-страницу и необходимо в первой строке кода задавать . Существует несколько видов , они различаются в зависимости от версии HTML, на которую ориентированы. В нашем случае мы использовали HTML версии 5, самая актуальная версия на момент написания статьи.

Читайте также:  Очистить историю поиска яндекс на андроиде

Тег определяет начало HTML-файла, внутри него хранится заголовок ( ) и тело документа ( ).Заголовок документа, как еще называют блок , может содержать текст и теги, но содержимое этого раздела не показывается напрямую на странице, за исключением контейнера .Тег является универсальным и добавляет целый класс возможностей, в частности, с помощью метатегов, как обобщенно называют этот тег, можно изменять кодировку страницы, добавлять ключевые слова, описание документа и многое другое. Тег определяет заголовок веб-страницы. В операционной системе Windows текст заголовка отображается в левом верхнем углу окна браузера. Обязательно следует добавлять закрывающий тег , чтобы показать, что блок заголовка документа завершен.Тело документа предназначено для размещения тегов и содержательной части веб-страницы.Тег

определяет абзац (параграф) текста. Если закрывающего тега нет, считается, что конец абзаца совпадает с началом следующего блочного элемента.Тег

является блочным элементом, поэтому текст всегда начинается с новой строки, абзацы идущие друг за другом разделяются между собой отбивкой (так называется пустое пространство между ними). Следует добавить закрывающий тег

Всем добрый день.

Около года назад я написал небольшую обзорную статью для управления Arduino через интернет, с помощью сервера NinjaBlocks. Это было довольно хорошее и удобное решение и оно отлично работало, пока в один прекрасный момент не начались проблемы с соединением. Попытки уговорить разработчиков через форум решить проблемы были напрасны — они просто игнорировали мои просьбы и не удосужились даже ответить, что было очень печально.

С того момента был просканирован весь интернет в поисках замены — и было найдено много очень интересных проектов, но они либо были слишком сложными в реализации и требовали значительных знаний в области программирования, либо были попросту неудобны. И вот тут и пришла мысль почему бы не сделать все самому.

Конечно очень хотелось использовать современные протоколы передачи данных websockets или mqtt, которые позволили бы контролировать все процессы в реальном времени, но если с клиентом для arduino дела обстояли хорошо — наличие неплохих библиотек радовало, то вот с серверной стороной дела обстояли хуже — нужны были серверы с поддержкой нужных протоколов, которых у обычного хостера не было. А заводить свой сервер ради зажигания светодиода не хотелось. И выбор пал на старый и добрый http.

1. Как это всё работает.

У нас имеется:
— сервер на php расположенный на хостинге который привязанный к доменному имени
— клиент в виде arduino
— панель управления

Arduino подключается к серверу и отправляет GET запрос, где содержатся значения датчиков температуры.

Сервер принимает запрос, и записывает значения температур в текстовые файлы. При этом читает из текстового файла значение установленного выхода для arduino и отправляет в ответ на запрос контроллера.

Arduino принимает ответ от сервера и согласно ему устанавливает состояние своего выхода

Панель управления, используя Ajax, считывает значение температуры из текстовых файлов и обновляет показания датчиков. А также считывает их текстового файла состояние выхода и обновляет его на странице. С помощью того же Ajax через форму в текстовый файл записывается значение выхода контроллера, откуда потом будет брать значение сервер и отправлять контроллеру.

2. Клиент на Arduino

Скетч довольно простой, всё что он делает — это собирает значение датчиков и отправляет их на сервер, получает ответ, включает или отключает выход.

#include
#include
#include
#include

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

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. Его я уже успел успешно опробовать и убедился, что все работает, правда, там есть свои нюансы в работе.

А если наберется достаточное количество желающих напишу, будет подробная статья, где мы рассмотрим добавление новых блоков с датчиками и управлением дополнительными выходами в панель управления.

Прошу дать совет как лучше реализовать авторизацию в панели управления, чтобы была относительно простая и понятная установка и приемлемый уровень безопасности.

Все желающие могут сами посетить страницу моего сервера и проверить в действии arduino.zhodinovel.com
. Для изменения выхода контроллера поставьте маркер на нужное значение и нажмите «ОТПРАВИТЬ» .

Всем спасибо за внимание!

UPD. Добавил обратную связь в панель в виде фоторезистора. Когда лампочка выключена, показания около 130, когда включена — 900.

Ссылка на основную публикацию
Нет msvcr120 dll что делать
Если, попытавшись включить любимую игру, вы натыкаетесь на окно, которое гласит, что запуск программы невозможен по причине отсутствия mscvr120.dll —...
Консольные команды для бателфилд 4
Встречаем и вновь возвращаемся в самый: динамический, красивый, технически богатый и самый заселённый мир с постоянно ведущимися боевыми действиями. Самый...
Конструкция степлера канцелярского схема
Первые степлеры появились во Франции в XVIII веке, их специально изобрели для короля Людовика XV. Но в то время это...
Нет беспроводного сетевого соединения windows 7
На панели задач в Windows или в меню «Центр управление сетями» нет иконки Wi-Fi? Это не значит, что вышло из...
Adblock detector