Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

Код

  1. /* Запрос значений на контактах через браузерный интерфейс (Webduino)
  2. */
  3.  
  4. /*
  5.  * Чтобы использовать это демо, введите в браузер один из
  6.  * нижеследующих URL’ов: «http://host/», «http://host/json»
  7.  * или «http://host/form». Замените «host» на IP-адрес,
  8.  * присвоенный вашей Arduino.
  9.  *
  10.  * Если вставить в браузере «http://host/», это отобразит на экране
  11.  * значения, считанные с цифровых контактов 0-9 и аналоговых
  12.  * контактов 0-5. Это выполняется командой defaultCmd.
  13.  *
  14.  * Если вставить в браузере «http://host/form», это тоже покажет на
  15.  * экране значения, считанные с цифровых контактов 0-9 и аналоговых
  16.  * контактов 0-5. Но это будет в виде формы (командой formCmd),
  17.  * а цифровые контакты будут показаны в виде переключателей,
  18.  * значения которых можно будет поменять. Когда вы нажмете на кнопку
  19.  * «Submit», это осуществит запрос POST, который запишет на цифровые
  20.  * контакты новые значения и снова покажет форму.
  21.  */
  22.  
  23. #include "SPI.h"
  24. #include "Ethernet.h"
  25. #include "WebServer.h"
  26.  
  27. // «бесплатный» потоковый оператор, описание которого есть тут:
  28. // http://sundial.org/arduino/?page_id=119
  29. template<class T>
  30. inline Print &operator <<(Print &obj, T arg)
  31. { obj.print(arg); return obj; }
  32.  
  33. // ПОСТАВЬТЕ ЗДЕСЬ СОБСТВЕННОЕ ЗНАЧЕНИЕ:
  34. static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  35.  
  36. // ВЫСТАВЬТЕ ТУТ ЗНАЧЕНИЕ, СООТВЕТСТВУЮЩЕЕ СЕТИ ВАШЕГО ХОСТА:
  37. static uint8_t ip[] = { 192, 168, 1, 210 };
  38.  
  39. #define PREFIX ""
  40.  
  41. WebServer webserver(PREFIX, 80);
  42.  
  43. // Команды – это функции, вызываемые веб-сервером. Они могут считывать
  44. // любые данные, опубликованные клиентом, и передавать их серверу.
  45.  
  46. void jsonCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
  47. {
  48.   if (type == WebServer::POST)
  49.   {
  50.     server.httpFail();
  51.     return;
  52.   }
  53.  
  54.   //server.httpSuccess(false, "application/json");
  55.   server.httpSuccess("application/json");
  56.  
  57.   if (type == WebServer::HEAD)
  58.     return;
  59.  
  60.   int i;    
  61.   server << "{ ";
  62.   for (i = 0; i <= 9; ++i)
  63.   {
  64.     // игнорируем контакты, которые используются для коммуникации с Ethernet-чипом:
  65.     int val = digitalRead(i);
  66.     server << "\"d" << i << "\": " << val << ", ";
  67.   }
  68.  
  69.   for (i = 0; i <= 5; ++i)
  70.   {
  71.     int val = analogRead(i);
  72.     server << "\"a" << i << "\": " << val;
  73.     if (i != 5)
  74.       server << ", ";
  75.   }
  76.  
  77.   server << " }";
  78. }
  79.  
  80. void outputPins(WebServer &server, WebServer::ConnectionType type, bool addControls = false)
  81. {
  82.   P(htmlHead) =
  83.     "<html>"
  84.     "<head>"
  85.     "<title>Arduino Web Server</title>"
  86.     "<style type=\"text/css\">"
  87.     "BODY { font-family: sans-serif }"
  88.     "H1 { font-size: 14pt; text-decoration: underline }"
  89.     "P  { font-size: 10pt; }"
  90.     "</style>"
  91.     "</head>"
  92.     "<body>";
  93.  
  94.   int i;
  95.   server.httpSuccess();
  96.   server.printP(htmlHead);
  97.  
  98.   if (addControls)
  99.     server << "<form action='" PREFIX "/form' method='post'>";
  100.  
  101.   server << "<h1>Digital Pins</h1><p>";
  102.  
  103.   for (i = 0; i <= 9; ++i)
  104.   {
  105.     // игнорируем контакты, которые используются для коммуникации с Ethernet-чипом:
  106.     int val = digitalRead(i);
  107.     server << "Digital " << i << ": ";
  108.     if (addControls)
  109.     {
  110.       char pinName[4];
  111.       pinName[0] = 'd';
  112.       itoa(i, pinName + 1, 10);
  113.       server.radioButton(pinName, "1", "On", val);
  114.       server << " ";
  115.       server.radioButton(pinName, "0", "Off", !val);
  116.     }
  117.     else
  118.       server << (val ? "HIGH" : "LOW");
  119.  
  120.     server << "<br/>";
  121.   }
  122.  
  123.   server << "</p><h1>Analog Pins</h1><p>";
  124.   for (i = 0; i <= 5; ++i)
  125.   {
  126.     int val = analogRead(i);
  127.     server << "Analog " << i << ": " << val << "<br/>";
  128.   }
  129.  
  130.   server << "</p>";
  131.  
  132.   if (addControls)
  133.     server << "<input type='submit' value='Submit'/></form>";
  134.  
  135.   server << "</body></html>";
  136. }
  137.  
  138. void formCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
  139. {
  140.   if (type == WebServer::POST)
  141.   {
  142.     bool repeat;
  143.     char name[16], value[16];
  144.     do
  145.     {
  146.       repeat = server.readPOSTparam(name, 16, value, 16);
  147.       if (name[0] == 'd')
  148.       {
  149.         int pin = strtoul(name + 1, NULL, 10);
  150.         int val = strtoul(value, NULL, 10);
  151.         digitalWrite(pin, val);
  152.       }
  153.     } while (repeat);
  154.  
  155.     server.httpSeeOther(PREFIX "/form");
  156.   }
  157.   else
  158.     outputPins(server, type, true);
  159. }
  160.  
  161. void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
  162. {
  163.   outputPins(server, type, false);  
  164. }
  165.  
  166. void setup()
  167. {
  168.   // задаем цифровые контакты 0-8 для ввода данных:
  169.   for (int i = 0; i <= 9; ++i)
  170.     pinMode(i, INPUT);
  171.   pinMode(9, OUTPUT);
  172.  
  173.   Ethernet.begin(mac, ip);
  174.   webserver.begin();
  175.  
  176.   webserver.setDefaultCommand(&defaultCmd);
  177.   webserver.addCommand("json", &jsonCmd);
  178.   webserver.addCommand("form", &formCmd);
  179. }
  180.  
  181. void loop()
  182. {
  183.   // вечно обрабатываем входящие соединения (по одному за раз):
  184.   webserver.processConnection();
  185.  
  186.   // если вы хотите выполнить еще что-то, связанное с этим
  187.   // соединением, то это следует делать тут.
  188. }

См.также

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

  1. github.com - Web_Demo.ino