Arduino:Примеры/Web Demo: различия между версиями
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Myagkij (обсуждение | вклад) м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">») |
Нет описания правки |
||
Строка 9: | Строка 9: | ||
==Код== | ==Код== | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* Запрос значений на контактах через браузерный интерфейс (Webduino) | /* Запрос значений на контактах через браузерный интерфейс (Webduino) | ||
*/ | */ |
Версия от 12:34, 20 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Запрос значений на контактах через браузерный интерфейс[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();
// если вы хотите выполнить еще что-то, связанное с этим
// соединением, то это следует делать тут.
}