- яндекс маркет в этом очень заинтересован.
КАК можно оценить ценность информации? 😜 ВИДЕО
- а) интересна.
- б) даёт экономический эффект
- г) обеспечивает безопасность
- д) создаёт тактическое и стратегическое преимущество?
- е) актуальность ПРИМ: есть еще доводы?
Материалы берем тут Если кому английский в тягость , то научитесь включать автопереводчик текстов или использовать броузер с просмотром перевода.
😉По схеме видно, что ПК, телефон, роутер ноутбук дружат с http и css через tcp/ip. Таким образом если esp32 или другое устройство сможет обеспечивать обмен информацией через http и css. то не нужны будут ПРОГРАММИСТЫ верхнего уровня по причине , что brouser зная адрес спокойно сможет обеспечить нужный вид данных от esp32. Передать данные в формат html и сss спокойно может обеспечить средства SPIFFS в организации программы esp32.🚩
😎Кстати , а можно усложнить задачу до других масштабов? iot? mech? другие материалы
😒Как бы понятно куда движется всё и вся? Таким образом попробуем поучаствовать? Ну иногда не надо обеспечивать полный процесс, а достаточно просто запустить его одной кнопкой или выключить?, НИЖЕ пример данного сотворения возможности!!!😁 Ечли запустить файл index.html, то увидим .
КОД index.html ниже если его смотреть в блокноте. Читайте документацию по html и css, а и поверьте не так сложно , чтобы разобраться(✔🤔
<!DOCTYPE HTML>
<html>
<head>
<title>ESP32 Web Server</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="data:,">
<style>
html { font-family: New Times Roman;
text-align: center; }
h1 { font-size: 1.8rem; color: white; }
h2 { font-size: 1.5rem; font-weight: bold; color: #07156d; }
.card { background-color: #F8F7F9;
;
box-shadow: 2px 2px 12px 1px rgba(140, 140, 140, .5);
padding-top: 10px;
padding-bottom: 20px; }
.topnav { overflow: hidden;
background-color: #04296d; }
body { margin: 0; }
.content { padding: 30px;
max-width: 600px; margin: 0 auto; }
.button { padding: 15px 50px; font-size: 24px;
text-align: center;
outline: none;
color: #fff;
background-color: #0ffa6d; //green
border: #0ffa6d;
border-radius: 5px;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
.button:active { background-color: #fa0f0f; transform: translateY(2px); }
.state {
font-size: 1.5rem; color: #120707; font-weight: bold; }
</style>
<title>ESP32 Web Server</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="data:,">
</head>
<body>
<div class="topnav">
<h1>ESP32 WebSocket Server</h1>
</div>
<div class="content">
<div class="card">
<h2>ONBOARD LED GPIO2</h2>
<p><button id="button" class="button">Toggle LED</button></p>
<p class="state">State: <span id="state">%s</span></p>
</div>
</div>
</div>
<script>
var gateway = `ws://${window.location.hostname}/ws`;
var websocket;
window.addEventListener('load', onLoad);
function initWebSocket() {
console.log('Trying to open a WebSocket connection...');
websocket = new WebSocket(gateway);
websocket.onopen = onOpen;
websocket.onclose = onClose;
websocket.onmessage = onMessage; // <-- add this line
}
function onOpen(event) {
console.log('Connection opened'); }
function onClose(event) { console.log('Connection closed');
setTimeout(initWebSocket, 2000); }
function onMessage(event) {
var state; console.log(event.data);
if (event.data == "1") { state = "ON";
}
else { state = "OFF";
}
document.getElementById('state').innerHTML = state;
}
function onLoad(event) { initWebSocket(); initButton();
}
function initButton() {
document.getElementById('button').addEventListener('click', toggle);
}
function toggle() { websocket.send('toggle'); }
</script>
</body>
</html>
✔Будем считать. что нам этот код написали добрые мам и бабуль. который хочет включать или выключать например вентиляцию в подвале или подогрев в курятнике или шокер , чтобы пап проснулся и слинял на работу, ну и т.п.🤔
😗Ну вы хе не токо в танчики шпарить можете. вы же еще должны подружек и недругов обескуражить и обеспечить маман хотелки. на гордость и зависть папаш ✌ видео Ааа как ставить espressif . можете порыть и использовать официальный сайт . тут вероятность облажаться.
- НАДО ВЫПОЛНИТЬ ТРИ ПУНКТА
🏳🌈 Всегда есть выбор? выше просим сделать выбор!
выбрав суть. Создадим проект 🚩
Два пункта!😊
НАДО:🤔
- создать катало DATA
- создать файл partitions.csv
- ввести в файл код
nvs, data, nvs, , 0x6000,
phy_init, data, phy, , 0x1000,
factory, app, factory, , 1M,
storage, data, spiffs, , 1M
СОЗдадим КАТАЛОГ
пункты выполнить не сложно? по рисунку выше.
Пункты согласно картинке.
Встали на файл и правую кнопку мышки. Пункты выполнили.
nvs, data, nvs, , 0x6000,
phy_init, data, phy, , 0x1000,
factory, app, factory, , 1M,
storage, data, spiffs, , 1M
Выполняем пункты согласно стрелкам.🏴
🔧ВЫПОЛНИМ ПУНКтЫ
Согласно пунктам организуем файл в каталоге DATA
Заки нем в данный файл указанный код ниже с помощью текстового редактора и сохраним.🎏
<!DOCTYPE HTML>
<html>
<head>
<title>ESP32 Web Server</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="data:,">
<style>
html { font-family: New Times Roman;
text-align: center; }
h1 { font-size: 1.8rem; color: white; }
h2 { font-size: 1.5rem; font-weight: bold; color: #07156d; }
.card { background-color: #F8F7F9;
;
box-shadow: 2px 2px 12px 1px rgba(140, 140, 140, .5);
padding-top: 10px;
padding-bottom: 20px; }
.topnav { overflow: hidden;
background-color: #04296d; }
body { margin: 0; }
.content { padding: 30px;
max-width: 600px; margin: 0 auto; }
.button { padding: 15px 50px; font-size: 24px;
text-align: center;
outline: none;
color: #fff;
background-color: #0ffa6d; //green
border: #0ffa6d;
border-radius: 5px;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
.button:active { background-color: #fa0f0f; transform: translateY(2px); }
.state {
font-size: 1.5rem; color: #120707; font-weight: bold; }
</style>
<title>ESP32 Web Server</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" href="data:,">
</head>
<body>
<div class="topnav">
<h1>ESP32 WebSocket Server</h1>
</div>
<div class="content">
<div class="card">
<h2>ONBOARD LED GPIO2</h2>
<p><button id="button" class="button">Toggle LED</button></p>
<p class="state">State: <span id="state">%s</span></p>
</div>
</div>
</div>
<script>
var gateway = `ws://${window.location.hostname}/ws`;
var websocket;
window.addEventListener('load', onLoad);
function initWebSocket() {
console.log('Trying to open a WebSocket connection...');
websocket = new WebSocket(gateway);
websocket.onopen = onOpen;
websocket.onclose = onClose;
websocket.onmessage = onMessage; // <-- add this line
}
function onOpen(event) {
console.log('Connection opened'); }
function onClose(event) { console.log('Connection closed');
setTimeout(initWebSocket, 2000); }
function onMessage(event) {
var state; console.log(event.data);
if (event.data == "1") { state = "ON";
}
else { state = "OFF";
}
document.getElementById('state').innerHTML = state;
}
function onLoad(event) { initWebSocket(); initButton();
}
function initButton() {
document.getElementById('button').addEventListener('click', toggle);
}
function toggle() { websocket.send('toggle'); }
</script>
</body>
</html>
Стрелки вам подсказывают.🧧
/// код который надо вставить в проект
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include <esp_http_server.h>
#include "nvs_flash.h"
#include "esp_spiffs.h"
#include "connect_wifi.h"
///выше указали библиотеки🎃
#define LED_PIN 2
httpd_handle_t server = NULL;
struct async_resp_arg { httpd_handle_t hd; int fd; };
static const char *TAG = "WebSocket Server"; // TAG for debug
int led_state = 0;
#define INDEX_HTML_PATH "/spiffs/index.html"
char index_html[4096]; char response_data[4096];
static void initi_web_page_buffer(void)
{ esp_vfs_spiffs_conf_t conf = {
.base_path = "/spiffs",
.partition_label = NULL,
.max_files = 5,
.format_if_mount_failed = true};
ESP_ERROR_CHECK(esp_vfs_spiffs_register(&conf));
memset((void *)index_html, 0, sizeof(index_html));
struct stat st;
if (stat(INDEX_HTML_PATH, &st))
{ ESP_LOGE(TAG, "index.html not found");
return;
}
FILE *fp = fopen(INDEX_HTML_PATH, "r");
if (fread(index_html, st.st_size, 1, fp) == 0)
{ ESP_LOGE(TAG, "fread failed");
} fclose(fp);
}
esp_err_t get_req_handler(httpd_req_t *req)
{ int response;
if(led_state)
{ sprintf(response_data, index_html, "ON");
}
else
{ sprintf(response_data, index_html, "OFF");
}
response = httpd_resp_send(req, response_data, HTTPD_RESP_USE_STRLEN);
return response;
}
static void ws_async_send(void *arg)
{ httpd_ws_frame_t ws_pkt;
struct async_resp_arg *resp_arg = arg;
httpd_handle_t hd = resp_arg->hd;
int fd = resp_arg->fd;
led_state = !led_state;
gpio_set_level(LED_PIN, led_state);
char buff[4];
memset(buff, 0, sizeof(buff));
sprintf(buff, "%d",led_state);
memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t));
ws_pkt.payload = (uint8_t *)buff;
ws_pkt.len = strlen(buff);
ws_pkt.type = HTTPD_WS_TYPE_TEXT;
static size_t max_clients = CONFIG_LWIP_MAX_LISTENING_TCP;
size_t fds = max_clients;
int client_fds[max_clients];
esp_err_t ret = httpd_get_client_list(server, &fds, client_fds);
if (ret != ESP_OK) {
return;
}
for (int i = 0; i < fds; i++) {
int client_info = httpd_ws_get_fd_info(server, client_fds[i]);
if (client_info == HTTPD_WS_CLIENT_WEBSOCKET) {
httpd_ws_send_frame_async(hd, client_fds[i], &ws_pkt);
}
}
free(resp_arg);
}
static esp_err_t trigger_async_send(httpd_handle_t handle, httpd_req_t *req)
{ struct async_resp_arg *resp_arg = malloc(sizeof(struct async_resp_arg));
resp_arg->hd = req->handle;
resp_arg->fd = httpd_req_to_sockfd(req);
return httpd_queue_work(handle, ws_async_send, resp_arg);
}
static esp_err_t handle_ws_req(httpd_req_t *req)
{ if (req->method == HTTP_GET)
{
ESP_LOGI(TAG, "Handshake done, the new connection was opened");
return ESP_OK;
}
httpd_ws_frame_t ws_pkt;
uint8_t *buf = NULL;
memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t));
ws_pkt.type = HTTPD_WS_TYPE_TEXT;
esp_err_t ret = httpd_ws_recv_frame(req, &ws_pkt, 0);
if (ret != ESP_OK)
{ ESP_LOGE(TAG, "httpd_ws_recv_frame failed to get frame len with %d", ret);
return ret;
}
if (ws_pkt.len)
{ buf = calloc(1, ws_pkt.len + 1);
if (buf == NULL)
{ ESP_LOGE(TAG, "Failed to calloc memory for buf");
return ESP_ERR_NO_MEM;
}
ws_pkt.payload = buf;
ret = httpd_ws_recv_frame(req, &ws_pkt, ws_pkt.len);
if (ret != ESP_OK)
{ ESP_LOGE(TAG, "httpd_ws_recv_frame failed with %d", ret);
free(buf);
return ret;
}
ESP_LOGI(TAG, "Got packet with message: %s", ws_pkt.payload);
}
ESP_LOGI(TAG, "frame len is %d", ws_pkt.len);
if (ws_pkt.type == HTTPD_WS_TYPE_TEXT &&
strcmp((char *)ws_pkt.payload, "toggle") == 0)
{ free(buf);
return trigger_async_send(req->handle, req);
}
return ESP_OK;
}
httpd_handle_t setup_websocket_server(void)
{ httpd_config_t config = HTTPD_DEFAULT_CONFIG();
httpd_uri_t uri_get = {
.uri = "/",
.method = HTTP_GET,
.handler = get_req_handler,
.user_ctx = NULL};
httpd_uri_t ws = {
.uri = "/ws",
.method = HTTP_GET,
.handler = handle_ws_req,
.user_ctx = NULL,
.is_websocket = true};
if (httpd_start(&server, &config) == ESP_OK)
{ httpd_register_uri_handler(server, &uri_get);
httpd_register_uri_handler(server, &ws);
}
return server;
}
////----- ниже основное тело программы🎃
void app_main()
{ // 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);
connect_wifi();
if (wifi_connect_status)
{ gpio_pad_select_gpio(LED_PIN);
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
led_state = 0;
ESP_LOGI(TAG, "ESP32 ESP-IDF WebSocket Web Server is running ... ...\n");
initi_web_page_buffer();
setup_websocket_server();
}
}
Стрелки указывают , что еще два файла нет, которые обеспечивают движуху данных по wifi. ОРГАНИЗУЕМ?
/// ИСХОДНИК файла connec_wifi.h
#include "connect_wifi.h"
#define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID
#define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD
#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY
static EventGroupHandle_t s_wifi_event_group;
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1
static int s_retry_num = 0;
int wifi_connect_status = 0;
static const char *TAG = "wifi_connect"; // TAG for debug
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 < EXAMPLE_ESP_MAXIMUM_RETRY)
{ esp_wifi_connect();
s_retry_num++;
ESP_LOGI(TAG, "retry to connect to the AP");
}
else
{ xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
}
wifi_connect_status = 0;
ESP_LOGI(TAG, "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;
ESP_LOGI(TAG, "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 = EXAMPLE_ESP_WIFI_SSID,
.password = EXAMPLE_ESP_WIFI_PASS,
.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());
ESP_LOGI(TAG, "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)
{ ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
}
else if (bits & WIFI_FAIL_BIT)
{ ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
}
else
{ ESP_LOGE(TAG, "UNEXPECTED EVENT");
}
vEventGroupDelete(s_wifi_event_group);
}
Как то так. три пункта и файл готов!
- ///занесем код ниже в файл connect_wifi.c
#include "connect_wifi.h"
#define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID
#define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD
#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY
static EventGroupHandle_t s_wifi_event_group;
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT BIT1
static int s_retry_num = 0; int wifi_connect_status = 0;
static const char *TAG = "wifi_connect"; // TAG for debug
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 < EXAMPLE_ESP_MAXIMUM_RETRY)
{ esp_wifi_connect(); s_retry_num++;
ESP_LOGI(TAG, "retry to connect to the AP");
} else { xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
}
wifi_connect_status = 0; ESP_LOGI(TAG, "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;
ESP_LOGI(TAG, "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 = EXAMPLE_ESP_WIFI_SSID,
.password = EXAMPLE_ESP_WIFI_PASS,
.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());
ESP_LOGI(TAG, "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)
{ ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
}
else if (bits & WIFI_FAIL_BIT)
{ ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
} else
{ ESP_LOGE(TAG, "UNEXPECTED EVENT");
}
vEventGroupDelete(s_wifi_event_group);
}
///занесем код ниже в файл connect_wifi.h
#ifndef CONNECT_WIFI_H_
#define CONNECT_WIFI_H_
#include <esp_system.h>
#include <nvs_flash.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.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>
extern int wifi_connect_status;
void connect_wifi(void);
#endif
Ниже в каталоге main.c
- ВАЖНОооо Туда тоже ввести надо : spiffs_create_partition_image(storage ../data FLASH_IN_PROJECT)
ВЫШЕ стрелка на молоток. Пункт 3 = это отладка кода!!!🎃 После отладки проблем прибавится, но вы обожаете проблемы? В этом случае проблемы начинают вас уважать.
"Kconfig.projbuild‘ в папке main. Скопируйте приведенный ниже код
# put here your custom config value
menu "Example Configuration"
config ESP_WIFI_SSID
string "WiFi SSID"
default "q"
help
SSID (network name) for the example to connect to.
config ESP_WIFI_PASSWORD
string "WiFi Password"
default "$xoo21533"
help
WiFi password (WPA or WPA2) for the example to use.
config ESP_MAXIMUM_RETRY
int "Maximum retry"
default 5
help
Set the Maximum retry to avoid station reconnecting to the AP unlimited when the AP is really inexistent.
endmenu
По пунктам👩🦲выше.
Этот код настраивает ESP32 как сервер WebSocket, который обслуживает веб-страницу клиенту (веб-браузеру) и переключает состояние индикатора на этой веб-странице.
///ДАЛЕЕ ПЕРЕВОД ПРОГРАММЫ С САЙТА //:ESP32TITORIAL.COM ХОРОШО ВСЁ ИЗЛОЖЕНО. Надеемся со структурным мышлением у вас всё нормально, которое прививается в СПО и ВУЗах заставляют же рисовать структурные и унк. схемы. кто это не делал , тот не оч и выиграл.
🚲Процесс запущен. Ждём!!! Если всё окей ? = хорошо))) Но выдало ошибку на httpd_handle_t
🛴Поискал везде и логика пнула в бок, что надо родной пример espressif нарыть и там узреть. Так же? Добавил библиотеки и методом исключения получил такое.
//#include <esp_wifi.h>
#include <esp_event.h>
//#include <esp_log.h>
//#include <esp_system.h>
//#include <nvs_flash.h>
//#include <sys/param.h>
#include "esp_netif.h"
#include "esp_eth.h"
🚲Процесс запущен. Ждём!!! НОРМАЛЬНО!!! ПРОШЛО.
- Пункт 1 можно не реализовать, и особо если нет выхода в ИНЕТ!!!🤢
УВИДИЛИ адрес?
Выполнив пункт 1 и 2 начнём видеть результат?
ИТОГ: ОСОЗНАЛИ как работать в espressif))) Увидели как можно вогнать код html в программу esp32)) )
Да перед работой надо оценить живой камень или нет. а то получится , что программу накидали , а камень не живой.
Лайки ставить надо сюда. Там они нормально смотрятся.
Спонсор ООО АК ПРАВОВОЕ СОТРУДНИЧЕСТВО