Как использовать Arduino в качестве веб-сервера

Добавлено 13 февраля 2016 в 17:00

Используя плату расширения Ethernet Shield, вы можете превратить Arduino в веб-сервер

Оснастив Arduino платой расширения Ethernet Shield, вы можете превратить её в простой веб-сервер, и с помощью доступа к этому серверу через браузер, запущенный на любом компьютере, который подключен к той же сети, что и Arduino, вы сможете:

  • управлять аппаратной составляющей вашего проекта с веб-страницы (с помощью кнопок, использующих JavaScript);
  • считывать состояние кнопки (используя простой HTML);
  • считывать значение датчика (используя простой HTML).
Arduino Ethernet Shield R3 Front
Arduino Ethernet Shield R3 (вид сверху)
Arduino Ethernet Shield R3 Back
Arduino Ethernet Shield R3 (вид снизу)

Необходимое оборудование

Чтобы использовать Arduino в качестве веб-сервера, вам необходимо следующее:

Плата Ethernet Shield подключает Arduino к локальной сети или к интернету. Установка очень проста. Просто вставьте разъемы платы расширения в разъемы Arduino, а затем подключите кабель Ethernet к плате расширения. На рисунке ниже вы можете увидеть Arduino Mega с установленной платой расширения Ethernet Shield.

arduino mega и ethernet shield

Эксперимент

Чтобы продемонстрировать, как использовать Arduino в качестве веб-сервера, мы будем считывать состояние кнопки.

Необходимые комплектующие

Схема соединений

схема содениений

Соедините компоненты, как показано на рисунке выше. Вывод 8 Arduino соединен с кнопкой. Этот вывод настроен, как вход, и, когда кнопка нажата, Arduino будет считывать высокий уровень на этом выводе. После чего Arduino установит состояние выхода в значение ON. Когда кнопка отпущена, выход будет установлен в значение OFF. Состояние кнопки будет доступно веб-серверу.

Конфигурация Ethernet

Для управления платой расширения Ethernet будем использовать библиотеку Ethernet.h.

Плате расширения должны быть присвоены MAC и IP адреса с помощью функции Ethernet.begin(). Для конкретного устройства MAC адрес представляет собой глобальный уникальный идентификатор. Современные платы расширения Ethernet приходят с наклейкой, указывающей MAC адрес. Для старых плат расширения должен присваиваться какой-либо случайный адрес, но не используйте один и тот же адрес для нескольких плат. Правильность IP адресов зависит от конфигурации сети. Если используется DHCP, IP адрес может быть присвоен плате расширения динамически.

IP адрес

IP адрес является числовой меткой, присваиваемой каждому устройству в компьютерной сети, использующей межсетевой протокол IP. Указать IP адрес в скетче просто:

byte ip[] = { 192, 168, 0, 112 } 

И изменить его под собственную сеть. Например, если IP адрес роутера 192.168.0.60, а у сканера 192.168.0.40, то плате расширения можно назначить IP адрес 192.168.0.50:

byte ip[] = { 192, 168, 0, 50 }; 

Первые три байта должны быть одинаковыми.

MAC адрес

MAC адрес (адрес Media Access Control — адрес управления доступом к среде) представляет собой уникальный идентификатор, присвоенный каждому устройству, участвующему в физической сети. Каждая составляющая сетевого оборудования имеет уникальный серийный номер, чтобы идентифицировать себя в сети, и который жестко зашит в прошивку оборудования. Тем не менее, для Arduino мы можем задать MAC адрес сами:

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 };

Вы можете задать подсеть и шлюз с помощью следующего кода:

byte subnet[] = { 255, 255, 255, 0 }; // присваиваем маску подсети
byte gateway[] = { 192, 168, 0, 1 }; // присваиваем адрес шлюза

Ниже показан блок кода с настройками платы расширения Ethernet Shield:

/******************** НАСТРОЙКИ ETHERNET ********************/

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 }; // присваиваем mac адрес
byte ip[] = { 192, 168, 0, 112 };                    // ip в локальной сети
byte subnet[] = { 255, 255, 255, 0 };  // присваиваем маску подсети
byte gateway[] = { 192, 168, 0, 1 };   // присваиваем адрес шлюза по умолчанию

Ниже приведено собранной схемы. Кабель Ethernet соединяет плату расширения с роутером, который через WiFi соединен с ноутбуком.

Arduino + Ethernet Shield + роутер + макетная плата

Программа

Ниже приведен блок кода, выводящего HTML код простой веб-страницы.

client.println("<!DOCTYPE html>");

client.println("<html>");

client.println("<head>");
client.println("<title>Ethernet Tutorial</title>");
client.println("<meta http-equiv=\"refresh\" content=\"1\">");
client.println("</head>");

client.println("<body>");

client.println("<h1>A Webserver Tutorial </h1>");
client.println("<h2>Observing State Of Switch</h2>");

client.print("<h2>Switch is:  </2>");

if (digitalRead(8))
{
    client.println("<h3>ON</h3>");
}
else
{
    client.println("<h3>OFF</h3>");
}


client.println("</body>");

client.println("</html>");

Эта программа будет отображать веб-страницу в веб-браузере при обращении к IP адресу, присвоенному Arduino. Следующая строка указывает браузеру на необходимость обновления страницы:

client.println("<http-equiv=\"refresh\" content=\"1\">");

Когда страница будет запрошена снова, Arduino снова считает состояние кнопки и отобразит его.

Помните, вы всегда может посмотреть исходный код отображаемой веб-страницы. Нажав кнопку, вы может наблюдать изменение состояния кнопки, как показано на видео ниже.

Также вы можете собрать всё без роутера. Для этого необходим перекрестный ethernet кабель. Адрес шлюза в этом случае можно оставить пустым.

Полный текст программы:

#include <SPI.h>
#include <Ethernet.h>


/******************** НАСТРОЙКИ ETHERNET ********************/

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 };// физический mac адрес
byte ip[] = { 192, 168, 0, 112 };                   // ip в lan
byte subnet[] = { 255, 255, 255, 0 };               // маска подсети
byte gateway[] = { 192, 168, 0, 1 };                // шлюз по умолчанию
EthernetServer server(80);                          // порт сервера


void setup()
{
  Ethernet.begin(mac,ip,gateway,subnet);  // инициализировать Ethernet устройства
  server.begin();                       	// начать прослушивание клиентов
  pinMode(8, INPUT);                    	// входной вывод для кнопки
}

void loop()
{
  EthernetClient client = server.available(); 	 // искать клиента

  // послать стандартный заголовок http ответа

  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connnection: close");
  client.println();

  /* 
    Эта часть – это веб-страница, которая будет послана
    веб-браузеру клиента, которая может использовать html, javascript
    и какой-либо другой язык веб-разметки, чтобы скомпоновать
    конкретную веб-страницу.
  */

  client.println("<!DOCTYPE html>");   //web страница создана с помощью html
  client.println("<html>");
  client.println("<head>");
  client.println("<title>Ethernet Tutorial</title>");
  client.println("<meta http-equiv=\"refresh\" content=\"1\">");

  /*
    Строка выше используется для обновления страницы каждую секунду.
    Она пошлет браузеру следующий HTML код:
    <meta http-equiv="refresh" content="1">
    content = 1 задает время обновления, равное 1 секунде. 
  */

  client.println("</head>");
  client.println("<body>");
  client.println("<h1>A Webserver Tutorial </h1>");
  client.println("<h2>Observing State Of Switch</h2>");

  client.print("<h2>Switch is:  </2>");

  if (digitalRead(8))
  {
    client.println("<h3>ON</h3>");
  }
  else
  {
    client.println("<h3>OFF</h3>");
  }

  client.println("</body>");
  client.println("</html>");

  delay(1);  				// даем время, чтобы принять данные

  /*
    Следующая строка важна, так как она остановит клиента,
    чтобы при следующей итерации цикла искать новое соединение
    с помощью
    EthernetClient client = server.available();
  */
  client.stop();

}


На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.


  • 2017-07-13Сохиб Имамов

    а можно наоборот зайти через через браузер и управлять реле несколькими .

Сообщить об ошибке