ESP32 IDF

ESP32 IDF Wi-Fi 기능 살펴보기

임베디드 친구 2024. 11. 3. 10:15
반응형

ESP32는 뛰어난 무선 통신 기능을 제공하는 IoT 개발 플랫폼으로, Wi-Fi와 Bluetooth 모듈을 내장하고 있습니다. 오늘은 ESP32의 Wi-Fi 기능 중 Wi-Fi STA(Station) 모드와 AP(Access Point) 모드 설정 방법을 예제와 함께 살펴보겠습니다. 이를 통해 ESP32를 활용하여 Wi-Fi에 연결하고, AP 모드를 통해 다른 장치들이 네트워크에 연결할 수 있도록 만드는 방법을 알아보겠습니다.

Wi-Fi STA 모드 설정 및 연결

Wi-Fi STA 모드는 ESP32가 Wi-Fi 네트워크에 연결되는 클라이언트 역할을 합니다. 이를 통해 ESP32는 기존 Wi-Fi 네트워크에 접속하여 인터넷이나 로컬 네트워크의 다른 장치와 통신할 수 있습니다.

Wi-Fi STA 모드 설정하기

다음은 Wi-Fi STA 모드를 설정하고 Wi-Fi 네트워크에 연결하는 예제 코드입니다.

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "esp_log.h"

#define WIFI_SSID      "your_wifi_ssid"
#define WIFI_PASS      "your_wifi_password"

static const char *TAG = "wifi_sta";

void wifi_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_LOGI(TAG, "Retrying to connect to the AP");
        esp_wifi_connect();
    } 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));
    }
}

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_event_handler_instance_t instance_any_id;
    esp_event_handler_instance_t instance_got_ip;
    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &wifi_event_handler,
                                                        NULL,
                                                        &instance_any_id));
    ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
                                                        IP_EVENT_STA_GOT_IP,
                                                        &wifi_event_handler,
                                                        NULL,
                                                        &instance_got_ip));

    wifi_config_t wifi_config = {
        .sta = {
            .ssid = WIFI_SSID,
            .password = WIFI_PASS,
        },
    };
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());
}

void app_main(void) {
    wifi_init_sta();
}

코드 설명

  1. 초기화 작업: nvs_flash_init(), esp_netif_init(), esp_event_loop_create_default() 등의 함수를 호출하여 NVS(비휘발성 저장소)와 네트워크 인터페이스, 이벤트 루프를 초기화합니다.
  2. Wi-Fi 기본 설정: wifi_init_config_t를 사용하여 Wi-Fi 드라이버를 초기화하고, wifi_init_sta() 함수를 통해 STA 모드를 활성화합니다.
  3. 이벤트 핸들러 등록: Wi-Fi 연결 및 IP 주소 획득에 대한 이벤트를 처리하기 위해 핸들러를 등록합니다.
  4. Wi-Fi 연결: 설정된 SSID와 비밀번호를 이용해 Wi-Fi 네트워크에 연결을 시도합니다. 연결 성공 시 IP 주소가 출력됩니다.

Wi-Fi AP 모드 설정하기

Wi-Fi AP 모드는 ESP32가 액세스 포인트 역할을 하며, 다른 장치들이 ESP32에 연결할 수 있도록 합니다. AP 모드를 사용하면 ESP32를 통해 로컬 네트워크를 구성할 수 있습니다.

Wi-Fi AP 모드 설정 예제

다음은 Wi-Fi AP 모드를 설정하는 예제 코드입니다.

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "esp_log.h"

#define AP_SSID      "esp32_ap"
#define AP_PASS      "12345678"
#define MAX_STA_CONN 4

static const char *TAG = "wifi_ap";

void wifi_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_AP_START) {
        ESP_LOGI(TAG, "Wi-Fi AP started");
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STACONNECTED) {
        wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
        ESP_LOGI(TAG, "Station "MACSTR" connected", MAC2STR(event->mac));
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STADISCONNECTED) {
        wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
        ESP_LOGI(TAG, "Station "MACSTR" disconnected", MAC2STR(event->mac));
    }
}

void wifi_init_ap(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_ap();

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    esp_event_handler_instance_t instance_any_id;
    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &wifi_event_handler,
                                                        NULL,
                                                        &instance_any_id));

    wifi_config_t wifi_config = {
        .ap = {
            .ssid = AP_SSID,
            .ssid_len = strlen(AP_SSID),
            .password = AP_PASS,
            .max_connection = MAX_STA_CONN,
            .authmode = WIFI_AUTH_WPA_WPA2_PSK,
        },
    };

    if (strlen(AP_PASS) == 0) {
        wifi_config.ap.authmode = WIFI_AUTH_OPEN;
    }

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());
}

void app_main(void) {
    wifi_init_ap();
}

코드 설명

  1. AP 모드 초기화: wifi_init_ap() 함수는 NVS 초기화, 이벤트 루프 생성, 네트워크 인터페이스 설정을 수행하고 AP 모드를 활성화합니다.
  2. 이벤트 핸들러: AP 시작, 클라이언트 연결, 클라이언트 해제에 대한 이벤트를 처리합니다.
  3. Wi-Fi AP 설정: SSID, 비밀번호, 최대 연결 수 등을 설정하고 AP 모드를 시작합니다. 비밀번호가 설정되지 않은 경우 인증 모드를 WIFI_AUTH_OPEN으로 설정합니다.

STA 모드와 AP 모드의 차이점

  • STA 모드: ESP32가 Wi-Fi 네트워크에 클라이언트로 연결되어 인터넷이나 다른 장치와 통신합니다.
  • AP 모드: ESP32가 액세스 포인트가 되어 다른 장치들이 ESP32에 연결할 수 있는 네트워크를 제공합니다.

두 모드는 동시에 사용될 수 있으며, 이를 Dual Mode라고 합니다. Dual Mode를 활용하면 ESP32가 네트워크에 연결된 상태에서 다른 장치들을 연결할 수 있습니다.

결론

오늘은 ESP32 IDF를 활용하여 Wi-Fi 기능을 설정하는 방법에 대해 살펴보았습니다. Wi-Fi STA 모드로 ESP32를 기존 네트워크에 연결하는 방법과 Wi-Fi AP 모드를 통해 ESP32가 액세스 포인트 역할을 하는 방법을 설명하였습니다. 이를 활용하여 다양한 IoT 프로젝트에서 ESP32의 강력한 Wi-Fi 기능을 사용해 보세요.

반응형