Это старая версия документа!
В прошлом эксперименте мы уже сделали Wi-Fi RGB-ночник. Это светодиод яркостью и цветом которого можно управлять по Wi-Fi. Его можно использовать в качестве ночника. Но в нем есть один недостаток — нет наглядного выбора цвета. Для установки цвета нам нужно вводить три цифры, три яркости R, G и B. Заранее сложно предсказать какой цвет получится в результате ввода цифр. Также не понятно какие цифры нужно вводить, чтобы получить оранжевый, бирюзовый и другие цвета.
Для упрощения выбора цветов в веб-формах есть специальные типы полей ввода. Например есть текстовые поля, есть кнопки, есть выпадающие списки. Есть и специальное поле для ввода цвета с наглядной палитрой. Можно использовать этот элемент формы для ввода цвета и у нас. Единственная проблема — в HTML принято записывать цвет совсем не так, как мы его устанавливаем в своих программах.
Мы устанавливаем яркость светодиода с помощью сигнала ШИМ со значением от 0 до 1023. А в HTML цвет записывается с помощью 6 шестнадцатеричных символов и символа # перед ними. Например
Первые 2 символа отвечают за красный цвет, вторые два за зеленый и последние за синий цвет. Цвета могут принимать значения от 00 до FF. Это запись в шестнадцатеричной системе счисления чисел от 0 до 255.
Поэтому нам необходимо конвертировать цвет из формата записи в HTML в наш формат трех чисел от 0 до 255.
Сохрани эту страницу в корне файловой системы микроконтроллера под именем color.html
Код программы:
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #define WIFI_NAME "WiFi_Name" #define WIFI_PASSWORD "WiFi_Password" #define PIN_LED_R 13 #define PIN_LED_G 14 #define PIN_LED_B 15 ESP8266WebServer server(80); void indexPage() { String html_color = "4AD686"; if (server.hasArg("color")) html_color = server.arg("color"); long number = strtoll(&html_color[1], NULL, 16); int duty_r = number >> 16; int duty_g = number >> 8 & 0xFF; int duty_b = number & 0xFF; String page = "<!DOCTYPE html>"; page += "<html>"; page += "<head>"; page += "</head>"; page += "<body>"; page += "<h3>Select color:</h3>"; page += R"(<form action="/">)"; page += R"(<input type="color" style="height:50px;width:50%;" value="<=VALUE=>" name="color">)"; page += R"(<input type="submit" value="Send">)"; page += "</form>"; page += "</body>"; page += "</html>"; page.replace("<=VALUE=>", html_color); server.send(200, "text/html", page); } void setup() { analogWriteRange(256); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_NAME, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { } server.on("/", indexPage); server.begin(); } void loop() { server.handleClient(); }
Первым делом в коде программы нужно заменить Wi-Fi_Name
на имя нужной сети, а Wi-Fi_Password
на пароль от нее.
Рассмотрим алгоритм преобразования цвета. Веб форма отправляет на наш сервер цвет в формате #FFFFFF. При этом символ # трансформируется в код символа %23. Поэтому в программе на Python в params['color']
будет что-то вроде %23c400be
. С помощью оператора извлечение среза мы выбираем нужные нам символы, а именно с 3 по 9.
html_color = params['color'][3:9]
Теперь в переменной html_color
находится цвет в формате c400be
. Точно так же «разрезаем» его на 3 части:
r = html_color[0:2] g = html_color[2:4] b = html_color[4:6]
Теперь в переменных r, g и b у нас находятся соответствующие цвета записанные строкой в шестнадцатеричной форме. Их нужно перевести в числа:
r = int(r, 16) g = int(g, 16) b = int(b, 16)
Теперь мы получили три числа, которые могут быть от 0 до 255. Нам нужно масштабировать их в диапазон от 0 до 1023. Иначе мы получим лишь четверть от максимальной яркости.
r = int(r * 1023 / 255) g = int(g * 1023 / 255) b = int(b * 1023 / 255)
Теперь мы имеем данные для управления ШИМ сигналом светодиода. Остается только не забыть, что светодиод с общим анодом, поэтому для получения нужного результата наши значения нужно вычесть из 1023.
LedR.duty(1023-r) LedG.duty(1023-g) LedB.duty(1023-b)
При выводе страницы в браузер мы должны заменить метку в шаблоне страницы на актуальный цвет, но в формате HTML.
html = html.replace('<=VALUE=>', '#' + html_color)
Вот так это выглядит у нас. Но отображение может быть разным в зависимости от браузера.
Теперь управлять цветом светодиода легко и наглядно.