Простое управление arduino через интернет
Всем добрый день.Около года назад я написал небольшую обзорную статью для управления Arduino через интернет, с помощью сервера NinjaBlocks. Это было довольно хорошее и удобное решение и оно отлично работало, пока в один прекрасный момент не начались проблемы с соединением. Попытки уговорить разработчиков через форум решить проблемы были напрасны — они просто игнорировали мои просьбы и не удосужились даже ответить, что было очень печально.С того момента был просканирован весь интернет в поисках замены — и было найдено много очень интересных проектов, но они либо были слишком сложными в реализации и требовали значительных знаний в области программирования, либо были попросту неудобны. И вот тут и пришла мысль почему бы не сделать все самому.Конечно очень хотелось использовать современные протоколы передачи данных websockets или mqtt, которые позволили бы контролировать все процессы в реальном времени, но если с клиентом для arduino дела обстояли хорошо — наличие неплохих библиотек радовало, то вот с серверной стороной дела обстояли хуже — нужны были серверы с поддержкой нужных протоколов, которых у обычного хостера не было. А заводить свой сервер ради зажигания светодиода не хотелось. И выбор пал на старый и добрый http.
1. Как это всё работает.
У нас имеется: — сервер на php расположенный на хостинге который привязаный к доменному имени— клиент в виде arduino— панель управления
Arduino подключается к серверу и отправляет GET запрос, где содержатся значения датчиков температуры.
Сервер принимает запрос, и записывает значения температур в текстовые файлы. При этом читает из текстового файла значение установленного выхода для arduino и отправляет в ответ на запрос контроллера.
Arduino принимает ответ от сервера и согласно ему устанавливает состояние своего выхода
Панель управления, используя Ajax, считывает значение температуры из текстовых файлов и обновляет показания датчиков. А также считывает их текстового файла состояние выхода и обновляет его на странице. С помощью того же Ajax через форму в текстовый файл записывается значение выхода контроллера, откуда потом будет брать значение сервер и отправлять контроллеру.
2. Клиент на Arduino
Скетч довольно простой всё что он делает это собирает значение датчиков и отправляет их на сервер, получает ответ, влючает или отключает выход.
Скетч Arduino #include #include #include #include #define ONE_WIRE_BUS 2OneWire oneWire (ONE_WIRE_BUS); DallasTemperature sensors (&oneWire);
byte mac[] = { 0×54, 0×34, 0×41, 0×30, 0×30, 0×31 };
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 — файл обрабатывающий запросы с контроллера и отсылающий ответ обратно на arduinostyle.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!!! Для изменения выхода контроллера поставьте маркер на нужное значение и нажмите «ОТПРАВИТЬ» !!!
Смотрим видео[embedded content]
Качаем файлы1. Сервер2. Скетч для arduino
Всем спасибо за внимание!
UPD. Добавил обратную связь в панель в виде фоторезистора. Когда лампочка выключена показания около 130, когда включена — 900.