Простое управление 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 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.
Соединяем две Arduino через Интернет (IOT)

В этом проекте мы соединим две платы Arduino ULTRA/Piranha ULTRA через интернет. Сделаем мы это при помощи сервиса ioControl.
Видео



Подключаем Trema-модуль Кнопка к одному устройству.

Подключаем Trema-модуль Светодиод к другому устройству.

Скетч проекта
Для скетча мы воспользуемся генератором скетча для IDE на сайте ioControl.
Нажмём на кнопку «Генератор скетча для IDE».

Выберем необходимые параметры. В нашем случае это:
| Параметр | Устройство с кнопкой | Устройство со светодиодом |
|---|---|---|
| Контроллер | Arduino/Piranha ULTRA | Arduino/Piranha ULTRA |
| Shield | Ethernet Shield w5500 | Ethernet Shield w5500 |
| Вывод SS | D10 | D10 |
| IP адрес | DHCP | DHCP |
| Mac адрес | 0xCE | 0xCC |
| Панель | панель с переменной myButton | панель с переменной myButton |
| Переменные на чтение | — | myButton |
| Переменные на запись | myButton | — |
После генерации нам остаётся добавить код только для наших модулей в кадый из скетчей соответственно.
Так же необходимо установить библиотеку iocontrol. Если Вы не знаете как устанавливать библиотеки в Arduino IDE — Вы можете узнать по этой ссылке
Скетч для кнопки
#include #include #include // Определяем вывод кнопки #define BUT 2 // эту строку мы добавили вручную // Название панели на сайте iocontrol.ru const char* myPanelName = "сюда_необходимо_вставить_название_Вашей_панели"; int status; // Название переменных как на сайте iocontrol.ru const char* VarName_myButton = "myButton"; // Создаём переменную для хранения состояния кнопки bool button = false; // Эту строку мы добавили вручную // Создаём объект клиента класса EthernetClient EthernetClient client; // Создаём объект iocontrol, передавая в конструктор название панели и клиента iocontrol mypanel(myPanelName, client); // MAC адреса Ethernet шилда. Должен быть уникальным в сети byte mac[] = < 0xDE, 0xAD, 0xDE, 0xAD, 0xFA, 0xCE >; void setup() < Serial.begin(9600); Ethernet.init(10); // Инициируем Ethernet Shield с использованием DHCP Ethernet.begin(mac); // Вызываем функцию первого запроса к сервису status = mypanel.begin(); Serial.println((String)"Status mypanel.begin = "+status); >void loop() < // ************************ ЧТЕНИЕ ************************ // Чтение значений переменных из сервиса status = mypanel.readUpdate(); // Если статус равен константе OK. if (status == OK) < // Выводим текст в последовательный порт Serial.println("------- Read OK -------"); // Записываем считанный из сервиса значения в переменные >// ************************ ЗАПИСЬ ************************ // Записываем значение в переменную для отпраки в сервис // Считываем логический уровень кнопки // и меняем значение переменной button на // противоположное if (digitalRead(BUT)) < // Эти строки delay(100); // мы if (digitalRead(BUT)) // добавили button = !button; // вручную >// Записываем значение в переменную на сайте mypanel.write(VarName_myButton, button); // Эту строку мы изменили вручную // Отправляем переменные из контроллера в сервис status = mypanel.writeUpdate(); // Если статус равен константе OK. if (status == OK) < // Выводим текст в последовательный порт Serial.println("------- Write OK -------"); >>
Скетч для светодиода
#include #include #include // Определяем номер вывода светодиода #define LED 2 // Эту строку мы добавили вручную // Название панели на сайте iocontrol.ru const char* myPanelName = "сюда_необходимо_вставить_название_Вашей_панели"; int status; // Название переменных как на сайте iocontrol.ru const char* VarName_myButton = "myButton"; // Создаём объект клиента класса EthernetClient EthernetClient client; // Создаём объект iocontrol, передавая в конструктор название панели и клиента iocontrol mypanel(myPanelName, client); // MAC адреса Ethernet шилда. Должен быть уникальным в сети byte mac[] = < 0xDE, 0xED, 0xDE, 0xAD, 0xFA, 0xCC >; void setup() < Serial.begin(9600); Ethernet.init(10); // Меняем режим вывода светодиода pinMode(LED, OUTPUT); // Эту строку мы добавили вручную // Инициируем Ethernet Shield с использованием DHCP Ethernet.begin(mac); // Вызываем функцию первого запроса к сервису status = mypanel.begin(); Serial.println((String)"Status mypanel.begin = "+status); >void loop() < // ************************ ЧТЕНИЕ ************************ // Чтение значений переменных из сервиса status = mypanel.readUpdate(); // Если статус равен константе OK. if (status == OK) < // Выводим текст в последовательный порт Serial.println("------- Read OK -------"); // Записываем считанный из сервиса значения в переменные bool io_myButton = mypanel.readInt(VarName_myButton); // целочисленная переменна Serial.println((String)"io_myButton = "+io_myButton); // Меняем логический уровень вывода светодиода полученный с сайта digitalWrite(LED, io_myButton); // Эту строку мы добавили вручную >// ************************ ЗАПИСЬ ************************ // Записываем значение в переменную для отправки в сервис // Отправляем переменные из контроллера в сервис status = mypanel.writeUpdate(); // Если статус равен константе OK. if (status == OK) < // Выводим текст в последовательный порт Serial.println("------- Write OK -------"); >>
Ссылки
- Ethernet Shield W5500
- Бесплатный сервис ioControl
- Создание учётной записи в сервисе ioControl
- Создание панели в ioControl
- Создание переменных в ioControl
- Подготовка Arduino к работе с ioControl
- Библиотека iocontrol
- Wiki — Установка библиотек в Arduino IDE.
Управление Arduino через интернет с помощью ПК — опыт новичка
Всем привет. В этой статье расскажу о том, как мне удалось реализовать управление Arduino через интернет с помощью подключенного к интернету ПК. В общем случае данный способ можно использовать для любого микроконтроллера, например PIC. Способ довольно дубовый, есть куда модернизироваться и есть много более продвинутых схем, но в простейшем случае этого хватит.
Вместо вступления
Хочется сразу сказать, что в этой статье я не буду очень сильно углубляться в тонкости программирования, предполагается, что читающий имеет хотя-бы минимальные азы. Расскажу в целом как использовались ресурсы и о интересных моментах.
Предпосылки к созданию данного способа у меня возникли во время создания моего электромобиля: Жмяк сюда! Скажу сразу, что создавалось это всё больше из спортивного интереса, нежели для серьёзных практических работ, но тем не менее оно работает и может пригодится кому-либо.
На чем строится вся система и как реализовано в железе
Схема работы следующая: с сервера считываем файл, в котором лежат данные с помощью программы, запущенной на ПК/ноутбуке. Эта программа через USB отсылает данные на контроллер. Контроллер принимает данные и по ним выполняет действия. Схема с сервером привлекательна тем, что управлять схемой можно без приложения, просто зайдя на сайт с любого смартфона/планшета/пк/ноутбука в любой точке планеты, где есть доступ к интернету.
PS. Про серверную часть рассказано ниже.
В этой статье я буду управлять Arduino MEGA 2560 (китайским аналогом), но «за кулисами» схема спокойно сработала и с PIC16F877А, единственное что пришлось использовать — переходник USB-TTL:

Понятное дело программа для PIC несколько отличается от программы для Ардуино, ввиду разных типов МК, но принцип один и тот-же:
Принимаем через COM-порт данные, сравниваем их с внутренней таблицей команд и выполняем соответственное действие.
Схема изначально мне показалась очень простой, но было одно НО — небыло программы, которая читала бы файлик в интернете и отсылала данные в COM-порт. Соответственно такую программу пришлось написать.
Программа писалась на VB6. Для чтения файла с сервера используется компонент VB6: Microsoft Internet Transfer Control 6.0. С его помощью просто читается текстовый файл на сервере в строковую переменную. После чтения эта строка отсылается в COM-порт с помощью компонента VB6: Microsoft Comm Control 6.0. Весь процесс чтения файла и отсылания строки читается в цикле с использования таймера. Интервал срабатывания таймера можно менять в конфиге программы, либо прямо во время работы. Кроме этого можно выбрать режим работы порта, его номер, режим работы интернет соединения и ссылку на читаемый файл.
Хочется сделать замечание, что при больших размерах файла и маленьких промежутках программа подвисает, но продолжает работать. Размер буфера моей программы 512 байт. Учитывая, что у моего МК буфер меньше, этого хватает.
Важный момент. Программа в МК не умеет парсить данные, она умеет читать только какой символ был передан на вход через последовательный порт. Без ошибок у меня получилось принимать латиницу (26 символов A-Z и 10 цифр 0-9). Итого 36 команд, если алгоритм доработать и ввести парсинг данных в МК, то передавать можно любые данные. Так же есть возможность «допилинга» ПО для двустороннего обмена данными.
Выбор сервера и серверная часть
Для серверной части подойдет любой сервер с поддержкой PHP, хоть запущенный на личном ПК, лишь бы был статический IP, но я лично использую арендованный Jino. Серверная часть в моём примере состоит из двух файлов: HTML странички с формой с кнопками ВКЛ/ВЫКЛ светодиода и PHP скрипта, который меняет содержимое TXT файла из которого программа, запущенная на ПК читает данные.
Программное обеспечение
Код HTML. Форма с 2 кнопками, вкл/выкл светодиод на плате:
Управление светодиодом Светодиод:
Код PHP, здесь мы пишем в файл команду А, если светодиод должен гореть, и В если должен потухнуть:
fclose($cm); ?>
Теперь собственно код для Arduino:
int val; // освобождаем память в контроллере для переменой void setup() < Serial.begin(9600); // подключаем последовательный порт pinMode(13, OUTPUT); // объявляем пин 13 как выход >void loop() < // проверяем, поступают ли какие-то команды if (Serial.available()) < val = Serial.read(); // переменная val равна полученной команде if (val == 'a') // при a включаем светодиод if (val == 'b') // при b выключаем светодиод >>
Сама программа для чтения информации на сервере с пересылкой в COM-порт и её исходный код лежат в архиве по ссылке: Яндекс-Диск Программа скомпилирована в несколько вариантов кода, возможно будут какие-либо различия в работе, но не должно быть. При первом запуске EXEшника генерируется файл справки и конфиг-файл. Данные из этого файла считываются при запуске программы, если он существует. Если файл не существует (например при первом запуске программы), то config-файл создается с дефолтными значениями.
Результаты работы
Вместо заключения
В данном примере я реализовал простой «дубовый» алгоритм, который работает. Есть конечно куда развиваться дальше, но тем не менее уже в таком виде можно отсылать 36 команд. Если реализовать парсинг входящих данных в микроконтроллере, то можно передавать любые данные. Для моих задач 36 команд хватит с головой, да и к тому-же это опыт новичка 🙂
- ардуино
- arduino
- микроконтроллеры
- программирование
- интернет вещей
- microchip
- Хостинг
- Программирование микроконтроллеров
- Разработка под Arduino
- Интернет вещей
Введение. Подключение к WiFi
ESP8266 – мощный китайский микроконтроллер с WiFi на борту. Это позволяет делать на его основе проекты с доступом в Интернет!
- Если вы уже работали с Arduino и первый раз держите в руках плату на базе esp8266 (в наборе GyverKIT это плата Wemos Mini) – обязательно изучите урок по особенностям данного микроконтроллера и отличиям от обычных плат Arduino.
- Для работы с Wemos нужно установить поддержку данных плат в Arduino IDE: на сайте набора в блоке Начало работы есть отдельная инструкция по настройке.
Работать с платой через WiFi есть два способа:
- Подключить плату к домашнему WiFi роутеру (режим STA) – для работы в локальной сети или через Интернет
- Настроить плату как точку доступа (режим AP) и подключиться к ней со смартфона
Подключение к роутеру
- Подключаем в скетч встроенную библиотеку ESP8266WiFi.h
- Переводим режим работы в STA через WiFi.mode(WIFI_STA) – необязательно, если до этого режим работы не изменялся
- Инициируем подключение к WiFi роутеру:
- Вызываем WiFi.begin(WIFI_SSID) – с указанием названия незащищённой сети (без пароля)
- Вызываем WiFi.begin(WIFI_SSID, WIFI_PASS) – с указанием названия сети и пароля
- Для удобства настройки можно вынести логин и пароль в начало программы через #define
После успешного подключения можно вывести IP адрес платы в локальной сети роутера при помощи WiFi.localIP() .
Полный код примера:
#include #define WIFI_SSID «Alex» #define WIFI_PASS «pass» void setup() < Serial.begin(115200); WiFi.begin(WIFI_SSID, WIFI_PASS); while (WiFi.status() != WL_CONNECTED) < delay(500); Serial.print("."); >Serial.println(«Connected»); Serial.println(WiFi.localIP()); > void loop()
Вывод монитор порта:
. Connected 192.168.1.214
Скриншот со страницы конфигурации роутера. Плата есть в списке подключенных устройств:

Создание точки доступа
- Подключаем в скетч встроенную библиотеку ESP8266WiFi.h
- Переводим режим работы в AP через WiFi.mode(WIFI_AP)
- Создаём точку доступа:
- WiFi.softAP(AP_SSID) – сеть без пароля. Указываем только имя
- WiFi.softAP(AP_SSID, AP_PASS) – сеть с паролем
Полный код примера:
#include #define AP_SSID «ESP» void setup() < Serial.begin(115200); WiFi.mode(WIFI_AP); WiFi.softAP(AP_SSID); >void loop()
Теперь можно подключиться к плате со смартфона как к точке доступа WiFi. Примечание: по умолчанию в своей сети плата имеет IP адрес 192.168.4.1