Web-сервер (с модулем EShield)      источник

Данный пример демонстрирует, как с помощью стандартной библиотеки Ethernet и модуля EShield можно реализовать на Freeduino простой Web-сервер. Предполагается версия ПО Arduino не ниже 0.12 – с этой версии в состав входит библиотека Ethernet.

Наш Web-сервер будет очень простым – при получении запроса он будет измерять значения на всех шести аналоговых входах, и выдавать их клиенту. Таким образом, набрав в любом браузере (Firefox/Opera/Internet Explorer) IP адрес устройства мы увидим значения аналоговых входов.

Разберем исходный код:

#include <Ethernet.h>          //Подключаем описание библиотеки ethernet

//Здесь задается MAC адрес и IP адрес устройства.
//В данном примере предполагается, что IP адрес компьютера, с которого
//будем обращаться к устройству будет любым из сети 192.168.1.x,
//и маска 255.255.255.0
//MAC адрес можно задать любой, лишь бы он не пересекался с имеющимися в сети
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 177 };

Server server(80);   //Создаем сервер, слушающий 80й порт (80 – это порт HTTP)

void setup()
{
  Ethernet.begin(mac, ip);   //Инициализируем Ethernet модуль
  server.begin();            //Начинаем ожидать соединений на 80 порту
}

void loop()
{
  //Если кто-то установил соединение с нашим сервером, следующая строчка
  //создаст объект-клиент.
  Client client = server.available();
  if (client) { //если client не нулевой (т.е. соединение есть)...
    //...значит кто-то подключился. Согласно протокола HTTP клиент
    //шлет довольно сложный запрос, но мы не будет его разбирать -
    //нам достаточно дождаться окончания запроса.
    //Запрос заканчивается пустой строкой, поэтому мы просто дождемся
    //получения символа '\n', перед которым тоже были получены '\n' и '\r'.

    //current_line_is_blank - это переменная-флаг. Она равна true, если
    //вновь полученная от клиента строка пустая, т.е. в полученных данных
    //не встретилось символов отличных от '\n' и '\r'.
    //Будем выставлять переменную current_line_is_blank в false при
    //получении любого отличного от '\n' и '\r' символа
    boolean current_line_is_blank = true;
    while (client.connected()) {   //пока клиент подключен
      if (client.available()) {    //если от него пришел символ
        char c = client.read();    //читаем этот символ
        //Если получен перевод строки ('\n') и current_line_is_blank == true,
        //значит мы получили пустую строку, т.е. запрос клиента окончен –
        //можно слать ответ
        if (c == '\n' && current_line_is_blank) {
          //шлем стандартный HTTP заголовок
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();     //он тоже заканчивается пустой строкой!
          
          //выдаем поочередно значения 6 аналоговых входов
          for (int i = 0; i < 6; i++) {
            client.print("analog input ");
            client.print(i);
            client.print(" is ");
            client.print(analogRead(i));
            client.println("<br>");   //HTML тэг <br> - перевод строки
          }
          break;   //работа окончена – можно выходить из цикла while
        }
        if (c == '\n') {  //если получен перевод строки, значит началась новая
          //строка. Выставим флаг current_line_is_blank = true
          current_line_is_blank = true;
        } else if (c != '\r') { //если получен любой другой символ, отличный
          //от возврата каретки ('\r'), значит получаемая строка непустая
          current_line_is_blank = false;
        }
      }
    }
    //небольшая пауза, чтобы данные успели уйти
    delay(1);
    //разрываем соединение с клиентом
    client.stop();
  }
}

Вот как выглядит результат в браузере:

Здесь мы специально запросили у устройства ресурс "abracadabra ", чтобы показать, что содержимое HTTP запроса игнорируется, и всегда генерируется страничка со значениями аналоговых входов.