===== Эксперимент 59. Управление яркостью светодиода по WiFi ===
В прошлом эксперименте мы управляли светодиодом. Его можно было включить при обращении к одной странице и выключить, при обращении к другой. Но как быть, если нам нужно управлять яркостью светодиода? Ранее мы управляли яркостью светодиода с помощью ШИМ и помним, что яркость задавалась числом от 0 до 1023. Мы не можем же сделать 1024 страницы, по одной для каждого варианта яркости. Конечно это делается не так.
При обращении к серверу клиент может передать некоторые данные. Один из способов сделать это — передать в виде параметров в адресе URL.
Рассмотрим основные части URL
{{ :products:esp-iot:url.png?nolink |}}
* Протокол обращения к ресурсу. Например http, https, ftp и пр.
* Хост. Может быть домен, например, pinlab.ru, yandex.ru или IP- адрес, например 192.168.0.12
* Путь до ресурса на сервере
* Параметры
Остановимся подробнее на параметрах. Параметры состоят из пар **имя=значение**, отделяется от адреса символом ''?'', и между собой пары разделяются символом ''&''.
Если параметр один, то он записывается ''%%http://site.ru?a=1%%'', если их несколько, то друг от друга пары разделяются амперсандом ''%%http://site.ru?a=1&b=2%%''. В качестве значений могут использоваться буквы, цифры и некоторые символы.
Как раз с помощью параметра мы и можем передавать нашему серверу значение яркости светодиода. Например так: ''%%http://192.168.43.195?duty=512%%''.
==== Схема эксперимента ====
{{ :products:esp-iot:exp31_mon.png?direct&600 |}}
//Рисунок 1. Монтажная схема эксперимента//
==== Программный код эксперимента ====
#include
#include
#define WIFI_NAME "WiFi_Name"
#define WIFI_PASSWORD "WiFi_Password"
#define PIN_LED 13
ESP8266WebServer server(80);
void indexPage() {
if (server.hasArg("duty")) {
analogWrite(PIN_LED, server.arg("duty").toInt());
server.send(200, "text/html", "Duty is: " + server.arg("duty"));
} else {
server.send(200, "text/html", "No Duty param");
}
}
void setup() {
Serial.begin(9600);
Serial.println();
pinMode(PIN_LED, OUTPUT);
analogWriteRange(1024);
analogWrite(PIN_LED, 0);
Serial.print("Connecting to WiFi");
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", indexPage);
server.begin();
}
void loop() {
server.handleClient();
}
Первым делом в коде программы нужно заменить ''WiFi_Name'' на имя нужной сети, а ''WiFi_Password'' на пароль от нее.
При обращении к главной странице сервиса происходит вызов функции ''indexPage()''
server.on("/", indexPage);
Сначала мы проверяем наличие параметра ''duty''
if (server.hasArg("duty")) {
если такого параметра не было передано серверу, то сервер отвечает строкой ''No Duty param''. Если ''duty'' было задано, то значение этого параметра используем в качестве коэффициента заполнения ШИМ и выводим в браузер строку с указанием принятого значения.
analogWrite(PIN_LED, server.arg("duty").toInt());
server.send(200, "text/html", "Duty is: " + server.arg("duty"));
Так как URL передается в виде строки и, соответственно, параметры тоже, то перед использованием значения параметра его необходимо конвертировать в число с помощью функции ''toInt()''.
Попробуй отправлять запрос на сервер с разными значениями параметра ''duty''
{{ :products:esp-iot:200.jpg?nolink |}}
{{ :products:esp-iot:500.jpg?nolink |}}
{{ :products:esp-iot:1023.jpg?nolink |}}