Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp63 [2024/12/06 22:10] – [Эксперимент 63. RGB-ночник] labuser30products:laboratory_iot_c:exp63 [2024/12/06 22:44] (текущий) – [Программный код эксперимента] labuser30
Строка 33: Строка 33:
 </html> </html>
 </file> </file>
- 
-<WRAP center round important 60%> 
-Сохрани эту страницу в корне файловой системы микроконтроллера под именем color.html 
-</WRAP> 
  
 Код программы: Код программы:
Строка 53: Строка 49:
  
 void indexPage() { void indexPage() {
-  String html_color = "4AD686";+  String html_color = "#4AD686";
   if (server.hasArg("color")) html_color = server.arg("color");    if (server.hasArg("color")) html_color = server.arg("color"); 
  
-  long number strtoll(&html_color[1], NULL, 16)+  int duty_r strtol(html_color.substring(1,3).c_str(), NULL, 16); 
-  int duty_r = number >> 16+  int duty_g = strtol(html_color.substring(3,5).c_str(), NULL, 16); 
-  int duty_g = number >> 8 & 0xFF; +  int duty_b = strtol(html_color.substring(5).c_str(), NULL, 16); 
-  int duty_b = number & 0xFF; +  
- +
-  Serial.println(html_color)+
-  Serial.println(duty_r); +
-  Serial.println(duty_g)+
-  Serial.println(duty_b); +
   analogWrite(PIN_LED_R, 255 - duty_r);   analogWrite(PIN_LED_R, 255 - duty_r);
   analogWrite(PIN_LED_G, 255 - duty_g);   analogWrite(PIN_LED_G, 255 - duty_g);
Строка 119: Строка 109:
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-Первым делом в коде программы нужно заменить ''Wi-Fi_Name'' на имя нужной сети, а ''Wi-Fi_Password'' на пароль от нее.+Первым делом в коде программы нужно заменить ''WiFi_Name'' на имя нужной сети, а ''WiFi_Password'' на пароль от нее.
 </WRAP> </WRAP>
  
-Рассмотрим алгоритм преобразования цвета. Веб форма отправляет на наш сервер цвет в формате #FFFFFF. При этом символ # трансформируется в код символа %23. Поэтому в программе на Python в ''params['color']'' будет что-то вроде ''%23c400be''. С помощью оператора извлечение среза мы выбираем нужные нам символы, а именно с 3 по 9. +Рассмотрим алгоритм преобразования цвета. Веб форма отправляет на наш сервер цвет в формате #FFFFFF и получает аналогичный ответ.
-<code python[enable_line_numbers="2", start_line_numbers_at="31"]> +
-        html_color = params['color'][3:9] +
-</code>+
  
-Теперь в переменной ''html_color'' находится цвет в формате ''c400be''. Точно так же "разрезаем" его на 3 части: +<code arduino[enable_line_numbers="2", start_line_numbers_at="14"]> 
-<code python[enable_line_numbers="2", start_line_numbers_at="34"]> +  String html_color "#4AD686"; 
-        html_color[0:2] +  if (server.hasArg("color")) html_color = server.arg("color"); 
-        g = html_color[2:4] +
-        b html_color[4:6]+
 </code> </code>
  
-Теперь в переменных r, g и b у нас находятся соответствующие цвета записанные строкой в шестнадцатеричной форме. Их нужно перевести в числа:+Теперь в переменной ''html_color'' находится цвет в формате ''#FFFFFF''
 +Для получения нужной пары символов используем метод получения подстроки ''substring()'', первый аргумент которого указывает на позицию начала подстроки, а второй — на конец (не включая). Если второй аргумент не указан, то концом подстроки считается конец строки. Полученную подстроку, преобразовав с помощью метода ''c_str()'',  передаем в качестве первого аргумента в специальную функцию ''strtol()'', которая преобразует нашу пару символов в число от 0 до 255. Подробно на работе функции ''strtol()'' и метода ''c_str()'' останавливаться не будем.   
  
-<code python[enable_line_numbers="2", start_line_numbers_at="38"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="17"]> 
-        r = int(r, 16) +  int duty_r = strtol(html_color.substring(1,3).c_str(), NULL, 16); 
-        g = int(g, 16) +  int duty_g = strtol(html_color.substring(3,5).c_str(), NULL, 16); 
-        b = int(b, 16)+  int duty_b = strtol(html_color.substring(5).c_str(), NULL, 16);
 </code> </code>
  
-Теперь мы получили три числа, которые могут быть от 0 до 255Нам нужно масштабировать их в диапазон от 0 до 1023. Иначе мы получим лишь четверть от максимальной яркости. +Теперь мы имеем данные для управления ШИМ сигналом светодиодаОстается только не забыть, что светодиод с общим анодом, поэтому для получения нужного результата наши значения нужно вычесть из 255
-<code python[enable_line_numbers="2", start_line_numbers_at="42"]> +<code python[enable_line_numbers="2", start_line_numbers_at="21"]> 
-        r = int(r * 1023 / 255) +  analogWrite(PIN_LED_R, 255 - duty_r); 
-        g = int(g * 1023 / 255) +  analogWrite(PIN_LED_G, 255 - duty_g); 
-        b = int(b * 1023 / 255)+  analogWrite(PIN_LED_B, 255 - duty_b);
 </code> </code>
  
-Теперь мы имеем данные для управления ШИМ сигналом светодиода. Остается только не забыть, что светодиод с общим анодом, поэтому для получения нужного результата наши значения нужно вычесть из 1023. +При выводе страницы в браузер мы должны заменить метку в шаблоне страницы на актуальный цвет. 
-<code python[enable_line_numbers="2", start_line_numbers_at="46"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="38"]> 
-        LedR.duty(1023-r) +  page.replace("<=VALUE=>", html_color);
-        LedG.duty(1023-g) +
-        LedB.duty(1023-b) +
-</code> +
- +
-При выводе страницы в браузер мы должны заменить метку в шаблоне страницы на актуальный цвет, но в формате HTML+
-<code python[enable_line_numbers="2", start_line_numbers_at="53"]> +
-html = html.replace('<=VALUE=>''#'html_color)+
 </code> </code>