Найти тему

WEB server DHT22 без АРДУИНО

  • Цель опробовать материал предоставленный из интернета и если надо доработать. исходник тут

влажность можно оценить. Влажность можно применить.

и подвал у вас зачем? крыша есть? балкон? теплица?

Зная влажность и тепло, освещенность , а С и О

можно творчество наладить - посадить, взрастить, истратить,

ну хранить конечно тоже , зная влажность можно тоже.

Датчик влажности бывает , DHT22 всем помогает.

ИТАК у нас есть 👌 цель вывести информацию на экран ПК не в виде перелистывания оповещения с монитора USB через утилиту HERCULES
и подобные о состояния esp32, а по-человечески как страницу сайта и на
телефон и на ПК через WIFI. 😜

Этому подтверждение имеем исходный код взятый от сюда и ещё тут.

  • Ресурсы можно оценить из от сюда и ещё тут.
схема  esp32
схема esp32
Схема  esp32 c3  или  esp32 s3 micro
Схема esp32 c3 или esp32 s3 micro

Ничего сложного не .

схема  esp32 s3
схема esp32 s3

Начинаем как обычно

три пункта важны
три пункта важны

далее ждём и создадим новый проект.

такой вариант есть
такой вариант есть

четыре пункта выполнять не сложно?

назовем проект и  два пункта
назовем проект и два пункта

Два пункта выполнить?

В mail.c вводим код ниже - это код без DHT22 . но посмотрим как картинка

ниже выпрыгивает на экране? = сеанс идёт по web serwer))😎

#include <stdio.h>
#include <stdlib.h>
#include <string.h> //Requires by memset
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include <esp_http_server.h>
#include "esp_wifi.h"
#include "esp_event.h"
#include "freertos/event_groups.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_netif.h"
#include "driver/gpio.h"
#include <lwip/sockets.h>
#include <lwip/sys.h>
#include <lwip/api.h>
#include <lwip/netdb.h>
#include "soc/gpio_num.h"
#define ESP_WIFI_SSID "q" ///укажите имя точки доступа
#define ESP_WIFI_PASSWORD "Xaa43405" //укажите свой пароль
#define ESP_MAXIMUM_RETRY 5
static EventGroupHandle_t s_wifi_event_group;
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1
static const char *TAG = "example";
static int s_retry_num = 0;
int wifi_connect_status = 0;
float temperature;
float TempC;
float TempF;
char html_page[] = "<!DOCTYPE HTML><html>\n"
"<head>\n"
" <title>ESP-IDF DhT22 Web Server</title>\n"
" <meta http-equiv=\"refresh\" content=\"10\">\n"
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"
" <link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.7.2/css/all.css\" integrity=\"sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr\" crossorigin=\"anonymous\">\n"
" <link rel=\"icon\" href=\"data:,\">\n"
" <style>\n"
" html {font-family: Arial; display: inline-block; text-align: center;}\n"
" p { font-size: 1.2rem;}\n"
" body { margin: 0;}\n"
" .topnav { overflow: hidden; background-color: #7c0e61; color: white; font-size: 1.7rem; }\n"
" .content { padding: 20px; }\n"
" .card { background-color: white; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); }\n"
" .cards { max-width: 700px; margin: 0 auto; display: grid; grid-gap: 2rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }\n"
" .reading { font-size: 2.8rem; }\n"
" .card.temperatureC { color: #0e7c7b; }\n"
" .card.temperatureF { color: #7c200e; }\n"
" </style>\n"
"</head>\n"
"<body>\n"
" <div class=\"topnav\">\n"
" <h3>ESP-IDF DHT22 WEB SERVER</h3>\n"
" </div>\n"
" <div class=\"content\">\n"
" <div class=\"cards\">\n"
" <div class=\"card temperatureC\">\n"
" <h4><i class=\"fas fa-thermometer-half\"></i> TEMPERATURE</h4><p><span class=\"reading\">%.2f&deg;C</span></p>\n"
" </div>\n"
" <div class=\"card temperatureF\">\n"
" <h4><i class=\"fas fa-thermometer-half\"></i> TEMPERATURE</h4><p><span class=\"reading\">%.2f&deg;F</span></p>\n"
" </div>\n"
" </div>\n"
" </div>\n"
"</body>\n"
"</html>";
void DHT22_readings()
{
//TempC =temperature; // DHT22_get_temp();
// TempF = TempC*9/5 + 32;
}//////////////////////////////////
static void event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data)
{ if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START)
{ esp_wifi_connect(); }
else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED)
{ if (s_retry_num < ESP_MAXIMUM_RETRY)
{ esp_wifi_connect(); s_retry_num++; printf( "retry to connect to the AP");
} else
{ xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);}
wifi_connect_status = 0; printf( "connect to the AP fail");
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP)
{ ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
printf( "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
s_retry_num = 0;
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
wifi_connect_status = 1;
}
}//////////////////////////////////
void connect_wifi(void)
{ s_wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
esp_event_handler_instance_t instance_any_id;
esp_event_handler_instance_t instance_got_ip;
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&event_handler,
NULL,
&instance_any_id));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&event_handler,
NULL,
&instance_got_ip));
wifi_config_t wifi_config = {
.sta = {
.ssid = ESP_WIFI_SSID,
.password = ESP_WIFI_PASSWORD,
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
printf( "wifi_init_sta finished.");
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY);
if (bits & WIFI_CONNECTED_BIT)
{ printf( "connected to ap SSID:%s password:%s",
ESP_WIFI_SSID, ESP_WIFI_PASSWORD);
} else if (bits & WIFI_FAIL_BIT)
{ printf( "Failed to connect to SSID:%s, password:%s",
ESP_WIFI_SSID, ESP_WIFI_PASSWORD);
}
else
{ printf( "UNEXPECTED EVENT");
} vEventGroupDelete(s_wifi_event_group);
} //////////////////////////////////
esp_err_t send_web_page(httpd_req_t *req)
{ int response;
DHT22_readings();
char response_data[sizeof(html_page) + 50];
memset(response_data, 0, sizeof(response_data));
sprintf(response_data, html_page, TempC, TempF);
response = httpd_resp_send(req, response_data, HTTPD_RESP_USE_STRLEN);
return response;
} //////////////////////////////////
esp_err_t get_req_handler(httpd_req_t *req)
{ return send_web_page(req);}
httpd_uri_t uri_get = {
.uri = "/",
.method = HTTP_GET,
.handler = get_req_handler,
.user_ctx = NULL};
httpd_handle_t setup_server(void)
{ httpd_config_t config = HTTPD_DEFAULT_CONFIG();
httpd_handle_t server = NULL;
if (httpd_start(&server, &config) == ESP_OK)
{ httpd_register_uri_handler(server, &uri_get); }
return server;
}//////////////////////////////////
void app_main()
{ 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); printf( "ESP_WIFI_MODE_STA"); connect_wifi();
if (wifi_connect_status)
{ setup_server(); printf( "Web Server is up and running\n"); }
else
printf( "Failed to connected with Wi-Fi, check your network Credentials\n");
}

🙄вводим код в mail.c и шесть пунктов же

пункты есть.
пункты есть.

шесть пунктов выполняем? [раздел 1]

запустим сканер сети и увидим адреса

последний похоже наш
последний похоже наш

далее смотрим и в броузере выведя адрес 10.0.0.4 или 10.0.0.6 😃 [раздел 2]

ж
ж

красным - это код надо доработать, а синим значит исправить вывески)))🎃

Сеанс web сервера через wifi работает. [раздел 3]

Активируем stkconfig)) Кстати пробовал без активации прокатывало иногда.

галочку
галочку

на вся к случай галочку ниже так же

далее галочку
далее галочку

ниже так же)))

далее галочку
далее галочку

ниже также))

нужные параметры
нужные параметры

ниже так же)))

нужные параметры
нужные параметры

Не забудьте сохранить)))🤑

Доработанный код DHT22.h ниже как создать файл и вставить в программу и вписать код можно посмотреть в DHT22 в умный дом без АРДУИНО

#ifndef DHT22_H_
#define DHT22_H_
#include "soc/gpio_num.h"
#define DHT_OK 0
#define DHT_CHECKSUM_ERROR -1
#define DHT_TIMEOUT_ERROR -2
// == function prototypes =====================
void setDHTgpio(gpio_num_t gpio);
void errorHandler(int response);
int readDHT();
float getHumidity();
float getTemperature();
int getSignalLevel( int usTimeOut, bool state );
#endif

Доработанный код DHT22.с ниже как создать файл и вставить в программу и вписать код можно посмотреть в DHT22 в умный дом без АРДУИНО

#include "soc/gpio_num.h"
#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
#include <stdio.h>
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "driver/gpio.h"
#include "DHT22.h"
// == global defines =======
static const char* TAG = "DHT";
gpio_num_t DHTgpio = GPIO_NUM_4;// my default DHT pin = 4
float humidity = 0.;
float temperature = 0.;
// == set the DHT used pin====
void setDHTgpio( gpio_num_t gpio )
{ DHTgpio = gpio;}
// == get temp & hum =======
float getHumidity() { return humidity; }
float getTemperature() { return temperature; }
// == error handler ==========================
void errorHandler(int response)
{switch(response) {
case DHT_TIMEOUT_ERROR :
ESP_LOGE( TAG, "Sensor Timeout\n" ); break;
case DHT_CHECKSUM_ERROR:
ESP_LOGE( TAG, "CheckSum error\n" );break;
case DHT_OK:break;
default : ESP_LOGE( TAG, "Unknown error\n" );
}
}/////////
int getSignalLevel( int usTimeOut, bool state )
{ int uSec = 0;
while( gpio_get_level(DHTgpio)==state )
{ if( uSec > usTimeOut ) return -1; ++uSec;
//ets_delay_us(1); // uSec delay
// vTaskDelay(1/portTICK_PERIOD_MS);
esp_rom_delay_us(1); //замена на выше неудачное
} return uSec;
}////////////////////////
#define MAXdhtData 5 // to complete 40 = 5*8 Bits
int readDHT()
{ int uSec = 0; uint8_t dhtData[MAXdhtData];
uint8_t byteInx = 0; uint8_t bitInx = 7;
for (int k = 0; k<MAXdhtData; k++)
dhtData[k] = 0;
// == Send start signal to DHT sensor ===========
gpio_set_direction( DHTgpio, GPIO_MODE_OUTPUT );
// pull down for 3 ms for a smooth and nice wake up
gpio_set_level( DHTgpio, 0 );
//ets_delay_us( 3000 );
//vTaskDelay (3000/portTICK_PERIOD_MS);
esp_rom_delay_us(3000); ///замена выше неудачного
// pull up for 25 us for a gentile asking for data
gpio_set_level( DHTgpio, 1 );
//ets_delay_us( 25 );
//vTaskDelay(25/portTICK_PERIOD_MS);
esp_rom_delay_us(25); ///замена выше неудачного
gpio_set_direction( DHTgpio, GPIO_MODE_INPUT );
// == DHT will keep the line low for 80 us and then high for 80us ====
uSec = getSignalLevel( 85, 0 );
// ESP_LOGI( TAG, "Response = %d", uSec );
if( uSec<0 ) return DHT_TIMEOUT_ERROR;
// -- 80us up ------------------------
uSec = getSignalLevel( 85, 1 );
// ESP_LOGI( TAG, "Response = %d", uSec );
if( uSec<0 ) return DHT_TIMEOUT_ERROR;
// == No errors, read the 40 data bits ================
for( int k = 0; k < 40; k++ )
{ uSec = getSignalLevel( 56, 0 );
if( uSec<0 ) return DHT_TIMEOUT_ERROR;
uSec = getSignalLevel( 75, 1 );
if( uSec<0 ) return DHT_TIMEOUT_ERROR;
if (uSec > 40) {dhtData[ byteInx ] |= (1 << bitInx);}
if (bitInx == 0) { bitInx = 7; ++byteInx; }
else bitInx--;
}
humidity = dhtData[0]; humidity *= 0x100;
humidity += dhtData[1]; humidity /= 10;
temperature = dhtData[2] & 0x7F;
temperature *= 0x100; temperature += dhtData[3];
temperature /= 10;
if( dhtData[2] & 0x80 ) temperature *= -1;
if (dhtData[4] == ((dhtData[0] + dhtData[1] + dhtData[2] + dhtData[3]) & 0xFF))
return DHT_OK; else return DHT_CHECKSUM_ERROR;
}//////////////////////////
  • Целые выходные бился над кодом main.c и который выше лучше заменить на который ниже. Из за одной ошибки.🙄 Ардуинщики хихикают? Есть кикбоксинг лайф контакт и есть фул контакт))) ТАК ардуино для меня это лайф контакт)))😁 Бейсик? Кстати кто на кейле или там stm32cube ide то есть круче и это AT32 ide.
  • Кстати работал на фокспро = foxpro и если кто считает , что ардуино это тоже самое, то да, но там другие задачи и другие сроки и порча данных - это проблема большая.

Итак перепишем = на ниже код в main.c практически одо и тоже, но библиотеки по убирал и переставил и заменил немного. Кто в с++ разбирается поймёт , что и почему.

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
//#include "esp_system.h"
//#include "rom/ets_sys.h"
#include "nvs_flash.h"
#include "driver/gpio.h"
//#include <stdlib.h>
//#include <string.h> //Requires by memset
//#include "esp_spi_flash.h"
#include <esp_http_server.h>
#include "esp_wifi.h"
//#include "esp_event.h"
//#include "freertos/event_groups.h"
//#include "esp_log.h"
//#include "esp_netif.h"
//#include <lwip/sockets.h>
//#include <lwip/sys.h>
//#include <lwip/api.h>
//#include <lwip/netdb.h>
//#include "soc/gpio_num.h"
#include "sdkconfig.h"
#include "DHT22.h"
#include "soc/gpio_num.h" ////нннннн////работает
#define ESP_WIFI_SSID "q"
#define ESP_WIFI_PASSWORD "$Xaa43405"
#define ESP_MAXIMUM_RETRY 5
//const int DS_PIN = 4;
//static const char *TAG = "esp32 webserver";
/* FreeRTOS event group to signal when we are connected*/
static EventGroupHandle_t s_wifi_event_group;
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1
static const char *TAG = "example";
static int s_retry_num = 0;
int wifi_connect_status = 0;
//float temperature;
//esp_err_t search_result = ESP_OK;
float TempC;
float TempF;
char html_page[] = "<!DOCTYPE HTML><html>\n"
"<head>\n"
" <title>ESP-IDF DHT Web Server</title>\n"
" <meta http-equiv=\"refresh\" content=\"10\">\n"
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"
" <link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.7.2/css/all.css\" integrity=\"sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr\" crossorigin=\"anonymous\">\n"
" <link rel=\"icon\" href=\"data:,\">\n"
" <style>\n"
" html {font-family: Arial; display: inline-block; text-align: center;}\n"
" p { font-size: 1.2rem;}\n"
" body { margin: 0;}\n"
" .topnav { overflow: hidden; background-color: #7c0e61; color: white; font-size: 1.7rem; }\n"
" .content { padding: 20px; }\n"
" .card { background-color: white; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); }\n"
" .cards { max-width: 700px; margin: 0 auto; display: grid; grid-gap: 2rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }\n"
" .reading { font-size: 2.8rem; }\n"
" .card.temperatureC { color: #0e7c7b; }\n"
" .card.temperatureF { color: #7c200e; }\n"
" </style>\n"
"</head>\n"
"<body>\n"
" <div class=\"topnav\">\n"
" <h3>ESP-IDF DHT22 WEB SERVER</h3>\n"
" </div>\n"
" <div class=\"content\">\n"
" <div class=\"cards\">\n"
" <div class=\"card temperatureC\">\n"
" <h4><i class=\"fas fa-thermometer-half\"></i> humidity </h4><p><span class=\"reading\">%.2f&deg; %</span></p>\n"
" </div>\n"
" <div class=\"card temperatureF\">\n"
" <h4><i class=\"fas fa-thermometer-half\"></i> TEMPERATURE</h4><p><span class=\"reading\">%.2f&deg; C</span></p>\n"
" </div>\n"
" </div>\n"
" </div>\n"
"</body>\n"
"</html>";
void DHT_reader_task(void *pvParameter)
{ setDHTgpio(GPIO_NUM_4);
//ets_update_cpu_frequency_rom(ets_get_detected_xtal_freq() / 1000000);
while(1)
{ printf("DHT Sensor Readings\n" );
int ret = readDHT();
errorHandler(ret);
printf("Humidity %.2f %%\n", getHumidity());
printf("Temperature %.2f degC\n\n", getTemperature());
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}//////////////////////////////////
void DHT22_readings()
{ TempC =getHumidity(); //
TempF = getTemperature();//*9/5 + 32;
}//////////////////////////////////
static void event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data)
{ if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START)
{ esp_wifi_connect(); }
else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED)
{ if (s_retry_num < ESP_MAXIMUM_RETRY)
{ esp_wifi_connect(); s_retry_num++;
printf( "retry to connect to the AP");
} else
{ xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);}
wifi_connect_status = 0; printf( "connect to the AP fail");
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP)
{ ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
printf( "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
s_retry_num = 0;
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
wifi_connect_status = 1;
}
}
void connect_wifi(void)
{ s_wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
esp_event_handler_instance_t instance_any_id;
esp_event_handler_instance_t instance_got_ip;
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&event_handler,
NULL,
&instance_any_id));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&event_handler,
NULL,
&instance_got_ip));
wifi_config_t wifi_config = {
.sta = {
.ssid = ESP_WIFI_SSID,
.password = ESP_WIFI_PASSWORD,
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
printf( "wifi_init_sta finished.");
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY);
/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
* happened. */
if (bits & WIFI_CONNECTED_BIT)
{ printf( "connected to ap SSID:%s password:%s",
ESP_WIFI_SSID, ESP_WIFI_PASSWORD);
} else if (bits & WIFI_FAIL_BIT)
{ printf( "Failed to connect to SSID:%s, password:%s",
ESP_WIFI_SSID, ESP_WIFI_PASSWORD);
}
else
{ printf( "UNEXPECTED EVENT");
} vEventGroupDelete(s_wifi_event_group);
}
esp_err_t send_web_page(httpd_req_t *req)
{ int response;
DHT22_readings();
char response_data[sizeof(html_page) + 50];
memset(response_data, 0, sizeof(response_data));
sprintf(response_data, html_page, TempC, TempF);
response = httpd_resp_send(req, response_data, HTTPD_RESP_USE_STRLEN);
return response;
}
esp_err_t get_req_handler(httpd_req_t *req)
{ return send_web_page(req);}
httpd_uri_t uri_get = {
.uri = "/",
.method = HTTP_GET,
.handler = get_req_handler,
.user_ctx = NULL};
httpd_handle_t setup_server(void)
{ httpd_config_t config = HTTPD_DEFAULT_CONFIG();
httpd_handle_t server = NULL;
if (httpd_start(&server, &config) == ESP_OK)
{ httpd_register_uri_handler(server, &uri_get); }
return server;
}
void app_main()
{// nvs_flash_init();
esp_err_t ret = nvs_flash_init();
vTaskDelay(2000 / portTICK_PERIOD_MS);
xTaskCreate(&DHT_reader_task, "DHT_reader_task", 2048, NULL, 5, NULL );
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);
printf( "ESP_WIFI_MODE_STA"); connect_wifi();
if (wifi_connect_status)
{ setup_server(); printf( "Web Server is up and running\n"); }
else printf( "Failed to connected with Wi-Fi, check your network Credentials\n");
}

итак выше указаны разделы [раздел 1] [раздел 2] [раздел 3] их выполнить.

получим получим получим

страница есть
страница есть

можно набрать адрес в телефоне и увидите.

спонсор ООО АК ПРАВОВОЕ СОТРУДНИЧЕСТВО.

С подпиской рекламы не будет

Подключите Дзен Про за 159 ₽ в месяц