Arduino:Примеры/Web Demo

Материал из Онлайн справочника
Версия от 12:39, 8 июля 2023; EducationBot (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

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


Запрос значений на контактах через браузерный интерфейс[1]

Этот пример показывает, как при помощи библиотеки Webduino и браузерного интерфейса запрашивать значения, имеющиеся на цифровых и аналоговых контактах Arduino. Также есть возможность менять значения на цифровых контактах.

Код

/* Запрос значений на контактах через браузерный интерфейс (Webduino)
*/

/*
 * Чтобы использовать это демо, введите в браузер один из 
 * нижеследующих URL’ов: «http://host/», «http://host/json» 
 * или «http://host/form». Замените «host» на IP-адрес, 
 * присвоенный вашей Arduino.
 *
 * Если вставить в браузере «http://host/», это отобразит на экране 
 * значения, считанные с цифровых контактов 0-9 и аналоговых 
 * контактов 0-5. Это выполняется командой defaultCmd.
 * 
 * Если вставить в браузере «http://host/form», это тоже покажет на 
 * экране значения, считанные с цифровых контактов 0-9 и аналоговых 
 * контактов 0-5. Но это будет в виде формы (командой formCmd),
 * а цифровые контакты будут показаны в виде переключателей, 
 * значения которых можно будет поменять. Когда вы нажмете на кнопку 
 * «Submit», это осуществит запрос POST, который запишет на цифровые 
 * контакты новые значения и снова покажет форму.
 */

#include "SPI.h"
#include "Ethernet.h"
#include "WebServer.h"

// «бесплатный» потоковый оператор, описание которого есть тут:
// http://sundial.org/arduino/?page_id=119
template<class T>
inline Print &operator <<(Print &obj, T arg)
{ obj.print(arg); return obj; }

// ПОСТАВЬТЕ ЗДЕСЬ СОБСТВЕННОЕ ЗНАЧЕНИЕ:
static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// ВЫСТАВЬТЕ ТУТ ЗНАЧЕНИЕ, СООТВЕТСТВУЮЩЕЕ СЕТИ ВАШЕГО ХОСТА:
static uint8_t ip[] = { 192, 168, 1, 210 };

#define PREFIX ""

WebServer webserver(PREFIX, 80);

// Команды – это функции, вызываемые веб-сервером. Они могут считывать 
// любые данные, опубликованные клиентом, и передавать их серверу. 

void jsonCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) 
{
  if (type == WebServer::POST)
  {
    server.httpFail();
    return;
  }

  //server.httpSuccess(false, "application/json");
  server.httpSuccess("application/json");
  
  if (type == WebServer::HEAD)
    return;

  int i;    
  server << "{ ";
  for (i = 0; i <= 9; ++i)
  {
    // игнорируем контакты, которые используются для коммуникации с Ethernet-чипом:
    int val = digitalRead(i);
    server << "\"d" << i << "\": " << val << ", ";
  }

  for (i = 0; i <= 5; ++i)
  {
    int val = analogRead(i);
    server << "\"a" << i << "\": " << val;
    if (i != 5)
      server << ", ";
  }
  
  server << " }";
}

void outputPins(WebServer &server, WebServer::ConnectionType type, bool addControls = false)
{
  P(htmlHead) =
    "<html>"
    "<head>"
    "<title>Arduino Web Server</title>"
    "<style type=\"text/css\">"
    "BODY { font-family: sans-serif }"
    "H1 { font-size: 14pt; text-decoration: underline }"
    "P  { font-size: 10pt; }"
    "</style>"
    "</head>"
    "<body>";

  int i;
  server.httpSuccess();
  server.printP(htmlHead);

  if (addControls)
    server << "<form action='" PREFIX "/form' method='post'>";

  server << "<h1>Digital Pins</h1><p>";

  for (i = 0; i <= 9; ++i)
  {
    // игнорируем контакты, которые используются для коммуникации с Ethernet-чипом:
    int val = digitalRead(i);
    server << "Digital " << i << ": ";
    if (addControls)
    {
      char pinName[4];
      pinName[0] = 'd';
      itoa(i, pinName + 1, 10);
      server.radioButton(pinName, "1", "On", val);
      server << " ";
      server.radioButton(pinName, "0", "Off", !val);
    }
    else
      server << (val ? "HIGH" : "LOW");

    server << "<br/>";
  }

  server << "</p><h1>Analog Pins</h1><p>";
  for (i = 0; i <= 5; ++i)
  {
    int val = analogRead(i);
    server << "Analog " << i << ": " << val << "<br/>";
  }

  server << "</p>";

  if (addControls)
    server << "<input type='submit' value='Submit'/></form>";

  server << "</body></html>";
}

void formCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if (type == WebServer::POST)
  {
    bool repeat;
    char name[16], value[16];
    do
    {
      repeat = server.readPOSTparam(name, 16, value, 16);
      if (name[0] == 'd')
      {
        int pin = strtoul(name + 1, NULL, 10);
        int val = strtoul(value, NULL, 10);
        digitalWrite(pin, val);
      }
    } while (repeat);

    server.httpSeeOther(PREFIX "/form");
  }
  else
    outputPins(server, type, true);
}

void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  outputPins(server, type, false);  
}

void setup()
{
  // задаем цифровые контакты 0-8 для ввода данных:
  for (int i = 0; i <= 9; ++i)
    pinMode(i, INPUT);
  pinMode(9, OUTPUT);

  Ethernet.begin(mac, ip);
  webserver.begin();

  webserver.setDefaultCommand(&defaultCmd);
  webserver.addCommand("json", &jsonCmd);
  webserver.addCommand("form", &formCmd);
}

void loop()
{
  // вечно обрабатываем входящие соединения (по одному за раз):
  webserver.processConnection();

  // если вы хотите выполнить еще что-то, связанное с этим 
  // соединением, то это следует делать тут.
}

См.также

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