Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
products:laboratory_iot:exp63 [2020/06/19 11:55] – labuser29 | products:laboratory_iot:exp63 [2024/12/06 22:08] (текущий) – labuser30 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ===== Эксперимент 63. RGB- ночник ===== | + | ===== Эксперимент 63. RGB-ночник ===== |
- | В прошлом эксперименте мы уже сделали Wi-Fi RGB- ночник. Это светодиод яркостью и цветом которого можно управлять по Wi-Fi. Его можно использовать в качестве ночника. Но в нем есть один недостаток — нет наглядного выбора цвета. Для установки цвета нам нужно вводить три цифры, три яркости R, G и B. Заранее сложно предсказать какой цвет получится в результате ввода цифр. Также не понятно какие цифры нужно вводить, | + | В прошлом эксперименте мы уже сделали Wi-Fi RGB-ночник. Это светодиод яркостью и цветом которого можно управлять по Wi-Fi. Его можно использовать в качестве ночника. Но в нем есть один недостаток — нет наглядного выбора цвета. Для установки цвета нам нужно вводить три цифры, три яркости R, G и B. Заранее сложно предсказать какой цвет получится в результате ввода цифр. Также не понятно какие цифры нужно вводить, |
- | Для упрощения выбора цветов в веб- формах есть специальные типы полей ввода. Например есть текстовые поля, есть кнопки, | + | Для упрощения выбора цветов в веб-формах есть специальные типы полей ввода. Например есть текстовые поля, есть кнопки, |
- | Мы устанавливаем яркость светодиода с помошью сигнала ШИМ со значением от 0 до 1023. А в HTML цвет записывается с помощью 6 шестнадцатиричных символов и символа # перед ними. Например | + | Мы устанавливаем яркость светодиода с помощью сигнала ШИМ со значением от 0 до 1023. А в HTML цвет записывается с помощью 6 шестнадцатеричных символов и символа # перед ними. Например |
{{ : | {{ : | ||
- | Первые 2 символа отвечают за красный цвет, вторые два за зеленый и последние за синий цвет. Цвета могут принимать значения от 00 до FF. Это запись в шестнадцатиричной системе счисления чисел от 0 до 255. | + | Первые 2 символа отвечают за красный цвет, вторые два за зеленый и последние за синий цвет. Цвета могут принимать значения от 00 до FF. Это запись в шестнадцатеричной системе счисления чисел от 0 до 255. |
{{ : | {{ : | ||
- | Поэтому нам необходимо конвертировать | + | Поэтому нам необходимо конвертировать |
+ | |||
+ | ==== Схема эксперимента ==== | ||
+ | Схема эксперимента остается без изменений | ||
+ | {{ : | ||
+ | // | ||
+ | |||
+ | ==== Программный код эксперимента ==== | ||
+ | <file html color.html[enable_line_numbers=" | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | <form action="/"> | ||
+ | <input type=" | ||
+ | <input type=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Сохрани эту страницу в корне файловой системы микроконтроллера под именем color.html | ||
+ | </ | ||
+ | |||
+ | Код программы: | ||
+ | <file python Exp63.py[enable_line_numbers=" | ||
+ | from micropyserver import MicroPyServer | ||
+ | import time | ||
+ | from machine import Pin, PWM | ||
+ | import network | ||
+ | import gc | ||
+ | _init() | ||
+ | gc.collect() | ||
+ | |||
+ | LedR = PWM(Pin(13, Pin.OUT)) | ||
+ | LedG = PWM(Pin(14, Pin.OUT)) | ||
+ | LedB = PWM(Pin(15, Pin.OUT)) | ||
+ | |||
+ | wlan_id = " | ||
+ | wlan_pass = " | ||
+ | |||
+ | wlan = network.WLAN(network.STA_IF) | ||
+ | wlan.active(True) | ||
+ | wlan.connect(wlan_id, | ||
+ | time.sleep(2) | ||
+ | |||
+ | while wlan.isconnected() == False: | ||
+ | pass | ||
+ | |||
+ | print(' | ||
+ | |||
+ | |||
+ | def index(request, | ||
+ | html_color = ' | ||
+ | |||
+ | if (' | ||
+ | html_color = params[' | ||
+ | print(html_color) | ||
+ | |||
+ | r = html_color[0: | ||
+ | g = html_color[2: | ||
+ | b = html_color[4: | ||
+ | |||
+ | r = int(r, 16) | ||
+ | g = int(g, 16) | ||
+ | b = int(b, 16) | ||
+ | |||
+ | r = int(r * 1023 / 255) | ||
+ | g = int(g * 1023 / 255) | ||
+ | b = int(b * 1023 / 255) | ||
+ | |||
+ | LedR.duty(1023-r) | ||
+ | LedG.duty(1023-g) | ||
+ | LedB.duty(1023-b) | ||
+ | |||
+ | |||
+ | html_file = open(" | ||
+ | html = html_file.read() | ||
+ | html = html.replace('< | ||
+ | html_file.close() | ||
+ | server.send(html, | ||
+ | |||
+ | |||
+ | LedR.duty(0) | ||
+ | LedG.duty(0) | ||
+ | LedB.duty(0) | ||
+ | |||
+ | |||
+ | server = MicroPyServer() | ||
+ | server.add_route("/", | ||
+ | server.start() | ||
+ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Первым делом в коде программы нужно заменить '' | ||
+ | </ | ||
+ | |||
+ | Рассмотрим алгоритм преобразования цвета. Веб форма отправляет на наш сервер цвет в формате #FFFFFF. При этом символ # трансформируется в код символа %23. Поэтому в программе на Python в '' | ||
+ | <code python[enable_line_numbers=" | ||
+ | html_color = params[' | ||
+ | </ | ||
+ | |||
+ | Теперь в переменной '' | ||
+ | <code python[enable_line_numbers=" | ||
+ | r = html_color[0: | ||
+ | g = html_color[2: | ||
+ | b = html_color[4: | ||
+ | </ | ||
+ | |||
+ | Теперь в переменных r, g и b у нас находятся соответствующие цвета записанные строкой в шестнадцатеричной форме. Их нужно перевести в числа: | ||
+ | |||
+ | <code python[enable_line_numbers=" | ||
+ | r = int(r, 16) | ||
+ | g = int(g, 16) | ||
+ | b = int(b, 16) | ||
+ | </ | ||
+ | |||
+ | Теперь мы получили три числа, которые могут быть от 0 до 255. Нам нужно масштабировать их в диапазон от 0 до 1023. Иначе мы получим лишь четверть от максимальной яркости. | ||
+ | <code python[enable_line_numbers=" | ||
+ | r = int(r * 1023 / 255) | ||
+ | g = int(g * 1023 / 255) | ||
+ | b = int(b * 1023 / 255) | ||
+ | </ | ||
+ | |||
+ | Теперь мы имеем данные для управления ШИМ сигналом светодиода. Остается только не забыть, | ||
+ | <code python[enable_line_numbers=" | ||
+ | LedR.duty(1023-r) | ||
+ | LedG.duty(1023-g) | ||
+ | LedB.duty(1023-b) | ||
+ | </ | ||
+ | |||
+ | При выводе страницы в браузер мы должны заменить метку в шаблоне страницы на актуальный цвет, но в формате HTML. | ||
+ | <code python[enable_line_numbers=" | ||
+ | html = html.replace('< | ||
+ | </ | ||
+ | |||
+ | Вот так это выглядит у нас. Но отображение может быть разным в зависимости от браузера. | ||
+ | {{ : | ||
+ | {{ : | ||
+ | |||
+ | Теперь управлять цветом светодиода легко и наглядно. |