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 NVSesp_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共存。