Arduino:Примеры/WebServer

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Веб-сервер на базе Arduino[1]

В этом примере мы воспользуемся платой Arduino, модулем Ethernet Shield и библиотекой Ethernet для создания простого веб-сервера, который сможет отвечать на HTTP-запросы. Для того, чтобы воспользоваться этим веб-сервером, вам надо будет открыть браузер и вписать IP-адрес Ethernet Shield, после чего Arduino сгенерирует достаточно HTML-кода, чтобы отобразить в браузере входные данные ото всех шести аналоговых контактов.

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

  • Сетевой модуль Arduino Ethernet Shield;
  • Плата Arduino, совместимая с Ethernet Shield;

Цепь

Ethernet Shield позволяет подключить Arduino к Ethernet-контроллеру WizNet (через SPI-шину), и это подключение осуществляется через 10-ый, 11-ый, 12-ый и 13-ый контакты. У последних моделей Ethernet Shield имеется встроенный слот для SD-карты, а для управления SS-контактом этой SD-карты используется 4-ый цифровой контакт.

Ethernet Shield должен быть подключен к сети при помощи Ethernet-кабеля. Кроме того, в скетче нужно будет поменять сетевые настройки, чтобы они соответствовали настройкам вашей сети.

Ethernet Shield устанавливается поверх платы Arduino.

Схема

Внимание! SD-карта для этого скетча не нужна. Однако в случае, если SD-карта все же будет вставлена, но использоваться не будет, то скетч может зависнуть, потому что 4-ый контакт используется как SS-контакт SD-карты, а будучи неиспользованным он по умолчанию воспринимается как входной контакт. Вот два возможных решения:

  • Выньте SD-карту;
  • Добавьте в секции setup() вот эти строчки кода:
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);

Код

/*
Веб-сервер на базе Arduino

Простой веб-сервер, который показывает значения от входных аналоговых контактов 
при помощи Arduino Ethernet Shield на базе WizNet. 

Цепь:
* Ethernet Shield подключен к 10-ому, 11-ому, 12-ому и 13-ому контактам
* Аналоговые устройства, подключенные к шести входным аналоговым контактам (с 0-ого по 5-ый)

Создан 18 декабря 2009 Дэвидом А. Меллисом (David A. Mellis),
модифицирован 9 апреля 2012 Томом Иго (Tom Igoe).
*/

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

// Ниже вводим MAC-адрес и IP-адрес контроллера.
// IP-адрес будет зависеть от вашей локальной сети:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);

// Инициализируем библиотеку Ethernet Server
// с необходимыми вам IP-адресом и портом 
// (порт 80 используется для HTTP по умолчанию):
EthernetServer server(80);

void setup() {
  // Открываем последовательную передачу данных и ждем открытия порта:
  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта (нужно только для Leonardo)
  }

  // Запускаем Ethernet-соединение и работу сервера:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");  //  "Сервер по адресу "
  Serial.println(Ethernet.localIP());
}


void loop() {
  // Слушаем подключающихся клиентов:
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");  //  "Новый клиент"
    // HTTP-запрос заканчивается пустой линией:
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // Если добрались до конца строки (т.е. получили символ новой строки),
        // и эта строка – пустая, это значит, что это конец HTTP-запроса.
        // То есть, можно приступать к отправке ответа:
        if (c == '\n' && currentLineIsBlank) {
          // Отсылаем стандартный заголовок для HTTP-ответа:
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // после выполнения ответа соединение будет разорвано
          client.println("Refresh: 5");  // автоматически обновляем страницу каждые 5 секунд
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // Выводим значения ото всех входных аналоговых контактов:
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");
          }
          client.println("</html>");
          break;
}
        if (c == '\n') {
          // Начинаем новую строку:
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // В текущей строке есть символ:
          currentLineIsBlank = false;
        }
      }
    }
    // Даем браузеру время, чтобы получить данные:
    delay(1);
    // Закрываем соединение:
    client.stop();
    Serial.println("client disconnected");  //  "Клиент отключился"

  }
}

См.также

  1. Arduino Ethernet Shield
  2. Getting started with the ethernet shield
  3. Ethernet library
  4. ChatServer
  5. ChatClient
  6. WebClient
  7. WebServer
  8. PachubeClient?
  9. PachubeClientString?
  10. BarometricPressureWebServer
  11. UDPSendReceiveString
  12. UdpNtpClient

Внешние ссылки