ESP32-WROOM-32E,WIFI基本功能实现,采坑经验
用的示例代码,路径 D:\esp-idf\examples\wifi\getting_started\station 。
看官网教程,路径https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/get-started/index.html#get-started-connect。
问题
1、没有很好的解决。尝试过换其他工程的build.ninjia,用了会报错。
2、最后重新将代码拷贝的新的工程才解决。
问题
路由如果断开,WIFI不会自动重连
ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler));
ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler));
vEventGroupDelete(s_wifi_event_group);
主要是上面一段程序,注销WIFI事件、注销后路由断开后再上线不会重连。屏蔽掉就好了。
问题
连上wifi同时,获取wifi信号强度
主要是参考–>链接:esp32 采集某个路由器信号强度.
加工变成自己的连上wif实时获取信号强度。应用的idf版本不同,其函数也会不同,如最新版本的wifi初始化过程就没有tcpip_adapter_init();对照找example修改一下就行。
程序如下:
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "esp_event_loop.h"
#include "nvs_flash.h"
#define DEFAULT_SCAN_LIST_SIZE CONFIG_EXAMPLE_SCAN_LIST_SIZE
#define EXAMPLE_ESP_WIFI_SSID "esp32"
#define EXAMPLE_ESP_WIFI_PASS "12345678"
const int SCAN_DONE_BIT = BIT0;
static EventGroupHandle_t wifi_event_group;
static wifi_scan_config_t wifi_config =
{
.ssid = (uint8_t*)"esp32",
.bssid = NULL,
};
static esp_err_t event_handler(void *ctx, system_event_t *event)
{
switch(event->event_id) {
case SYSTEM_EVENT_SCAN_DONE:
got_scan_done_event = true;
xEventGroupSetBits(wifi_event_group,SCAN_DONE_BIT);
break;
default:
break;
}
return ESP_OK;
}
static void init_wifi(void)
{
tcpip_adapter_init();
wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
wifi_config_t s_wifi_config = {
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.password = EXAMPLE_ESP_WIFI_PASS,
},
};
ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &s_wifi_config) );
ESP_ERROR_CHECK(esp_wifi_start());
esp_wifi_connect();
vTaskDelay(5000 /portTICK_PERIOD_MS);//这边加延时是为了让wifi连接,
//如果没有延时会程序会一直重启。最好写一个wifi连接上的判断。实例代码example都有.
for(int i=0;i<30;i++)
{
ESP_ERROR_CHECK(esp_wifi_scan_start(&wifi_config,1));
xEventGroupClearBits(wifi_event_group,SCAN_DONE_BIT);
uint16_t apCount=0;
esp_wifi_scan_get_ap_num(&apCount);
printf("Nuber of access points found:%d\n",apCount);
if(apCount==0)
{
ESP_LOGI(TAG,"NOting ap found");
return;
}
wifi_ap_record_t *list = (wifi_ap_record_t *)malloc(sizeof(wifi_ap_record_t) *apCount);
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&apCount,list));
printf("signal:%4d\n",list[0].rssi);
free(list);
printf("\n\n");
vTaskDelay(200 /portTICK_PERIOD_MS); //延时200毫秒
ESP_ERROR_CHECK(esp_wifi_scan_start(&wifi_config,1));
}
}
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 );
init_wifi();
}
问题
ESP32的AP和STA共存。