Эксперимент 62. Управление цветом через веб-форму

Мы уже научились создавать простой веб-сервер, отправлять веб-страницы в браузер клиента и отправлять данные из формы на странице обратно на сервер. Теперь мы сделаем ночник с полноцветным светодиодом, цветом и яркостью которого можно управлять по Wi-Fi через веб-интерфейс.

Для управления RGB светодиодом необходимо передавать на сервер 3 параметра — яркость красного, синего и зеленого цветов.

Соберем схему с RGB светодиодом

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

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

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

rgb_page.html
  1. <head>
  2. </head>
  3. <body>
  4. <form action="/">
  5. Red: <input type="number" name="r" min="0" max="255" value="<=VALUE=R=>"> <br/>
  6. Green: <input type="number" name="g" min="0" max="255" value="<=VALUE=G=>"> <br/>
  7. Blue: <input type="number" name="b" min="0" max="1023" value="<=VALUE=B=>"> <br/>
  8. <input type="submit" value="Send">
  9. </form>
  10. </body>
  11. </html>

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

Код программы:

Exp62.ino
  1. #include <ESP8266WiFi.h>
  2. #include <ESP8266WebServer.h>
  3.  
  4. #define WIFI_NAME "WiFi_Name"
  5. #define WIFI_PASSWORD "WiFi_Password"
  6.  
  7. #define PIN_LED_R 13
  8. #define PIN_LED_G 14
  9. #define PIN_LED_B 15
  10.  
  11. ESP8266WebServer server(80);
  12.  
  13. void indexPage() {
  14. int duty_r = 128;
  15. int duty_g = 128;
  16. int duty_b = 128;
  17.  
  18. if (server.hasArg("r")) duty_r = server.arg("r").toInt();
  19. if (server.hasArg("g")) duty_g = server.arg("g").toInt();
  20. if (server.hasArg("b")) duty_b = server.arg("b").toInt();
  21.  
  22. analogWrite(PIN_LED_R, 255 - duty_r);
  23. analogWrite(PIN_LED_G, 255 - duty_g);
  24. analogWrite(PIN_LED_B, 255 - duty_b);
  25.  
  26. String page = "<!DOCTYPE html>";
  27. page += "<html>";
  28. page += "<head>";
  29. page += "</head>";
  30. page += "<body>";
  31. page += R"(<form action="/">)";
  32. page += R"(Red: <input type="number" name="r" min="0" max="255" value="<=VALUE=R=>"> <br/>)";
  33. page += R"(Green: <input type="number" name="g" min="0" max="255" value="<=VALUE=G=>"> <br/>)";
  34. page += R"(Blue: <input type="number" name="b" min="0" max="255" value="<=VALUE=B=>"> <br/>)";
  35. page += R"(<input type="submit" value="Send">)";
  36. page += "</form>";
  37. page += "</body>";
  38. page += "</html>";
  39.  
  40. page.replace("<=VALUE=R=>", String(duty_r));
  41. page.replace("<=VALUE=G=>", String(duty_g));
  42. page.replace("<=VALUE=B=>", String(duty_b));
  43. server.send(200, "text/html", page);
  44. }
  45.  
  46. void setup() {
  47. Serial.begin(9600);
  48. Serial.println();
  49. pinMode(PIN_LED_R, OUTPUT);
  50. pinMode(PIN_LED_G, OUTPUT);
  51. pinMode(PIN_LED_B, OUTPUT);
  52. analogWriteRange(256);
  53. analogWrite(PIN_LED_R, 128);
  54. analogWrite(PIN_LED_G, 128);
  55. analogWrite(PIN_LED_B, 128);
  56.  
  57. Serial.print("Connecting to WiFi");
  58. WiFi.mode(WIFI_STA);
  59. WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
  60. while (WiFi.status() != WL_CONNECTED) {
  61. Serial.print(".");
  62. delay(500);
  63. }
  64. Serial.println();
  65. Serial.println("WiFi connected");
  66. Serial.print("IP address: ");
  67. Serial.println(WiFi.localIP());
  68.  
  69. server.on("/", indexPage);
  70. server.begin();
  71. }
  72. void loop() {
  73. server.handleClient();
  74. }

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

Следует обратить внимание, что перед установкой яркости светодиода мы вычитаем полученные данные из числа 255. Это сделано потому, что наш RGB светодиод с общим анодом (имеет общий плюс) и мы установили диапазон аналогового выходов на 256.

  1. analogWriteRange(256);