RISC-V技术论坛
直播中

HonestQiao

8年用户 560经验值
擅长:嵌入式技术
私信 关注
[经验]

【乐鑫ESP32-C3 RISC-V处理器IoT开发板试用体验】WiFi初连接演示应用

`请先参考 【新提醒】https://bbs.elecfans.com/jishu_2120136_1_1.html 设置好环境。

1. 启动idf环境:注意第二条命令
  1. # cd ~/esp
  2. # . ./env.sh

2. 拷贝示例文件
  1. # mkdir projects
  2. # cd projects
  3. # cp -r $IDF_PATH/examples/wifi/getting_started/station wifi_station

这个例子,用于演示连接到wifi路由器。

3. 设置编译环境:
  1. # idf set-target esp32c3
  2. ...
  3. -- Configuring done
  4. -- Generating done
  5. -- Build files have been written to: ......

  6. # idf menuconfig   # 注意,回车键进入或者编辑或者结束编辑,(?)表示按这个键执行对应操作

1.png 2.png 3.png 4.png

上述界面的操作,表示设置这个应用连接到wifi路由器的wifi名称(ssid)和密码。
因为是最基础的演示应用,所以对应的wifi名称(ssid)和密码是预先设定好的。
后面我们会演示,如何动态设定。

4. 编译代码:
  1. # idf build


5. 烧录和监控运行:
  1. # idf -p /dev/cu.u***serial-1420 flash monitor
上面这条命令,表示通过板子连接的u***-com口进行烧录,烧录完,立即键入监控状态,显示运行的情况。
如果连接信息不正确,最终提示如下:

此时需要检查:
1. 连接的wifi名称必须是支持2.4G的,5G不行
2. 密码是否正确
执行idf menuconfig设置正确后,再重新执行idf build进行编译

如果设置正确,则会有如下信息:
7.png

6. 代码结构:
5.png
一个基础应用的工程目录,一般包含以上几个部分:
  • main目录:里面是实际运行的代码
  • build目录:编译代码的目录,一般不用管它
  • 配置文件:
    cmake编译配置:
    CMakeLists.txt、Makefile
    sdkconfig:sdk配置,也就是set-target和menuconfig的结果


7. 核心代码:main/station_example_main.c

  1. /* WiFi station Example

  2.    This example code is in the Public Domain (or CC0 licensed, at your option.)

  3.    Unless required by applicable law or agreed to in writing, this
  4.    software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  5.    CONDITIONS OF ANY KIND, either express or implied.
  6. */
  7. #include
  8. #include "freertos/FreeRTOS.h"
  9. #include "freertos/task.h"
  10. #include "freertos/event_groups.h"
  11. #include "esp_system.h"
  12. #include "esp_wifi.h"
  13. #include "esp_event.h"
  14. #include "esp_log.h"
  15. #include "nvs_flash.h"

  16. #include "lwip/err.h"
  17. #include "lwip/sys.h"

  18. /* The examples use WiFi configuration that you can set via project configuration menu

  19.    If you'd rather not, just change the below entries to strings with
  20.    the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
  21. */
  22. #define EXAMPLE_ESP_WIFI_SSID      CONFIG_ESP_WIFI_SSID
  23. #define EXAMPLE_ESP_WIFI_PASS      CONFIG_ESP_WIFI_PASSWORD
  24. #define EXAMPLE_ESP_MAXIMUM_RETRY  CONFIG_ESP_MAXIMUM_RETRY

  25. /* FreeRTOS event group to signal when we are connected*/
  26. static EventGroupHandle_t s_wifi_event_group;

  27. /* The event group allows multiple bits for each event, but we only care about two events:
  28. * - we are connected to the AP with an IP
  29. * - we failed to connect after the maximum amount of retries */
  30. #define WIFI_CONNECTED_BIT BIT0
  31. #define WIFI_FAIL_BIT      BIT1

  32. static const char *TAG = "wifi station";

  33. static int s_retry_num = 0;

  34. static void event_handler(void* arg, esp_event_base_t event_base,
  35.                                 int32_t event_id, void* event_data)
  36. {
  37.     if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
  38.         esp_wifi_connect();
  39.     } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
  40.         if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) {
  41.             esp_wifi_connect();
  42.             s_retry_num++;
  43.             ESP_LOGI(TAG, "retry to connect to the AP");
  44.         } else {
  45.             xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
  46.         }
  47.         ESP_LOGI(TAG,"connect to the AP fail");
  48.     } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
  49.         ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
  50.         ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
  51.         s_retry_num = 0;
  52.         xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
  53.     }
  54. }

  55. void wifi_init_sta(void)
  56. {
  57.     s_wifi_event_group = xEventGroupCreate();

  58.     ESP_ERROR_CHECK(esp_netif_init());

  59.     ESP_ERROR_CHECK(esp_event_loop_create_default());
  60.     esp_netif_create_default_wifi_sta();

  61.     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  62.     ESP_ERROR_CHECK(esp_wifi_init(&cfg));

  63.     esp_event_handler_instance_t instance_any_id;
  64.     esp_event_handler_instance_t instance_got_ip;
  65.     ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
  66.                                                         ESP_EVENT_ANY_ID,
  67.                                                         &event_handler,
  68.                                                         NULL,
  69.                                                         &instance_any_id));
  70.     ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
  71.                                                         IP_EVENT_STA_GOT_IP,
  72.                                                         &event_handler,
  73.                                                         NULL,
  74.                                                         &instance_got_ip));

  75.     wifi_config_t wifi_config = {
  76.         .sta = {
  77.             .ssid = EXAMPLE_ESP_WIFI_SSID,
  78.             .password = EXAMPLE_ESP_WIFI_PASS,
  79.             /* Setting a password implies station will connect to all security modes including WEP/WPA.
  80.              * However these modes are deprecated and not advisable to be used. Incase your Access point
  81.              * doesn't support WPA2, these mode can be enabled by commenting below line */
  82.              .threshold.authmode = WIFI_AUTH_WPA2_PSK,

  83.             .pmf_cfg = {
  84.                 .capable = true,
  85.                 .required = false
  86.             },
  87.         },
  88.     };
  89.     ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
  90.     ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
  91.     ESP_ERROR_CHECK(esp_wifi_start() );

  92.     ESP_LOGI(TAG, "wifi_init_sta finished.");

  93.     /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
  94.      * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
  95.     EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
  96.             WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
  97.             pdFALSE,
  98.             pdFALSE,
  99.             portMAX_DELAY);

  100.     /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
  101.      * happened. */
  102.     if (bits & WIFI_CONNECTED_BIT) {
  103.         ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
  104.                  EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
  105.     } else if (bits & WIFI_FAIL_BIT) {
  106.         ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
  107.                  EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
  108.     } else {
  109.         ESP_LOGE(TAG, "UNEXPECTED EVENT");
  110.     }

  111.     /* The event will not be processed after unregister */
  112.     ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
  113.     ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));
  114.     vEventGroupDelete(s_wifi_event_group);
  115. }

  116. void app_main(void)
  117. {
  118.     //Initialize NVS
  119.     esp_err_t ret = nvs_flash_init();
  120.     if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
  121.       ESP_ERROR_CHECK(nvs_flash_erase());
  122.       ret = nvs_flash_init();
  123.     }
  124.     ESP_ERROR_CHECK(ret);

  125.     ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
  126.     wifi_init_sta();
  127. }
其中的关键部分为:
入口:
  1. app_main() //整个应用程序的入口
  2. wifi_init_sta() //wifi连接的实际处理


wifi配置:
  1. wifi_config_t wifi_config = {
  2.         .sta = {
  3.             .ssid = EXAMPLE_ESP_WIFI_SSID,
  4.             .password = EXAMPLE_ESP_WIFI_PASS,
  5.             /* Setting a password implies station will connect to all security modes including WEP/WPA.
  6.              * However these modes are deprecated and not advisable to be used. Incase your Access point
  7.              * doesn't support WPA2, these mode can be enabled by commenting below line */
  8.              .threshold.authmode = WIFI_AUTH_WPA2_PSK,

  9.             .pmf_cfg = {
  10.                 .capable = true,
  11.                 .required = false
  12.             },
  13.         },
  14.     };


wifi连接:
  1. esp_wifi_set_mode() //wifi运行模式设置
  2. esp_wifi_set_config() //设置连接参数
  3. esp_wifi_start() //使用以上的配置,进行连接


配置参数读取:
  1. #define EXAMPLE_ESP_WIFI_SSID      CONFIG_ESP_WIFI_SSID
  2. #define EXAMPLE_ESP_WIFI_PASS      CONFIG_ESP_WIFI_PASSWORD
  3. #define EXAMPLE_ESP_MAXIMUM_RETRY  CONFIG_ESP_MAXIMUM_RETRY
从代码中,我们能看到以上三行,其对应的就是menuconfig中的wifi 设置信息。

` 6.png

更多回帖

发帖
×
20
完善资料,
赚取积分