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

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

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

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

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

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

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

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

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

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

2. Клиент на Arduino

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

Скетч Arduino
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>

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

byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };

EthernetClient client;
char server[] = "*************"; // имя вашего сервера
int buff=0;
const int led=5;

void setup()
{
Ethernet.begin(mac);
sensors.begin();
pinMode( led, OUTPUT);
digitalWrite(led, LOW);
}

void loop()
{

sensors.requestTemperatures();

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();

delay(200);

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 (led1, HIGH);
}
else
{
digitalWrite(led1, 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
!!! Для изменения выхода контроллера поставьте маркер на нужное значение и нажмите «ОТПРАВИТЬ» !!!

Смотрим видео


Качаем файлы
1. Сервер
2. Скетч для arduino

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

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

Комментарии (30)


  1. ivizil Автор
    01.05.2015 19:41

    Ну всё, понеслось, чувствую сегодня я не высплюсь… Реле уже начало клацать а лампочка моргать )))))
    Прошу вас щелкать без фанатизма ))


    1. valeraba
      03.05.2015 11:55

      gambler-walrus-24202.bitballoon.com
      Работает по принципу mqtt, когда придумывал протокол, ничего не знал об mqtt.


  1. Meklon
    01.05.2015 22:47

    Весело клацает) снимите видео стробоскопа)


    1. ivizil Автор
      01.05.2015 23:00
      +1

      Если честно уже порядком поднадоело особенно последние минут 15 =))) щелкает без остановки, такое чувство что-кто-то написал скрипт, который только и делает что включает и выключает лампочку )))


      1. bockra
        02.05.2015 00:46

        Так логгирование надо завести :) И потом в бан отправлять при операциях > 2 за минуту.


  1. Finesse
    02.05.2015 06:17

    Как реализован доступ Arduino в интернет? С помощью Ethernet шилда?


    1. nochkin
      02.05.2015 07:12

      Судя по статье (код и скриншот), используется Ethernet shield на базе WIZNet W5100.


  1. Vendict
    02.05.2015 13:53

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


    1. ivizil Автор
      03.05.2015 12:20

      Вы так же пользовались текстовыми файлами для хранения данных?


      1. Vendict
        03.05.2015 12:38

        Нет, храню в БД. Хостеру все равно, размер БД плюсуется к файлам


  1. magiavr
    02.05.2015 22:50

    Было бы интереснее, если бы сервером выступала сама плата Arduino. Но в домашних условиях обычно все спрятано за NAT-ом и пробиться из Интернета трудновато. Зато была бы значительная экономия трафика, т.к не пришлось бы слать кучу бесполезных запросов.


    1. Avenit
      02.05.2015 22:51

      Это плохая идея, т.к. мощи ардуино на такое не хватит. Несколько одновременных запросов и она виснет.


      1. magiavr
        02.05.2015 23:21

        В этом и интерес. ИМХО, тут надо явно запретить одновременное подключение нескольких клиентов, т.к. смысла все равно нет. Протокол HTTP позволяет забить на желание клиента оставить подключение. Ну и поискать решение для защиты от DDOS-атак тоже интересно.


    1. ivizil Автор
      02.05.2015 23:21

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


      1. magiavr
        02.05.2015 23:44

        Ну да без проблем не бывает. Кстати, есть интересный сервис как раз для управления ардуино www.teleduino.org


        1. Vendict
          03.05.2015 11:17

          Который, если смотреть поверхностно, является собой способом программирования Ардуины через интернет.
          Т.е. ставим на Мегу(минимум) Ethernet-шилд, и с помощью интернета мигаем светодиодами.
          Имеет право на жизнь, но не то. Слишком отдалено от железа. У меня, например, Arduino-Nano + ENC28J60, придётся самому половину их библиотеки переписывать для нормальной работы.


          1. magiavr
            04.05.2015 02:01

            Положим минимум нужна Uno


        1. ivizil Автор
          03.05.2015 12:13
          +2

          Вот вот появиться очень интересный проект, который значительно упростит управление Arduino
          Blynk


          1. doom369
            12.05.2015 22:45
            +1

            Уже зарелизились. www.kickstarter.com/projects/167134865/blynk-build-an-app-for-your-arduino-project-in-5-m/posts/1228887
            Пока только 7 виджетов. Но остальные на подходе.


      1. Vendict
        03.05.2015 11:26

        Если быть точнее, то, не сочтите за рекламу.

        Подробнее
        Меня для данной задачи совсем устраивал Хостингер, пока после скачка валют не стал банить другие проекты по совсем выдуманным перегрузкам (5 пользователей и не одного длительного цикла обработки данных) и пр. Сигнализацию с ардуино тоже забанили за перегрузку. Спросил, как так, там же скрипты по 10 строк, написали что всё-таки забанили за частые заходы с одного и того же IP. Лазил по бесплатным хосингам по интернету, почти после каждой регистрации приходит письмо на следующее утро «Посмотрите на наш проект Хостингер». Но зато нашел много интересных и дешевых хостеров и доменов.


  1. ivizil Автор
    03.05.2015 12:26

    Идеальный вариант для использования на бесплатном хостинге это использование JavaScript библиотека для веб-приложений и обмена данными в реальном времени Socket IO. Если вы знаете как ею пользоваться, то напишите небольшую статейку по приёму и отправке данных на arduino. Многие будут вам благодарны!


  1. doom369
    03.05.2015 22:19
    +1

    В течении одной двух недель будет релиз Блинка — www.kickstarter.com/projects/167134865/blynk-build-an-app-for-your-arduino-project-in-5-m/description


  1. kovalevsky
    05.05.2015 09:15

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


    GET-запрос должен получать данные, а не записывать. Пишите через POST.


    1. valeraba
      05.05.2015 11:48

      Отчего такая категоричность? Если http позволяет значит имеет право.


      1. kovalevsky
        05.05.2015 11:56

        1. valeraba
          05.05.2015 13:09

          :) Ну и что? Если бы вы сослались на RESTful API то это был бы аргумент, а так…
          HTTP протокол позволяет в GET запросе размещать данные (они же параметры запроса).
          Поэтому автор не ничего нарушает, всё согласно протоколу.
          Посмотрите на API публичных сервисов. Многим из них без разницы GET или POST, они могут и так и эдак.


          1. Avenit
            05.05.2015 17:26

            c GET даже проще, всегда можно проверить браузером :)


            1. kovalevsky
              06.05.2015 10:30

              А с каких пор всё остальное нельзя проверить браузером? :)


            1. Vendict
              06.05.2015 23:00

              Для проверки POST, HEAD, PUT и прочего можно воспользоваться REST-client или подобными расширениями для браузера.


    1. magiavr
      12.05.2015 11:01

      Все же это «как правило», но для простоты вполне можно применить и GET-запрос. Это как пресловутый оператор goto, лучше обойтись без него, но порой проще с ним, главное не злоупотреблять :).