Эксперимент 64. Режим точки доступа

В прошлом эксперименте мы сделали полноценный цветной ночник. Он подключается к существующей сети Wi-Fi, и пользователь тоже подключается к той же сети для управления. В такой схеме подключения задействованы три устройства: сам ночник, Wi-Fi роутер и устройство клиента (смартфон или компьютер).

Но наша плата может работать сама в режиме точки доступа. В таком случае можно установить соединение между платой и клиентским устройством (смартфоном или ноутбуком) напрямую. Для этого нужно настроить микроконтроллер на работу в режиме точки доступа.

 

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

Exp64.ino
  1. #include <ESP8266WiFi.h>
  2. #include <ESP8266WebServer.h>
  3.  
  4. #define AP_NAME "RGB_light"
  5. #define AP_PASSWORD "12345678"
  6.  
  7. #define PIN_LED_R 13
  8. #define PIN_LED_G 14
  9. #define PIN_LED_B 15
  10.  
  11. ESP8266WebServer server(80);
  12.  
  13. void indexPage() {
  14. String html_color = "#4AD686";
  15. if (server.hasArg("color")) html_color = server.arg("color");
  16.  
  17. int duty_r = strtol(html_color.substring(1,3).c_str(), NULL, 16);
  18. int duty_g = strtol(html_color.substring(3,5).c_str(), NULL, 16);
  19. int duty_b = strtol(html_color.substring(5).c_str(), NULL, 16);
  20.  
  21. analogWrite(PIN_LED_R, 255 - duty_r);
  22. analogWrite(PIN_LED_G, 255 - duty_g);
  23. analogWrite(PIN_LED_B, 255 - duty_b);
  24.  
  25. String page = "<!DOCTYPE html>";
  26. page += "<html>";
  27. page += "<head>";
  28. page += "</head>";
  29. page += "<body>";
  30. page += "<h3>Select color:</h3>";
  31. page += R"(<form action="/">)";
  32. page += R"(<input type="color" style="height:50px;width:50%;" value="<=VALUE=>" name="color">)";
  33. page += R"(<input type="submit" value="Send">)";
  34. page += "</form>";
  35. page += "</body>";
  36. page += "</html>";
  37.  
  38. page.replace("<=VALUE=>", html_color);
  39. server.send(200, "text/html", page);
  40. }
  41.  
  42. void setup() {
  43. Serial.begin(9600);
  44. Serial.println();
  45. pinMode(PIN_LED_R, OUTPUT);
  46. pinMode(PIN_LED_G, OUTPUT);
  47. pinMode(PIN_LED_B, OUTPUT);
  48. analogWriteRange(256);
  49. analogWrite(PIN_LED_R, 255);
  50. analogWrite(PIN_LED_G, 255);
  51. analogWrite(PIN_LED_B, 255);
  52.  
  53. WiFi.mode(WIFI_AP);
  54. WiFi.softAP(AP_NAME, AP_PASSWORD);
  55. IPAddress IP = WiFi.softAPIP();
  56. Serial.print("AP set IP address: ");
  57. Serial.println(IP);
  58.  
  59. server.on("/", indexPage);
  60. server.begin();
  61. }
  62. void loop() {
  63. server.handleClient();
  64. }

Переключаем WiFi в режим точки доступа:

  1. WiFi.mode(WIFI_AP);

Настраиваем свойства точки доступа, а именно устанавливаем имя сети и пароль:

  1. WiFi.softAP(AP_NAME, AP_PASSWORD);

Получаем IP адрес и печатаем его в последовательный порт:

  1. IPAddress IP = WiFi.softAPIP();
  2. Serial.print("AP set IP address: ");
  3. Serial.println(IP);

Других принципиальных отличий программы от программы из предыдущего эксперимента нет.

После запуска программы видим нашу сеть среди списка доступных на смартфоне или на ноутбуке

Необходимо подключиться к нашей точке доступа. Сообщение об отсутствии интернета — нормально. Ведь откуда ему взяться в нашей сети? Ведь сейчас микроконтроллер не подключен к сети, в которой есть интернет. Сейчас он сам точка доступа. Однако отсутствие интернета никак не помешает подключиться к нашему веб-серверу и управлять светодиодом как раньше, ведь интернет для этого не нужен. Обмен данными происходит внутри локальной сети, образованной микроконтроллером и клиентским устройством.

После установки соединения в терминал будет выведен IP адрес, который принадлежит микроконтроллеру. В нашем случае это 192.168.4.1. Именно этот адрес и нужно теперь вводить в адресную строку браузера. Адрес из прошлого эксперимента уже не подойдет, ведь теперь у нас совсем другая сеть.