Esp32 подключение к Wi-Fi

Ну вот, наконец-то, дошли мы до той темы, которую, я думаю, многие ждали — это приём и передача данных при помощи возможностей ESP32 по беспроводной сети Wi-Fi.

С данной темой мы уже работали с применением контроллера ESP8266, причём используя различные протоколы передачи данных модели OSI, поэтому нам будет намного легче.

Мы также подробно не будем изучать протокол Wi-Fi, так как с ним работает наш контроллер аппаратно. Также помогает в этом комплект IDF. Режимы работы WiFi контроллера — это станция (или кратко STA) и точка доступа (AP). Также мы можем одновременно использовать четыре виртуальных интерфейса WiFi.

Самым простым из этих режимов является первый — режим станции.

Режим станции (STA) — это такой режим, в котором контроллер не создает собственную сеть, а подключается к любой существующей сети Wi-Fi, например, к существующей локальной сети или к другому устройству, работающему в режиме точки доступа (AP).

На данном уроке мы настроим режим станции и попробуем подключиться к существующей точке доступа, например к роутеру, который раздаёт Wi-Fi по дому. Роутер от просто точки доступа отличается тем, что трафик, идущий от станций, подключенных к нему, он транслирует во внешнюю сеть и наоборот.

Схема у нас будет простейшая — отладочная плата, подключенная к USB компьютера

А проект мы на этот раз создадим новый. Как создавать новый проект, мы знаем из урока 3.

Но тем не менее я этот процесс покажу.

Где-нибудь в районе дерева проекта вызовем контекстное меню (правый щелчок мыши) и выберем пункт New->Espressif IDF Project

Придумаем имя и жмём Finish

Как обычно, мы получим готовый проект с неким кодом в файле main.c.

Также если мы откроем файл Kconfig.projbuild, то мы также там увидим два пункта для конфигурирования имени точки доступа, к которой мы подключаемся, а также для пароля (или ключа) подключения к точке доступа. Выше пункта ESP_WIFI_SSID добавим пункт по настройке светодиода, так как он нам пригодится для сигнализации подключения к точке доступа

Подключение к WiFi и получение точного времени

Раз уж на плате есть WiFi, самое простое что мы можем сделать, это подключиться к существующей WiFi-сети. Это общеизвестно, и работало еще на ESP8266. Однако просто так подключиться и ничего не делать неинтересно, покажем как загрузить точное время по NTP. С помощью нижеприведенного кода нашу плату с ESP несложно превратить в настольные (или для гиков 100lvl наручные:) часы.

Connect ESP32 to WiFi — ESP32 Beginner’s Guide

Код довольно прост, интересно что поддержка NTP уже встроена в стандартные библиотеки, и ничего доустанавливать не нужно. Для работы OLED-экрана нужно установить библиотеку SSD1306.

Переменные ssid и password нужно будет заменить на параметры реальной точки доступа, в остальном, все работает «из коробки».

#include #include #include const char* ssid = «MYWIFI»; const char* password = «12345678»; const char* ntpServer = «pool.ntp.org»; const long gmtOffset_sec = 3600; const int daylightOffset_sec = 3600; // OLED Display 128×64 SSD1306Wire display(0x3c, 5, 4); void setup() < Serial.begin(115200); delay(10); Serial.println(‘n’); WiFi.begin(ssid, password); // Connect to the network while (WiFi.status() != WL_CONNECTED) < // Wait for the Wi-Fi to connect delay(500); Serial.print(‘.’); >Serial.println(‘n’); Serial.println(«Connection established»); Serial.print(«IP address:t»); Serial.println(WiFi.localIP()); // Get the NTP time configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); // OLED display init display.init(); display.clear(); display.setTextAlignment(TEXT_ALIGN_LEFT); display.setFont(ArialMT_Plain_10); display.drawString(0, 0, «Access Point connected»); display.drawString(0, 24, «AP IP address: «); display.drawString(0, 36, WiFi.localIP().toString()); display.display(); delay(1000); > void draw_time(char *msg) < display.clear(); display.setTextAlignment(TEXT_ALIGN_CENTER); display.setFont(ArialMT_Plain_24); display.drawString(display.getWidth()/2, 0, msg); display.display(); Serial.println(msg); >void loop() < struct tm timeinfo; if (getLocalTime( char time_str[16]; strftime(time_str, 16, «%H:%M:%S», draw_time(time_str); >delay(500); >

WiFi точка доступа

Разумеется, мы можем не только подключиться к точке доступа, но и создать свою. В данном примере мы запустим мини веб-сервер, открыть который можно например, со смартфона. Отдельно можно отметить обработку события SYSTEM_EVENT_AP_STACONNECTED, что позволяет узнать, сколько клиентов подключалось к нашей точке доступа.

Фото того, как это работает, показано на КДПВ.

#include #include #include // Access Point credentials const char *ssid = «TEST-123»; const char *password = NULL; // «12345678»; int connections = 0; // Onboard WiFi server WiFiServer server(80); String responseHTML «» «html < font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;>» «» «

ESP32 Web Server

» «

Hello World

» «»; // OLED Display 128×64 SSD1306Wire display(0x3c, 5, 4); void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info) < connections += 1; showConnectionsCount(); >void showConnectionsCount() < char data[32]; sprintf(data, «Connections: %d», connections); draw_message(data); >void setup() < Serial.begin(115200); Serial.println(); Serial.println(«Configuring access point. «); // Start access point WiFi.mode(WIFI_AP); WiFi.softAP(ssid, password); WiFi.onEvent(WiFiStationConnected, SYSTEM_EVENT_AP_STACONNECTED); IPAddress ip_address = WiFi.softAPIP(); //IP Address of our accesspoint // Start web server server.begin(); Serial.print(«AP IP address: «); Serial.println(ip_address); // Oled display display.init(); // Draw info display.clear(); display.setTextAlignment(TEXT_ALIGN_LEFT); display.setFont(ArialMT_Plain_10); display.drawString(0, 0, «Access Point started»); display.drawString(0, 12, ssid); display.drawString(0, 24, «AP IP address: «); display.drawString(0, 36, ip_address.toString()); display.display(); // Total number of connections showConnectionsCount(); >void draw_message(char *msg) < display.setColor(BLACK); display.fillRect(0, 50, display.getWidth(), 12); display.setColor(WHITE); display.drawString(0, 50, msg); display.display(); Serial.println(msg); >void loop() < WiFiClient client = server.available(); // Listen for incoming clients if (client) < // If a new client connects, draw_message(«Client connected»); String currentLine = «»; // make a String to hold incoming data from the client while (client.connected()) < // loop while the client’s connected if (client.available()) < // if there’s bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor if (c == ‘n’) < // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that’s the end of the client HTTP request, so send a response: if (currentLine.length() == 0) < // Send header client.println(«HTTP/1.1 200 OK»); client.println(«Content-type:text/html»); client.println(«Connection: close»); client.println(); // Display the HTML web page client.println(responseHTML); // The HTTP response ends with another blank line client.println(); break; >else < // if we got a newline, then clear currentLine currentLine = «»; >> else if (c != ‘r’) < // if we got anything else but a CR character, currentLine += c; // add it to the end of the currentLine >> > // Close the connection client.stop(); showConnectionsCount(); > >

При запуске программы на экране будет отображено имя точки доступа и IP-адрес. Подключившись со смартфона к точке доступа, можно в браузере набрать IP и увидеть содержимое web-страницы.

Сервер будет работать и без OLED-экрана, в этом случае отладочную информацию можно смотреть с помощью Serial Monitor в Arduino IDE.

Как подключиться к WiFi в ESP32?

Код подключения к WiFi выглядит довольно объемным. Сетевые интерфейсы используют дефолтный цикл событий для оповещения о ходе подключения. Кроме дефолтного цикла событий можно создать свой отдельный.

После запуска соединения мы выполняем подключение к WiFi. Получение IP адреса мы расцениваем как успешное подключение к WiFi. При разрыве соединения с WiFi мы получим событие и попробуем снова подключиться к WiFi, делая определенное количество попыток подключения.

#include «freertos/FreeRTOS.h» #include «driver/gpio.h» #include «esp_log.h» #include «esp_wifi.h» #include «nvs_flash.h» #include «esp_event.h» static const char *TAG = «WiFi»; #define ESP_MAXIMUM_RETRY 5 static int s_retry_num = 0; #define WIFI_SSID «your_wifi_ssid» #define WIFI_PASS «your_wifi_password» static const gpio_num_t LED_PIN = GPIO_NUM_2; static void sta_start_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) ESP_LOGI(TAG, «connect. «); esp_wifi_connect(); > static void sta_disconnected_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) if (s_retry_num ESP_MAXIMUM_RETRY) esp_wifi_connect(); s_retry_num++; ESP_LOGI(TAG, «retry to connect to the AP»); > else // . > ESP_LOGI(TAG, «fail connect»); gpio_set_level(LED_PIN, 0); > static void sta_got_ip_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) ESP_LOGI(TAG, «success connect»); ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data; ESP_LOGI(TAG, «got ip:» IPSTR, IP2STR(ip_info.ip)); s_retry_num = 0; gpio_set_level(LED_PIN, 1); > void wifi_init_sta(void) ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); esp_netif_t *esp_netif = esp_netif_create_default_wifi_sta(); ESP_ERROR_CHECK(esp_netif_set_hostname(esp_netif, «ESP32 Device»)); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init( ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, wifi_config_t wifi_config = .sta = .ssid = WIFI_SSID, .password = WIFI_PASS, .threshold.authmode = WIFI_AUTH_WPA2_PSK, >, >; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, ESP_ERROR_CHECK(esp_wifi_start()); > void app_main(void) // Setup LED gpio_pad_select_gpio(LED_PIN); gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); // Initialize NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); > ESP_ERROR_CHECK(ret); wifi_init_sta(); >

Как настроить точку доступа на ESP32 для веб-сервера

Как настроить точку доступа на ESP32 для веб-сервера

В сетях Wi-Fi микроконтроллер ESP32 может работать и как станция, и как точка доступа, и в обоих режимах одновременно. В этом руководстве мы покажем, как настроить ESP32 в качестве точки доступа с использованием среды программирования Arduino IDE.

Как настроить точку доступа на ESP32 для веб-сервера

В большинстве проектов мы подключали микроконтроллер ESP32 к беспроводному маршрутизатору. При этом появляется доступ к ESP32 через локальную сеть. Тогда маршрутизатор служил точкой доступа, а ESP32 был настроен как станция. А для управления микроконтроллером ESP32 необходимо было подключиться к маршрутизатору (локальной сети).

Как настроить точку доступа на ESP32 для веб-сервера

Но если вы настроите микроконтроллер ESP32 как точку доступа (как в местах общественного беспроводного доступа), вы сможете подключиться к ESP32 с помощью любого устройства с интерфейсом Wi-Fi без необходимости соединения с маршрутизатором.

Простыми словами, когда вы настраиваете ESP32 как точку доступа, вы создаёте свою собственную сеть Wi-Fi, а находящиеся поблизости устройства с интерфейсом Wi-Fi (станции) могут подсоединяться к микроконтроллеру (например, смартфон или компьютер).

Как настроить точку доступа на ESP32 для веб-сервера

Здесь мы покажем, как настроить ESP32 как точку доступа для своего проекта с веб-сервером. В этом случае вам не понадобится подключаться к маршрутизатору для управления микроконтроллером ESP32. Так как ESP32 не подключается далее к более широкой сети (в отличие от маршрутизатора), она называется мягкая точка доступа (soft Access Point).

Установка ESP32 в Arduino IDE

Для среды Arduino IDE существует дополнение, которое позволяет программировать микросхему ESP32 посредством этой среды и её языка программирования.

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

Загрузите приведённый ниже код, чтобы настроить микроконтроллер ESP32 как точку доступа.

WIFI Менеджер для ESP32

Всем привет! Сегодня разберем как написать wifi manager для esp32 с нуля и пользоваться им.

Если вы делали проекты на esp, то рано или поздно вы столкнетесь с проблемой, когда прописанные в скетче константы имени и пароля от wifi сети необходимо заменить, не имея доступа к скетчу. Например, вы сделали проект умной лампы на esp32 и продаете её для домашнего пользования. Чтобы пользователь мог управлять лампой из своей сети он должен указать свои реквизиты wifi. И тут нам на помощь приходит Wifi Manager. Как он работает?

При первом включении, esp раздает точку доступа, с заранее известным именем и паролем. Мы подключаемся к этой точке доступа и попадаем на локальную страничку, где нам предлагают сконфигурировать wifi. Там мы вводим пароль от своей сети и esp перезагрузившись подключается к нашему wifi. Если esp не может найти заданную сеть, то она опять раздает точку доступа. Таким образом мы можем подключать наше умное устройство к любому wifi не изменяя константы непосредственно в скетче.

Итак, перейдем к практике.

Создадим два html файла: index.html и conf.html. Первый будет отображаться после успешного подключения к wifi, а второй будет содержать форму настройки сети.

Хранить эти файлы мы будем в SPIFFS, если вы не знакомы с этой системой, рекомендую прочесть нашу предыдущую статью.

В файл index.html поместите содержимое:

MET ONLINE

Успешно подключено!

Далее файл с формой конфигурации conf.html:

Wi-Fi Manager

ESP32 Wi-Fi Manager

SSID PSK IP Addr Gateway Addr Submit

Сюда вы можете добавить свои поля для доп настройки, например соединения с mqqt-сервером.

Напишем скетч:

Для понимания посмотрим на схему:

Подключаем необходимые библиотеки:

#include #include #include #include #include «SPIFFS.h»

Для хранения имени, пароля, Ip адреса и адреса роутера мы создадим 4 файла в spiffs. И будем записывать в них пришедшие из формы данные.

//Пути файлов const char* ssidPath = «/ssid.txt»; const char* passPath = «/pass.txt»; const char* ipPath = «/ip.txt»; const char* gatewayPath = «/gateway.txt»;

Для хранения данных с формы создадим переменные:

const char* PARAM_INPUT_1 = «ssid»; const char* PARAM_INPUT_2 = «pass»; const char* PARAM_INPUT_3 = «ip»; const char* PARAM_INPUT_4 = «gateway»; String ssid; String pass; String ip; String gateway;
AsyncWebServer server(80); //Инициализируем сервер IPAddress localIP; IPAddress localGateway; IPAddress subnet(255, 255, 0, 0); //Маска
unsigned long previousMillis = 0; const long interval = 10000; //Сколько ждем перед открытием портала const int ledPin = 2; String ledState;

Первоначальная настройка (setup)

void setup() < Serial.begin(115200); //Открываем порт initSPIFFS(); //Инициализируем spiffs pinMode(ledPin, OUTPUT); //Светодиод на выход digitalWrite(ledPin, LOW); //Загружаем в переменные данные из SPIFFS ssid = readFile(SPIFFS, ssidPath); pass = readFile(SPIFFS, passPath); ip = readFile(SPIFFS, ipPath); gateway = readFile (SPIFFS, gatewayPath); //Если есть wifi if(initWiFi()) < // Открываем успешную страницу index.html server.on(«/», HTTP_GET, [](AsyncWebServerRequest *request) < request->send(SPIFFS, «/index.html», «text/html»); >); server.serveStatic(«/», SPIFFS, «/»); server.on(«/bootstrap.min.css», HTTP_GET, [](AsyncWebServerRequest *request)< //Подключаем стили request->send(SPIFFS, «/bootstrap.min.css», «text/css»); >); server.begin(); > //Иначе else < Serial.println(«Setting AP (Access Point)»); //Раздаем точку доступа WiFi.softAP(«ESP-CONNECT», NULL); // Создаем открытую точку доступа с именем ESP-CONNECT IPAddress IP = WiFi.softAPIP(); Serial.print(«AP IP address: «); Serial.println(IP); server.on(«/», HTTP_GET, [](AsyncWebServerRequest *request) < //Запускаем сервер с формой конфигурации request->send(SPIFFS, «/conf.html», «text/html»); >); server.on(«/bootstrap.min.css», HTTP_GET, [](AsyncWebServerRequest *request)< //Подключаем стили request->send(SPIFFS, «/bootstrap.min.css», «text/css»); >); server.serveStatic(«/», SPIFFS, «/»); //Получаем данные из формы, если пришел запрос server.on(«/», HTTP_POST, [](AsyncWebServerRequest *request) < int params = request->params(); for(int i=0;igetParam(i); if(p->isPost())< if (p->name() == PARAM_INPUT_1) < // Получаем имя сети из формы ssid = p->value().c_str(); Serial.print(«SSID set to: «); Serial.println(ssid); // Write file to save value writeFile(SPIFFS, ssidPath, ssid.c_str()); > if (p->name() == PARAM_INPUT_2) < // Получаем пароль из формы pass = p->value().c_str(); Serial.print(«Password set to: «); Serial.println(pass); // Write file to save value writeFile(SPIFFS, passPath, pass.c_str()); > if (p->name() == PARAM_INPUT_3) < // Получаем POST запрос про IP ip = p->value().c_str(); Serial.print(«IP Address set to: «); Serial.println(ip); // Write file to save value writeFile(SPIFFS, ipPath, ip.c_str()); > if (p->name() == PARAM_INPUT_4) < // Получаем POST запрос про Gateway путь gateway = p->value().c_str(); Serial.print(«Gateway set to: «); Serial.println(gateway); // Write file to save value writeFile(SPIFFS, gatewayPath, gateway.c_str()); > > > request->send(200, «text/plain», «Успешно, esp перезагрузиться и получит адрес:» + ip); delay(3000); ESP.restart(); //Перезагружаем esp >); server.begin(); //Запускаем сервер в любом случае > >

Часть loop-а не понадобиться, потому разберем некоторые функции, которые облегчат работу:

String readFile(fs::FS //Чтение файла из spiffs Serial.printf(«Reading file: %srn», path); File file = fs.open(path); if(!file || file.isDirectory())< Serial.println(«- failed to open file for reading»); return String(); >String fileContent; while(file.available()) < fileContent = file.readStringUntil(‘n’); break; >return fileContent; >

Запись файла с константами:

void writeFile(fs::FS //Функция записи файла в spiffs Serial.printf(«Writing file: %srn», path); File file = fs.open(path, FILE_WRITE); if(!file)< Serial.println(«- failed to open file for writing»); return; >if(file.print(message)) < Serial.println(«- file written»); >else < Serial.println(«- frite failed»); >>

Инициализация wifi вынесена в отдельную функцию чтобы, быстро подключаться к данным из spiffs и получать bool true или false.

bool initWiFi() < //Функция инициализации wifi if(ssid==»» || ip==»»)< Serial.println(«Undefined SSID or IP address.»); return false; >WiFi.mode(WIFI_STA); localIP.fromString(ip.c_str()); localGateway.fromString(gateway.c_str()); if (!WiFi.config(localIP, localGateway, subnet)) < Serial.println(«STA Failed to configure»); return false; >WiFi.begin(ssid.c_str(), pass.c_str()); Serial.println(«Connecting to WiFi. «); unsigned long currentMillis = millis(); previousMillis = currentMillis; while(WiFi.status() != WL_CONNECTED) < currentMillis = millis(); if (currentMillis — previousMillis >= interval) < Serial.println(«Failed to connect.»); return false; >> Serial.println(WiFi.localIP()); return true; >

Ну и функция инициализации spiffs:

void initSPIFFS() < if (!SPIFFS.begin(true)) < Serial.println(«An error has occurred while mounting SPIFFS»); >Serial.println(«SPIFFS mounted successfully»); >

Скачать полный скетч и файлы можно тут.

Видео с демонстрацией работы:

На этом сегодня все, всем спасибо за внимание! Теперь вы знаете как усовершенствовать свое умное устройство на базе esp32. Удачи в проектах!

Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.

Необходимые материалы и инструменты

В процессе работы над проектом подключения DFPlayer Mini к ESP32 и его управления через Wi-Fi, вам потребуются определенные материалы и инструменты. Их конкретный перечень будет зависеть от специфики вашей системы, однако ниже представлен общий список, который может оказаться полезным.

  • ESP32
  • DFPlayer Mini
  • microSD карта
  • Питание: подходящий источник питания для модулей. 5В 0.5А вполне хватает, но лучше все же 1А
  • Провода: для подключения компонентов между собой.
  • Динамик 3Вт 4Ом
  • Паяльник и припой: для подключения проводов к модулям и их закрепления.
  • Программное обеспечение: Arduino IDE версии 1.8.x Или 2.х для программирования ESP32 и создания веб-интерфейса.

Схема подключения

Соедините компоненты по схеме:

scheme

  • DFPlayer RX -> ESP32 gpio16(TX2)
  • DFPlayer TX -> ESP32 gpio17(RX2)
  • DFPlayer VCC -> ESP32 3V3
  • DFPlayer GND -> ESP32 GND
  • DFPlayer SPK1 ->Динамик +
  • DFPlayer SPK2 -> Динамик —
  • ESP32 VIN -> Источник питания 5В +
  • ESP32 GND -> Источник питания 5В —

WIFI Менеджер для ESP32

Всем привет! Сегодня разберем как написать wifi manager для esp32 с нуля и пользоваться им.

Если вы делали проекты на esp, то рано или поздно вы столкнетесь с проблемой, когда прописанные в скетче константы имени и пароля от wifi сети необходимо заменить, не имея доступа к скетчу. Например, вы сделали проект умной лампы на esp32 и продаете её для домашнего пользования. Чтобы пользователь мог управлять лампой из своей сети он должен указать свои реквизиты wifi. И тут нам на помощь приходит Wifi Manager. Как он работает?

При первом включении, esp раздает точку доступа, с заранее известным именем и паролем. Мы подключаемся к этой точке доступа и попадаем на локальную страничку, где нам предлагают сконфигурировать wifi. Там мы вводим пароль от своей сети и esp перезагрузившись подключается к нашему wifi. Если esp не может найти заданную сеть, то она опять раздает точку доступа. Таким образом мы можем подключать наше умное устройство к любому wifi не изменяя константы непосредственно в скетче.

Итак, перейдем к практике.

Создадим два html файла: index.html и conf.html. Первый будет отображаться после успешного подключения к wifi, а второй будет содержать форму настройки сети.

Хранить эти файлы мы будем в SPIFFS, если вы не знакомы с этой системой, рекомендую прочесть нашу предыдущую статью.

В файл index.html поместите содержимое:

MET ONLINE

Успешно подключено!

Далее файл с формой конфигурации conf.html:

Wi-Fi Manager

ESP32 Wi-Fi Manager

SSID PSK IP Addr Gateway Addr Submit

Сюда вы можете добавить свои поля для доп настройки, например соединения с mqqt-сервером.

Напишем скетч:

Для понимания посмотрим на схему:

Подключаем необходимые библиотеки:

#include #include #include #include #include «SPIFFS.h»

Для хранения имени, пароля, Ip адреса и адреса роутера мы создадим 4 файла в spiffs. И будем записывать в них пришедшие из формы данные.

//Пути файлов const char* ssidPath = «/ssid.txt»; const char* passPath = «/pass.txt»; const char* ipPath = «/ip.txt»; const char* gatewayPath = «/gateway.txt»;

Для хранения данных с формы создадим переменные:

const char* PARAM_INPUT_1 = «ssid»; const char* PARAM_INPUT_2 = «pass»; const char* PARAM_INPUT_3 = «ip»; const char* PARAM_INPUT_4 = «gateway»; String ssid; String pass; String ip; String gateway;
AsyncWebServer server(80); //Инициализируем сервер IPAddress localIP; IPAddress localGateway; IPAddress subnet(255, 255, 0, 0); //Маска
unsigned long previousMillis = 0; const long interval = 10000; //Сколько ждем перед открытием портала const int ledPin = 2; String ledState;

Первоначальная настройка (setup)

void setup() < Serial.begin(115200); //Открываем порт initSPIFFS(); //Инициализируем spiffs pinMode(ledPin, OUTPUT); //Светодиод на выход digitalWrite(ledPin, LOW); //Загружаем в переменные данные из SPIFFS ssid = readFile(SPIFFS, ssidPath); pass = readFile(SPIFFS, passPath); ip = readFile(SPIFFS, ipPath); gateway = readFile (SPIFFS, gatewayPath); //Если есть wifi if(initWiFi()) < // Открываем успешную страницу index.html server.on(«/», HTTP_GET, [](AsyncWebServerRequest *request) < request->send(SPIFFS, «/index.html», «text/html»); >); server.serveStatic(«/», SPIFFS, «/»); server.on(«/bootstrap.min.css», HTTP_GET, [](AsyncWebServerRequest *request)< //Подключаем стили request->send(SPIFFS, «/bootstrap.min.css», «text/css»); >); server.begin(); > //Иначе else < Serial.println(«Setting AP (Access Point)»); //Раздаем точку доступа WiFi.softAP(«ESP-CONNECT», NULL); // Создаем открытую точку доступа с именем ESP-CONNECT IPAddress IP = WiFi.softAPIP(); Serial.print(«AP IP address: «); Serial.println(IP); server.on(«/», HTTP_GET, [](AsyncWebServerRequest *request) < //Запускаем сервер с формой конфигурации request->send(SPIFFS, «/conf.html», «text/html»); >); server.on(«/bootstrap.min.css», HTTP_GET, [](AsyncWebServerRequest *request)< //Подключаем стили request->send(SPIFFS, «/bootstrap.min.css», «text/css»); >); server.serveStatic(«/», SPIFFS, «/»); //Получаем данные из формы, если пришел запрос server.on(«/», HTTP_POST, [](AsyncWebServerRequest *request) < int params = request->params(); for(int i=0;igetParam(i); if(p->isPost())< if (p->name() == PARAM_INPUT_1) < // Получаем имя сети из формы ssid = p->value().c_str(); Serial.print(«SSID set to: «); Serial.println(ssid); // Write file to save value writeFile(SPIFFS, ssidPath, ssid.c_str()); > if (p->name() == PARAM_INPUT_2) < // Получаем пароль из формы pass = p->value().c_str(); Serial.print(«Password set to: «); Serial.println(pass); // Write file to save value writeFile(SPIFFS, passPath, pass.c_str()); > if (p->name() == PARAM_INPUT_3) < // Получаем POST запрос про IP ip = p->value().c_str(); Serial.print(«IP Address set to: «); Serial.println(ip); // Write file to save value writeFile(SPIFFS, ipPath, ip.c_str()); > if (p->name() == PARAM_INPUT_4) < // Получаем POST запрос про Gateway путь gateway = p->value().c_str(); Serial.print(«Gateway set to: «); Serial.println(gateway); // Write file to save value writeFile(SPIFFS, gatewayPath, gateway.c_str()); > > > request->send(200, «text/plain», «Успешно, esp перезагрузиться и получит адрес:» + ip); delay(3000); ESP.restart(); //Перезагружаем esp >); server.begin(); //Запускаем сервер в любом случае > >

Часть loop-а не понадобиться, потому разберем некоторые функции, которые облегчат работу:

String readFile(fs::FS //Чтение файла из spiffs Serial.printf(«Reading file: %srn», path); File file = fs.open(path); if(!file || file.isDirectory())< Serial.println(«- failed to open file for reading»); return String(); >String fileContent; while(file.available()) < fileContent = file.readStringUntil(‘n’); break; >return fileContent; >

Запись файла с константами:

void writeFile(fs::FS //Функция записи файла в spiffs Serial.printf(«Writing file: %srn», path); File file = fs.open(path, FILE_WRITE); if(!file)< Serial.println(«- failed to open file for writing»); return; >if(file.print(message)) < Serial.println(«- file written»); >else < Serial.println(«- frite failed»); >>

Инициализация wifi вынесена в отдельную функцию чтобы, быстро подключаться к данным из spiffs и получать bool true или false.

bool initWiFi() < //Функция инициализации wifi if(ssid==»» || ip==»»)< Serial.println(«Undefined SSID or IP address.»); return false; >WiFi.mode(WIFI_STA); localIP.fromString(ip.c_str()); localGateway.fromString(gateway.c_str()); if (!WiFi.config(localIP, localGateway, subnet)) < Serial.println(«STA Failed to configure»); return false; >WiFi.begin(ssid.c_str(), pass.c_str()); Serial.println(«Connecting to WiFi. «); unsigned long currentMillis = millis(); previousMillis = currentMillis; while(WiFi.status() != WL_CONNECTED) < currentMillis = millis(); if (currentMillis — previousMillis >= interval) < Serial.println(«Failed to connect.»); return false; >> Serial.println(WiFi.localIP()); return true; >

Ну и функция инициализации spiffs:

void initSPIFFS() < if (!SPIFFS.begin(true)) < Serial.println(«An error has occurred while mounting SPIFFS»); >Serial.println(«SPIFFS mounted successfully»); >

Скачать полный скетч и файлы можно тут.

Видео с демонстрацией работы:

На этом сегодня все, всем спасибо за внимание! Теперь вы знаете как усовершенствовать свое умное устройство на базе esp32. Удачи в проектах!

Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.

Оцените статью
TutShema
Добавить комментарий