티스토리 뷰
스테이션 모드(Station Mode)는 ESP32가 Wi-Fi 네트워크에 연결되어 외부 네트워크 또는 인터넷에 액세스할 수 있는 모드입니다. 이 모드에서 ESP32는 Wi-Fi 클라이언트 역할을 하며, 주로 무선 라우터나 다른 액세스 포인트에 연결하여 로컬 네트워크에 참여하고 외부 네트워크와 통신합니다.
스테이션 모드에서 ESP32는 다음과 같은 주요 기능을 수행합니다:
1. Wi-Fi 네트워크에 연결: ESP32는 사전에 설정된 SSID와 암호를 사용하여 Wi-Fi 네트워크에 연결합니다. 이를 통해 ESP32는 해당 네트워크에 가입하고, 다른 디바이스들과 통신할 수 있습니다.
2. 인터넷 액세스: 스테이션 모드에서 ESP32는 외부 인터넷에 액세스할 수 있습니다. 이를 통해 웹 서버에 HTTP 요청을 보내거나, MQTT 브로커에 연결하여 데이터를 전송하는 등의 작업을 수행할 수 있습니다.
3. 데이터 통신: ESP32는 스테이션 모드에서 다른 Wi-Fi 클라이언트나 서버와 데이터를 주고받을 수 있습니다. 이를 통해 IoT 기기로부터 데이터를 수집하거나, 제어 명령을 수신하는 등의 작업을 수행할 수 있습니다.
4. 신호 품질 모니터링: ESP32는 스테이션 모드에서 주변 Wi-Fi 네트워크의 신호 강도를 모니터링할 수 있습니다. 이를 통해 현재 연결된 네트워크의 신호 품질을 확인하거나, 더 나은 신호 품질을 가진 다른 네트워크로 전환하는 등의 작업을 수행할 수 있습니다.
스테이션 모드에서 ESP32는 Wi-Fi 연결을 관리하고 데이터를 전송하기 위해 다양한 Wi-Fi API 및 라이브러리를 사용합니다. 이를 통해 사용자는 ESP32를 무선 네트워크에 연결하고, 다양한 IoT 및 네트워크 응용 프로그램을 구현할 수 있습니다.
esp_wifi_connect
`esp_wifi_connect` 함수는 ESP32의 Wi-Fi 스테이션 모드에서 지정된 AP(액세스 포인트)에 연결하기 위해 사용됩니다. 이 함수는 다음과 같은 형식을 가지고 있습니다:
| esp_err_t esp_wifi_connect() |
이 함수는 현재 설정된 Wi-Fi 설정을 사용하여 AP에 연결을 시도합니다. AP에 연결되면 `ESP_OK`가 반환되고, 연결에 실패하면 적절한 오류 코드가 반환됩니다.
예를 들어, 다음은 Wi-Fi에 연결하는 간단한 예제입니다:
| #include "esp_wifi.h" void wifi_init_sta() { // Wi-Fi 초기화 wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&cfg); // Wi-Fi 스테이션 모드 설정 wifi_config_t wifi_config = { .sta = { .ssid = "YourWiFiSSID", .password = "YourWiFiPassword" }, }; esp_wifi_set_mode(WIFI_MODE_STA); esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config); // Wi-Fi 연결 esp_wifi_connect(); } |
위의 예제에서 "YourWiFiSSID" 및 "YourWiFiPassword"를 실제 SSID와 암호로 대체해야 합니다. 이 코드는 ESP32를 스테이션 모드로 설정하고 지정된 SSID와 암호를 사용하여 Wi-Fi에 연결을 시도합니다.
WIFI_MODE_STA
`WIFI_MODE_STA`는 ESP32의 Wi-Fi 모드 중 하나로, ESP32를 스테이션(Station) 모드로 설정하는 데 사용됩니다. 스테이션 모드에서 ESP32는 Wi-Fi 네트워크에 연결되어 다른 액세스 포인트(AP)와 통신할 수 있습니다. 이 모드에서 ESP32는 클라이언트로 동작하여 외부 네트워크 또는 인터넷에 액세스할 수 있습니다.
스테이션 모드에서 ESP32는 주로 무선 라우터 또는 다른 액세스 포인트에 연결되어 로컬 네트워크에 연결하고, 인터넷에 액세스하는 데 사용됩니다.
예를 들어, 다음은 ESP32를 스테이션 모드로 설정하는 코드의 일부분입니다:
| esp_wifi_set_mode(WIFI_MODE_STA); |
이 코드는 ESP32를 스테이션 모드로 설정합니다. 이후에는 해당 모드에서 Wi-Fi 네트워크에 연결할 수 있습니다.
ESP32코드 셋팅
|
/* Set the SSID and Password via project configuration, or can set directly here */
#define DEFAULT_SSID "MyWi-Fi_1F" #define DEFAULT_PWD "password1234" /* Initialize Wi-Fi as sta and set scan method */
static void fast_scan(void) { ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, NULL)); ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, NULL)); // Initialize default station as network interface instance (esp-netif) esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta(); assert(sta_netif); // Initialize and start WiFi wifi_config_t wifi_config = { .sta = { .ssid = DEFAULT_SSID, .password = DEFAULT_PWD, .scan_method = DEFAULT_SCAN_METHOD, .sort_method = DEFAULT_SORT_METHOD, .threshold.rssi = DEFAULT_RSSI, .threshold.authmode = DEFAULT_AUTHMODE, }, }; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); } void app_main(void)
{ // 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 ); fast_scan(); } |
esp_wifi_scan_start
'esp_wifi_scan_start' 함수는 ESP32에서 Wi-Fi 스캔을 시작하는 데 사용됩니다. 이 함수를 호출하면 ESP32는 주변의 Wi-Fi 네트워크를 스캔하여 감지할 수 있습니다. 이 함수는 다음과 같은 형식을 가지고 있습니다.
| esp_err_t esp_wifi_scan_start(const wifi_scan_config_t *scan_config, bool block) |
- scan_config: Wi-Fi 스캔을 구성하는 데 사용되는 구성 객체에 대한 포인터입니다. 이 매개변수를 NULL로 설정하면 기본 스캔 설정을 사용합니다.
- block: true로 설정하면 스캔이 완료될 때까지 함수가 차단됩니다. false로 설정하면 비차단 모드로 스캔이 시작되며, 스캔이 완료되면 이벤트를 통해 알려줍니다.
이 함수를 사용하여 Wi-Fi 스캔을 시작하면 ESP32가 주변의 Wi-Fi 네트워크를 스캔하고 스캔 결과를 수집합니다. 이후에는 esp_wifi_scan_get_ap_records 함수를 사용하여 스캔 결과를 가져와서 처리할 수 있습니다.
예를 들어, 다음은 ESP32에서 Wi-Fi 스캔을 시작하는 간단한 예제입니다:
| #include "esp_wifi.h" void wifi_scan_example() { // Wi-Fi 초기화 wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&cfg); // Wi-Fi 스캔 구성 설정 wifi_scan_config_t scan_config = { .ssid = NULL, // 모든 SSID를 스캔합니다 .bssid = NULL, // 특정 BSSID에 대해 스캔하지 않습니다 .channel = 0, // 모든 채널에서 스캔합니다 .show_hidden = true // 숨겨진 SSID를 표시합니다 }; // Wi-Fi 스캔 시작 esp_wifi_scan_start(&scan_config, true); } |
이 코드에서는 먼저 Wi-Fi를 초기화하고, wifi_scan_config_t 구조체를 사용하여 Wi-Fi 스캔 구성을 설정합니다. 그런 다음 esp_wifi_scan_start 함수를 호출하여 Wi-Fi 스캔을 시작합니다. 스캔이 완료되면 ESP32는 스캔된 네트워크에 대한 정보를 수집합니다.
esp_err_t esp_wifi_scan_get_ap_num(uint16_t *number)
'esp_wifi_scan_get_ap_num' 함수는 Wi-Fi 스캔 결과에서 감지된 액세스 포인트(AP)의 수를 반환하는 ESP-IDF의 Wi-Fi API 함수입니다. 이 함수는 다음과 같은 형식을 가지고 있습니다.
- number: 스캔된 AP의 수를 저장하기 위한 포인터입니다. 이 포인터는 스캔 결과에 따라 감지된 AP의 총 수로 설정됩니다.
이 함수는 Wi-Fi 스캔을 통해 감지된 AP의 수를 반환합니다. 이후에는 스캔된 AP의 수를 확인하고, 해당 수에 맞게 메모리를 동적으로 할당하여 각 AP의 정보를 저장하거나 처리할 수 있습니다.
예를 들어, 다음은 'esp_wifi_scan_get_ap_num' 함수를 사용하여 스캔된 AP의 수를 확인하고 출력하는 간단한 예제입니다:
| #include "esp_wifi.h" void wifi_scan_example() { // Wi-Fi 초기화 wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&cfg); // Wi-Fi 스캔 시작 esp_wifi_scan_start(NULL, true); // 스캔된 AP의 수 확인 uint16_t ap_num; esp_wifi_scan_get_ap_num(&ap_num); printf("Detected APs: %d\n", ap_num); } |
이 코드에서는 먼저 Wi-Fi를 초기화하고, 'esp_wifi_scan_start' 함수를 사용하여 Wi-Fi 스캔을 시작합니다. 그런 다음 'esp_wifi_scan_get_ap_num' 함수를 사용하여 스캔된 AP의 수를 확인하고 출력합니다.
xTaskCreate
xTaskCreate 함수는 FreeRTOS에서 새로운 Task를 생성하는 함수입니다. 이 함수를 사용하여 Task를 만들고 Task가 실행할 함수와 다양한 매개변수를 설정할 수 있습니다.
이 함수는 다음과 같은 형식을 가지고 있습니다
| BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const configSTACK_DEPTH_TYPE usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask ); |
- pxTaskCode: Task가 실행할 함수의 포인터입니다. 이 함수는 Task가 수행하는 작업을 정의합니다.
- pcName: Task의 이름입니다. 디버깅 및 추적을 위해 사용됩니다.
- usStackDepth: Task의 스택 깊이입니다. Task가 실행되는 동안 필요한 로컬 변수 및 함수 호출에 필요한 메모리 공간을 확보하는 데 사용됩니다.
- pvParameters: Task에 전달할 매개변수입니다. Task가 실행될 때 함수에 전달됩니다.
- uxPriority: Task의 우선 순위입니다. 높은 값은 더 높은 우선 순위를 나타냅니다.
- pxCreatedTask: Task의 핸들을 저장할 포인터입니다. 이 매개변수를 사용하면 Task의 핸들을 나중에 참조할 수 있습니다.
예를 들어, 다음은 간단한 Task를 생성하는 코드입니다
| #include "freertos/FreeRTOS.h" #include "freertos/task.h" void task_function(void *pvParameters) { // Task가 수행할 작업을 여기에 작성합니다. } void app_main() { // Task를 생성합니다. xTaskCreate(&task_function, "Task", 2048, NULL, 5, NULL); // 여기에 다른 작업을 추가할 수 있습니다. // FreeRTOS 스케줄러를 시작합니다. vTaskStartScheduler(); // vTaskStartScheduler() 함수가 리턴되는 경우는 없습니다. } |
위의 예제에서는 `task_function`이라는 함수를 Task로 설정하여 Task를 생성하고 있습니다. 생성된 Task는 "Task"라는 이름을 가지고 있으며, 2048 바이트의 스택 공간을 할당받고, 우선 순위는 5로 설정되어 있습니다. Task에 전달되는 매개변수는 `NULL`이며, Task의 핸들은 사용하지 않고 있습니다.
vTaskDelete
vTaskDelete 함수는 FreeRTOS에서 현재 실행 중인 Task를 삭제하는 함수입니다. 이 함수는 Task가 자체적으로 종료되는 시점에 호출되어야 합니다. Task가 실행을 마치고 삭제되어야 할 때 호출되는 것이 보통입니다.
이 함수는 다음과 같은 형식을 가지고 있습니다.
| void vTaskDelete(TaskHandle_t xTaskToDelete); |
- xTaskToDelete: 삭제할 Task의 핸들입니다. 보통은 `NULL`을 사용하여 현재 실행 중인 Task를 삭제합니다.
예를 들어, 다음은 현재 Task가 자신을 삭제하는 예제 코드입니다:
| #include "freertos/FreeRTOS.h" #include "freertos/task.h" void task_function(void *pvParameters) { // Task가 수행할 작업을 여기에 작성합니다. // 작업을 마치고 Task를 삭제합니다. vTaskDelete(NULL); } void app_main() { // Task를 생성합니다. xTaskCreate(&task_function, "task", 2048, NULL, 5, NULL); // 여기에 다른 작업을 추가할 수 있습니다. } |
위의 예제에서는 task_function 이라는 Task를 생성하고, 해당 Task 안에서 수행할 작업을 정의하고 있습니다. Task가 작업을 완료하고 삭제해야 할 때 vTaskDelete(NULL)을 호출하여 Task를 삭제합니다.

