안녕하세요, 소프트웨어 공장 방문자 여러분! 이번 포스트에서는 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 플러그인을 사용하여 새로운 프로젝트를 생성합니다.
- VS Code를 열고
Ctrl + Shift + P
를 눌러 명령 팔레트를 엽니다. - "ESP-IDF: Create project"를 선택한 후 프로젝트 이름과 경로를 설정합니다.
- 기본 템플릿으로
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에서 전송한 데이터를 실시간으로 확인할 수 있습니다.
- Adafruit IO에 로그인하고 새로운 대시보드를 생성합니다.
- "Create New Block"을 클릭하고, 데이터 유형에 맞는 위젯(예: 차트나 게이지)을 선택합니다.
- 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 |