Эксперимент 59. Управление яркостью светодиода по WiFi

В прошлом эксперименте мы управляли светодиодом. Его можно было включить при обращении к одной странице и выключить, при обращении к другой. Но как быть, если нам нужно управлять яркостью светодиода? Ранее мы управляли яркостью светодиода с помощью ШИМ и помним, что яркость задавалась числом от 0 до 1023. Мы не можем же сделать 1024 страницы, по одной для каждого варианта яркости. Конечно это делается не так.

При обращении к серверу клиент может передать некоторые данные. Один из способов сделать это — передать в виде параметров в адресе URL.

Рассмотрим основные части URL

  • Протокол обращения к ресурсу. Например 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.

Схема эксперимента

Рисунок 1. Монтажная схема эксперимента

Программный код эксперимента

Exp59.ino
  1. #include <ESP8266WiFi.h>
  2. #include <ESP8266WebServer.h>
  3.  
  4. #define WIFI_NAME "WiFi_Name"
  5. #define WIFI_PASSWORD "WiFi_Password"
  6. #define PIN_LED 13
  7.  
  8. ESP8266WebServer server(80);
  9.  
  10. void indexPage() {
  11. if (server.hasArg("duty")) {
  12. analogWrite(PIN_LED, server.arg("duty").toInt());
  13. server.send(200, "text/html", "Duty is: " + server.arg("duty"));
  14. } else {
  15. server.send(200, "text/html", "No Duty param");
  16. }
  17. }
  18.  
  19. void setup() {
  20. Serial.begin(9600);
  21. Serial.println();
  22. pinMode(PIN_LED, OUTPUT);
  23. analogWriteRange(1024);
  24. analogWrite(PIN_LED, 0);
  25.  
  26. Serial.print("Connecting to WiFi");
  27. WiFi.mode(WIFI_STA);
  28. WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
  29. while (WiFi.status() != WL_CONNECTED) {
  30. Serial.print(".");
  31. delay(500);
  32. }
  33. Serial.println();
  34. Serial.println("WiFi connected");
  35. Serial.print("IP address: ");
  36. Serial.println(WiFi.localIP());
  37.  
  38. server.on("/", indexPage);
  39. server.begin();
  40. }
  41. void loop() {
  42. server.handleClient();
  43. }

Первым делом в коде программы нужно заменить WiFi_Name на имя нужной сети, а WiFi_Password на пароль от нее.

При обращении к главной странице сервиса происходит вызов функции indexPage()

  1. server.on("/", indexPage);

Сначала мы проверяем наличие параметра duty

  1. if (server.hasArg("duty")) {

если такого параметра не было передано серверу, то сервер отвечает строкой No Duty param. Если duty было задано, то значение этого параметра используем в качестве коэффициента заполнения ШИМ и выводим в браузер строку с указанием принятого значения.

  1. analogWrite(PIN_LED, server.arg("duty").toInt());
  2. server.send(200, "text/html", "Duty is: " + server.arg("duty"));

Так как URL передается в виде строки и, соответственно, параметры тоже, то перед использованием значения параметра его необходимо конвертировать в число с помощью функции toInt().

Попробуй отправлять запрос на сервер с разными значениями параметра duty