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

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

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

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

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

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

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

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

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

Сохрани эту страницу в корне файловой системы микроконтроллера под именем rgb_page.html

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

Exp62.py
  1. from micropyserver import MicroPyServer
  2. import time
  3. from machine import Pin, PWM
  4. import network
  5. import gc
  6. _init()
  7. gc.collect()
  8.  
  9. LedR = PWM(Pin(13, Pin.OUT))
  10. LedG = PWM(Pin(14, Pin.OUT))
  11. LedB = PWM(Pin(15, Pin.OUT))
  12.  
  13. wlan_id = "Wi-Fi_Name"
  14. wlan_pass = "Wi-Fi_Password"
  15.  
  16. wlan = network.WLAN(network.STA_IF)
  17. wlan.active(True)
  18. wlan.connect(wlan_id, wlan_pass)
  19. time.sleep(1)
  20.  
  21. while wlan.isconnected() == False:
  22. pass
  23.  
  24. print('Device IP:', wlan.ifconfig()[0])
  25.  
  26.  
  27. def index(request, params):
  28. duty_r = '512'
  29. duty_g = '512'
  30. duty_b = '512'
  31.  
  32. if ('r' in params):
  33. duty_r = params['r']
  34. LedR.duty(1023 - int(duty_r))
  35.  
  36. if ('g' in params):
  37. duty_g = params['g']
  38. LedG.duty(1023 - int(duty_g))
  39.  
  40. if ('b' in params):
  41. duty_b = params['b']
  42. LedB.duty(1023 - int(duty_b))
  43.  
  44.  
  45. html_file = open("rgb_page.html")
  46. html = html_file.read()
  47.  
  48. html = html.replace('<=VALUE=R=>', duty_r)
  49. html = html.replace('<=VALUE=G=>', duty_g)
  50. html = html.replace('<=VALUE=B=>', duty_b)
  51.  
  52. html_file.close()
  53. server.send(html, content_type="Content-Type: text/html")
  54.  
  55.  
  56. LedR.duty(0)
  57. LedG.duty(0)
  58. LedB.duty(0)
  59.  
  60.  
  61. server = MicroPyServer()
  62. server.add_route("/", index)
  63. server.start()

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

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