Эксперимент 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.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. Led = Pin(13, Pin.OUT)
  10. pwmLed = PWM(Led)
  11.  
  12. wlan_id = "Wi-Fi_Name"
  13. wlan_pass = "Wi-Fi_Password"
  14.  
  15. wlan = network.WLAN(network.STA_IF)
  16. wlan.active(True)
  17. wlan.connect(wlan_id, wlan_pass)
  18. time.sleep(1)
  19.  
  20. while wlan.isconnected() == False:
  21. pass
  22.  
  23. print('Device IP:', wlan.ifconfig()[0])
  24.  
  25.  
  26. def index(request, params):
  27. ''' request handler '''
  28. if ('duty' in params):
  29. pwmLed.duty(int(params['duty']))
  30. server.send("Duty is: " + params['duty'])
  31. else:
  32. server.send("No Duty param")
  33.  
  34.  
  35.  
  36. server = MicroPyServer()
  37. ''' add request handler '''
  38. server.add_route("/", index)
  39.  
  40. ''' start server '''
  41. server.start()

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

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

  1. server.add_route("/", index)

Функция index принимает 2 параметра request и param. В param находятся параметры, переданные серверу в запросе клиента. Сначала мы проверяем наличие параметра duty

  1. if ('duty' in params):

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

  1. pwmLed.duty(int(params['duty']))
  2. server.send("Duty is: " + params['duty'])

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

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