В общем изучил я ряд версий для esp32. Изучал с целью избавиться от перезагрузки для коннекта. Кстати вернулся домой, на совсем другого провайдера и роутер. Эффект остался. Остался он и на нескольких в тч и последней версиях 2 серии и на 3 серии.
Однако появилась новая бяка. На всех версиях старше 2.0.0 появилась перезагрузка каждые 1 час 40 минут плюс/минус минута с причиной перезагрузки rst:0x8 (TG1WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
Отключал все таски, эффект остался. Остался только loop с http.hadleClient и vTaskDelay(1).
Вернулся на 1.0.6 - работает стабильно.
Так что пока лучшее враг хорошего.
А вы всё это пробовали на своих СТАРЫХ ESP? Может ещё проверить на свеже купленой/ни разу не юзаной?
Да, платы одни и те же. А какой профит от новой платы? Еще одна неопределенность. Сейчас больше «прочих равных».
Неподубитый (возможно) флэш.
Теперь uptime адекватный. И все же вопрос остался, что ему не нравится с таймером и почему вайфай мо втрого раза?
IPAddress subnet1(255, 255, 0, 0);
Так у тебя?
Да, конешна, маска подсети
чёй та, я конечно догадываюсь зачем, но это совсем совсем неправильно )))
Ну я понимаю, что зона видимости вся третья триада тоже, но это непринципиально с точки зрения безопасности на домашних и похожих сетях.
В рабочей конфигурации это все в сети за микротиком и доступ к ней только изнутри через впн.
Ну, если мы говорим не про ЕСП32 а про абстрактный процессор, то я с таким часто сталкивался.
И всегда это была кривая инициализация.
Попробуй инициализацию сделать по-человечески, через ESP-IDF, а не через этот салат в виде библиотеки WiFi
Вот тебе, развлекайся. Если и это не заработает с первого раза, то да, это становится интересным (положи этот код отдельным Си файлом, вызови wifi_test() из своего setup(), после инициализации Serial)
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "lwip/sockets.h"
#include "lwip/netdb.h"
#define WIFI_SSID "SomKiat Suksamran"
#define WIFI_PASS "Peet2779"
#define WIFI_CONNECTED_BIT BIT0
static EventGroupHandle_t wifi_event_group;
static const char *wifi_event_name[] = {
[0] = "Wi-Fi ready",
[WIFI_EVENT_SCAN_DONE] = "Finished scanning AP",
[WIFI_EVENT_STA_START] = "Station start",
[WIFI_EVENT_STA_STOP] = "Station stop",
[WIFI_EVENT_STA_CONNECTED] = "Station connected to AP",
[WIFI_EVENT_STA_DISCONNECTED] = "Station disconnected from AP",
[WIFI_EVENT_STA_AUTHMODE_CHANGE] ="The auth mode of AP connected by device's station changed",
[WIFI_EVENT_STA_WPS_ER_SUCCESS] = "Station WPS succeeds in enrollee mode",
[WIFI_EVENT_STA_WPS_ER_FAILED] = "Station WPS fails in enrollee mode",
[WIFI_EVENT_STA_WPS_ER_TIMEOUT] = "Station WPS timeout in enrollee mode",
[WIFI_EVENT_STA_WPS_ER_PIN] = "Station WPS pin code in enrollee mode",
[WIFI_EVENT_STA_WPS_ER_PBC_OVERLAP]= "Station WPS overlap in enrollee mode",
[WIFI_EVENT_AP_START] = "Soft-AP start",
[WIFI_EVENT_AP_STOP] = "Soft-AP stop",
[WIFI_EVENT_AP_STACONNECTED] = "A station connected to Soft-AP",
[WIFI_EVENT_AP_STADISCONNECTED] = "A station disconnected from Soft-AP",
[WIFI_EVENT_AP_PROBEREQRECVED] = "Receive probe request packet in soft-AP interface",
[WIFI_EVENT_FTM_REPORT] = "Receive report of FTM procedure",
[WIFI_EVENT_STA_BSS_RSSI_LOW] = "AP's RSSI crossed configured threshold",
[WIFI_EVENT_ACTION_TX_STATUS] = "Status indication of Action Tx operation",
[WIFI_EVENT_ROC_DONE] = "Remain-on-Channel operation complete",
[WIFI_EVENT_STA_BEACON_TIMEOUT] = "Station beacon timeout",
[WIFI_EVENT_CONNECTIONLESS_MODULE_WAKE_INTERVAL_START] = "Connectionless module wake interval start",
[WIFI_EVENT_AP_WPS_RG_SUCCESS] = "Soft-AP wps succeeds in registrar mode",
[WIFI_EVENT_AP_WPS_RG_FAILED] = "Soft-AP wps fails in registrar mode",
[WIFI_EVENT_AP_WPS_RG_TIMEOUT] = "Soft-AP wps timeout in registrar mode",
[WIFI_EVENT_AP_WPS_RG_PIN] = "Soft-AP wps pin code in registrar mode",
[WIFI_EVENT_AP_WPS_RG_PBC_OVERLAP] = "Soft-AP wps overlap in registrar mode",
[WIFI_EVENT_ITWT_SETUP] = "iTWT setup",
[WIFI_EVENT_ITWT_TEARDOWN] = "iTWT teardown",
[WIFI_EVENT_ITWT_PROBE] = "iTWT probe",
[WIFI_EVENT_ITWT_SUSPEND] = "iTWT suspend",
[WIFI_EVENT_TWT_WAKEUP] = "TWT wakeup",
[WIFI_EVENT_BTWT_SETUP] = "bTWT setup",
[WIFI_EVENT_BTWT_TEARDOWN] = "bTWT teardown",
[WIFI_EVENT_NAN_STARTED] = "NAN Discovery has started",
[WIFI_EVENT_NAN_STOPPED] = "NAN Discovery has stopped",
[WIFI_EVENT_NAN_SVC_MATCH] = "NAN Service Discovery match found",
[WIFI_EVENT_NAN_REPLIED] = "Replied to a NAN peer with Service Discovery match",
[WIFI_EVENT_NAN_RECEIVE] = "Received a Follow-up message",
[WIFI_EVENT_NDP_INDICATION] = "Received NDP Request from a NAN Peer",
[WIFI_EVENT_NDP_CONFIRM] = "NDP Confirm Indication",
[WIFI_EVENT_NDP_TERMINATED] = "NAN Datapath terminated indication",
[WIFI_EVENT_HOME_CHANNEL_CHANGE] ="Wi-Fi home channel change,doesn't occur when scanning",
[WIFI_EVENT_STA_NEIGHBOR_REP] = "Received Neighbor Report response",
[WIFI_EVENT_AP_WRONG_PASSWORD] = "a station tried to connect with wrong password",
[WIFI_EVENT_STA_BEACON_OFFSET_UNSTABLE] = "Station sampled beacon offset unstable",
[WIFI_EVENT_DPP_URI_READY] = "DPP URI is ready through Bootstrapping",
[WIFI_EVENT_DPP_CFG_RECVD] = "Config received via DPP Authentication",
[WIFI_EVENT_DPP_FAILED] = "DPP failed",
[WIFI_EVENT_MAX] = "Invalid Wi-Fi event ID"
};
static const char *ip_event_name[] = {
"station got IP from connected AP",
"station lost IP and the IP is reset to 0",
"soft-AP assign an IP to a connected station",
"station or ap or ethernet interface v6IP addr is preferred",
"ethernet got IP from connected AP",
"ethernet lost IP and the IP is reset to 0",
"PPP interface got IP",
"PPP interface lost IP",
"transmitting/receiving data packet"
};
static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {
if (event_base == WIFI_EVENT) {
if (event_id >= 0 && event_id < WIFI_EVENT_MAX)
printf("WIFI-EVENT: %s\r\n",wifi_event_name[event_id]);
else
printf("WIFI-EVENT: Unknown event %ld\r\n", event_id);
} else if (event_base == IP_EVENT) {
if (event_id >= 0 && event_id < WIFI_EVENT_MAX)
printf("IP-EVENT: %s\r\n",ip_event_name[event_id]);
else
printf("IP-EVENT: Unknown event %ld\r\n", event_id);
}
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) {
esp_wifi_connect(); // auto-reconnect
printf("Disconnected, retrying...\n");
} 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 "\n", IP2STR(&event->ip_info.ip));
xEventGroupSetBits(wifi_event_group, WIFI_CONNECTED_BIT);
}
}
void wifi_init_sta(void) {
wifi_event_group = xEventGroupCreate();
// Initialize NVS
ESP_ERROR_CHECK(nvs_flash_init());
// Init TCP/IP stack and event loop
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
// Create default Wi-Fi station interface
esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();
(void)sta_netif;
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
// Register event handlers
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&event_handler,
NULL,
NULL));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&event_handler,
NULL,
NULL));
// Configure Wi-Fi
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_config(WIFI_IF_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
printf("Wi-Fi init finished.\n");
}
void wifi_test(void) {
wifi_init_sta();
// Wait for connection
xEventGroupWaitBits(wifi_event_group, WIFI_CONNECTED_BIT,
pdFALSE, pdTRUE, portMAX_DELAY);
printf("Connected, sockets ready!\n");
// Example: simple TCP server
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr = {
.sin_family = AF_INET,
.sin_addr.s_addr = htonl(INADDR_ANY),
.sin_port = htons(8080),
};
bind(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen(sock, 1);
printf("Listening on port 8080...\n");
while (1) {
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
int client_sock = accept(sock, (struct sockaddr *)&client_addr, &addr_len);
if (client_sock >= 0) {
printf("Client connected!\n");
char msg[] = "Hello from ESP32!\n";
send(client_sock, msg, strlen(msg), 0);
close(client_sock);
}
}
}
Скорее всего - порядок инициализации нарушен:
Чтобы пронициализировать вайфай, надо: сделать А, потом Б.
ннапример Твой код делает наоборот , сначала Б, потом А. Ничо не работает. Но потом рестарт, и на уже сделанное “А” ложится новое “Б” и все начинает работать. Надеюсь, не слишком эзотерическое вышло объяснение.
Перезагрузка не обнуляет регистры перефирии. Холодный рестарт обнуляет.
Простая перезагрузка не сбрасывает GPIO HOLD, перезагрузка питанием - сбрасывает. Ты же случайно не морозишь пины свои , (gpio_hold_enable() всякие не вызываешь?)
Да не морозь случайно пины свои ![]()
Канешна нет.
Кстате оно (внезапно) начало коннектится с первого предъявления.
«… ничего не делал, просто зашел…» игрался с запуском процессов как статик. Но какое ето отношение к вайфаю имеет ХЗ.
Процесс получение времени по ntp 100 ms
Процесс отображения текущей информации ( на фото желтенькое). 100 ms
Процесс наполнения псевдоинформацией структуры для вывода вэб страницы. 10000 ms
Процесс скролла лога 1000ms (на фото белый текст)
Процесс вайфай бар по уровню сигнала 1000ms
Все процессы в критических местах берут один и тот же мьютекс, в момент отображерия информации, чтобы каши на экране не было.
Чертовшшина какая то.
Ну, если чертовщина, то отключай чертей по одному, смотри когда начнет устойчиво работать
Дык теперь все работает безукоризненно и предыдущие релизы тоже.
Чертик улетучился.
