ESP32 IDF

ESP32 IDF IoT - 클라우드와의 통신 방법

임베디드 친구 2024. 11. 18. 09:32
반응형

안녕하세요, 소프트웨어 공장 방문자 여러분! 이번 포스트에서는 ESP32를 이용해 IoT 시스템을 구축하고 클라우드와 통신하는 방법에 대해 다루어 보겠습니다. ESP32는 강력한 Wi-Fi 및 Bluetooth 기능을 갖춘 저비용 마이크로컨트롤러로, 다양한 IoT 프로젝트에 사용하기 좋습니다. 이번 튜토리얼에서는 VS Code 개발 환경을 사용해 ESP32 IDF로 IoT 시스템을 구축하고 클라우드 서비스와 데이터를 주고받는 방법을 설명해드리겠습니다.

1. 준비물

  • ESP32 보드
  • USB 케이블
  • VS Code 및 ESP-IDF 플러그인 설치됨
  • 인터넷 연결
  • MQTT 브로커 계정 (여기서는 Adafruit IO를 예제로 사용합니다)

2. 개발 환경 설정

ESP32 개발을 위한 ESP-IDF(ESP32 IoT Development Framework)와 VS Code를 이미 설치하셨으니, 간단하게 프로젝트를 생성하고 클라우드와 통신할 준비를 해봅시다.

먼저, VS Code에서 ESP-IDF 플러그인을 사용하여 새로운 프로젝트를 생성합니다.

  1. VS Code를 열고 Ctrl + Shift + P를 눌러 명령 팔레트를 엽니다.
  2. "ESP-IDF: Create project"를 선택한 후 프로젝트 이름과 경로를 설정합니다.
  3. 기본 템플릿으로 blink 프로젝트를 선택합니다.

이제 기본적인 프로젝트 구조가 생성되었습니다. 다음으로는 IoT 프로젝트의 핵심인 Wi-Fi 연결과 클라우드 통신 기능을 추가해보겠습니다.

3. Wi-Fi 설정 및 MQTT 통신 준비

ESP32와 클라우드 간의 통신을 위해 MQTT 프로토콜을 사용하겠습니다. MQTT는 가볍고 효율적인 메시징 프로토콜로, IoT 환경에 매우 적합합니다.

프로젝트 생성 후 main 폴더 내의 main.c 파일을 열고 코드를 다음과 같이 수정하여 Wi-Fi 연결과 MQTT 설정을 추가합니다.

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs_flash.h"
#include "esp_wifi.h"
#include "mqtt_client.h"

#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASS "your_wifi_password"
#define MQTT_BROKER_URI "mqtt://io.adafruit.com"

static void wifi_init(void) {
    esp_netif_init();
    esp_event_loop_create_default();
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    esp_wifi_init(&cfg);

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

static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {
    // MQTT 이벤트 처리 로직을 추가하세요.
    if (event_id == MQTT_EVENT_CONNECTED) {
        printf("MQTT Connected\n");
    } else if (event_id == MQTT_EVENT_DISCONNECTED) {
        printf("MQTT Disconnected\n");
    }
}

static void mqtt_app_start(void) {
    esp_mqtt_client_config_t mqtt_cfg = {
        .uri = MQTT_BROKER_URI,
    };
    esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);
    esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL);
    esp_mqtt_client_start(client);
}

void app_main(void) {
    nvs_flash_init();
    wifi_init();
    mqtt_app_start();
}

설명

  • wifi_init(): Wi-Fi에 연결하기 위한 초기화 함수입니다. 사용자의 Wi-Fi SSID와 비밀번호를 설정하고 연결을 시작합니다.
  • mqtt_event_handler(): MQTT 클라이언트의 이벤트를 처리하는 함수입니다. 연결 성공 또는 실패와 같은 이벤트를 처리합니다.
  • mqtt_app_start(): MQTT 클라이언트를 초기화하고 브로커와 연결을 설정합니다.

위의 코드를 통해 ESP32는 Wi-Fi 네트워크에 연결되고, MQTT 브로커와 연결을 시도하게 됩니다.

4. MQTT를 이용한 데이터 송수신

ESP32가 Wi-Fi에 연결된 후 MQTT를 사용해 데이터를 송수신할 수 있습니다. 다음은 간단한 온도 센서 데이터를 Adafruit IO에 전송하는 예제입니다.

추가 코드: DHT22 센서 데이터 전송

#include "dht.h"
#define DHT_PIN GPIO_NUM_4

static void sensor_task(void *pvParameter) {
    while (1) {
        int16_t temperature = 0;
        int16_t humidity = 0;
        if (dht_read_data(DHT_TYPE_DHT22, DHT_PIN, &humidity, &temperature) == ESP_OK) {
            printf("Temperature: %d\u00b0C, Humidity: %d%%\n", temperature / 10, humidity / 10);
            char payload[50];
            snprintf(payload, sizeof(payload), "{\"temperature\": %d, \"humidity\": %d}", temperature / 10, humidity / 10);
            esp_mqtt_client_publish(client, "your_adafruit_io_feed", payload, 0, 1, 0);
        } else {
            printf("Failed to read data from sensor\n");
        }
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}

위 코드에서 sensor_task 함수는 주기적으로 DHT22 센서에서 온도와 습도를 읽고, MQTT를 통해 클라우드에 데이터를 전송합니다.

5. Adafruit IO에서 데이터 시각화

Adafruit IO는 IoT 장치에서 전송된 데이터를 시각화할 수 있는 매우 유용한 클라우드 서비스입니다. 계정을 생성하고 피드를 만들면, ESP32에서 전송한 데이터를 실시간으로 확인할 수 있습니다.

  1. Adafruit IO에 로그인하고 새로운 대시보드를 생성합니다.
  2. "Create New Block"을 클릭하고, 데이터 유형에 맞는 위젯(예: 차트나 게이지)을 선택합니다.
  3. ESP32에서 데이터를 게시할 피드 이름을 설정합니다.

이제 ESP32에서 전송한 온도 및 습도 데이터를 웹 대시보드에서 실시간으로 시각화할 수 있습니다.

6. 결론

이번 포스트에서는 ESP32와 VS Code 개발 환경을 사용해 IoT 시스템을 구축하고, 클라우드 서비스(Adafruit IO)를 통해 데이터를 송수신하는 방법을 다루었습니다. 이 과정을 통해 ESP32의 강력한 기능을 활용하여 IoT 장치와 클라우드를 통합하는 방법을 익힐 수 있었을 것입니다.

더 다양한 클라우드 서비스와 ESP32의 기능을 결합하여 더욱 복잡하고 유용한 IoT 시스템을 구축할 수 있으니, 자유롭게 응용해 보세요.

반응형

'ESP32 IDF' 카테고리의 다른 글

ESP32 디버깅(Debugging) 및 성능 최적화(Optimization)  (0) 2024.11.17
ESP32 IDF OTA 펌웨어 업데이트  (0) 2024.11.16
ESP32 IDF 파일 시스템 - SPIFFS, FATFS  (0) 2024.11.15
ESP32 IDF Sleep  (0) 2024.11.14
ESP32 IDF UART  (0) 2024.11.13