写一个STM32 ESP32配网程序
时间: 2023-11-16 13:07:04 浏览: 125
以下是一个简单的 STM32 ESP32 配网程序示例,使用 FreeRTOS 操作系统和 ESP-IDF 程序库:
```c
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_smartconfig.h"
#define TAG "wifi"
static void smartconfig_task(void *parm);
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)
{
esp_wifi_connect();
ESP_LOGI(TAG, "retry to connect to the AP");
}
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:%s", ip4addr_ntoa(&event->ip_info.ip));
}
else if (event_base == SC_EVENT && event_id == SC_EVENT_SCAN_DONE)
{
ESP_LOGI(TAG, "scan done");
}
else if (event_base == SC_EVENT && event_id == SC_EVENT_FOUND_CHANNEL)
{
ESP_LOGI(TAG, "found channel");
}
else if (event_base == SC_EVENT && event_id == SC_EVENT_GOT_SSID_PSWD)
{
smartconfig_event_got_ssid_pswd_t *evt = (smartconfig_event_got_ssid_pswd_t *)event_data;
wifi_config_t wifi_config;
memset(&wifi_config, 0, sizeof(wifi_config));
memcpy(wifi_config.sta.ssid, evt->ssid, sizeof(wifi_config.sta.ssid));
memcpy(wifi_config.sta.password, evt->password, sizeof(wifi_config.sta.password));
esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);
esp_wifi_connect();
}
else if (event_base == SC_EVENT && event_id == SC_EVENT_SEND_ACK_DONE)
{
xEventGroupSetBits((EventGroupHandle_t)arg, BIT0);
}
}
void wifi_init_sta(void)
{
ESP_ERROR_CHECK(nvs_flash_init());
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_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_start());
xTaskCreate(smartconfig_task, "smartconfig_task", 4096, NULL, 3, NULL);
}
static void smartconfig_task(void *parm)
{
EventBits_t uxBits;
ESP_ERROR_CHECK(esp_smartconfig_set_type(SC_TYPE_ESPTOUCH));
ESP_ERROR_CHECK(esp_smartconfig_start(sc_callback));
while (1)
{
uxBits = xEventGroupWaitBits(sc_event_group, BIT0, true, false, portMAX_DELAY);
if (uxBits & BIT0)
{
ESP_LOGI(TAG, "smartconfig over");
esp_smartconfig_stop();
vTaskDelete(NULL);
}
}
}
```
在这个示例中,我们定义了一个名为 `wifi_init_sta()` 的函数来初始化 ESP32 Wi-Fi 模块,并在其中创建一个名为 `smartconfig_task()` 的 FreeRTOS 任务。 `smartconfig_task()` 会一直运行,直到 `esp_smartconfig_stop()` 被调用。当 ESP32 收到配网请求时,将会调用 `event_handler()` 函数来处理事件,其中包含了 Wi-Fi 连接和配网等事件的处理逻辑。最后,我们调用 `xEventGroupWaitBits()` 函数来等待配网完成的事件。
请注意,这只是一个简单的示例,实际情况下,您可能需要更复杂的逻辑来处理各种不同的配网情况和错误。
阅读全文