【DigiKey好物畅享】Espressif ESP32-C61-DEVKITC-1-N8R2获取当地天气

一. 前言

ESP32-C61-DEVKITC-1-N8R2核心板搭载了ESP32-C61模组,支持蓝牙和WiFi功能。该核心板的具体部件如下图所示,可以看到已经将大多数接口引出到两侧排针,便于后续开发。

该核心板的排针引脚定义如下图所示

本文将介绍使用ESP32-C61-DEVKITC-1-N8R2,利用ESP-IDF开发,实现WiFi连接,获取当地天气信息并在串口输出。

二. WiFi连接

输入家中的WiFi信息,需要注意的是,ESP32-C61只支持2.4G WiFi,因此输入的WiFi信息不应为5G网络。

#define WIFI_SSID      "******"
#define WIFI_PASS      "******"

在ESP-IDF中,官方已经给出了不少用于WiFi初始化的函数,可以通过调用完成WiFi初始化连接,在以下这段代码中,完成了WiFi初始化以及天气信息获取和输出的调用,天气信息相关的实现将在下一节介绍。

wifi_config_t wifi_config = {
    .sta = {
        .ssid = WIFI_SSID,
        .password = WIFI_PASS,
        .threshold.authmode = WIFI_AUTH_WPA2_PSK,
        .pmf_cfg = {
            .capable = true,
            .required = false
        },
    },
};

三. 天气信息获取与解析

天气信息通过订阅网址http://t.weather.itboy.net/api/weather/city/+当地代码获取,这个网址的信息以json格式排布,可以通过解析这些信息获取到当前天气信息以及未来几天的天气信息。

定义天气获取的任务,在这里订阅天气网址信息

// 获取天气任务
void fetch_weather_task(void *pvParameters)
{
    while(1) {
        ESP_LOGI(TAG, "正在获取天气数据...");
        
        // 配置HTTP客户端
        esp_http_client_config_t config = {
            .url = WEATHER_API_URL,
            .event_handler = http_event_handler,
            .timeout_ms = 5000,
        };
        
        esp_http_client_handle_t client = esp_http_client_init(&config);
        esp_err_t err = esp_http_client_perform(client);
        
        if (err == ESP_OK) {
            ESP_LOGI(TAG, "HTTP请求成功");
        } else {
            ESP_LOGE(TAG, "HTTP请求失败: %s", esp_err_to_name(err));
        }
        
        esp_http_client_cleanup(client);
        
        // 等待一段时间后再次获取
        vTaskDelay(pdMS_TO_TICKS(WEATHER_UPDATE_INTERVAL_MS));
    }
}

成功订阅网站之后,需要获取并解析网站上的json信息,并将这些信息存放到需要输出的字符信息之中

// 解析JSON数据
cJSON *root = cJSON_Parse(output_buffer);
if (root != NULL) {
    cJSON *message = cJSON_GetObjectItem(root, "message");
    if (message && strcmp(message->valuestring, "success感谢又拍云(upyun.com)提供CDN赞助") == 0) {
        cJSON *cityInfo = cJSON_GetObjectItem(root, "cityInfo");
        cJSON *data = cJSON_GetObjectItem(root, "data");
        
        if (cityInfo) {
            cJSON *city = cJSON_GetObjectItem(cityInfo, "city");
            if (city) {
                strncpy(s_weather_data.city, city->valuestring, sizeof(s_weather_data.city) - 1);
            }
        }
        
        if (data) {
            cJSON *forecast = cJSON_GetArrayItem(cJSON_GetObjectItem(data, "forecast"), 0);
            if (forecast) {
                cJSON *type = cJSON_GetObjectItem(forecast, "type");
                cJSON *high = cJSON_GetObjectItem(forecast, "high");
                cJSON *low = cJSON_GetObjectItem(forecast, "low");
                cJSON *fx = cJSON_GetObjectItem(forecast, "fx");
                cJSON *fl = cJSON_GetObjectItem(forecast, "fl");
                
                if (type) {
                    strncpy(s_weather_data.weather, type->valuestring, sizeof(s_weather_data.weather) - 1);
                }
                if (high && low) {
                    snprintf(s_weather_data.temperature, sizeof(s_weather_data.temperature), 
                            "%s ~ %s", low->valuestring, high->valuestring);
                }
                if (fx && fl) {
                    snprintf(s_weather_data.wind, sizeof(s_weather_data.wind), 
                            "%s%s", fx->valuestring, fl->valuestring);
                }
            }
            
            cJSON *wendu = cJSON_GetObjectItem(data, "wendu");
            cJSON *shidu = cJSON_GetObjectItem(data, "shidu");
            cJSON *report = cJSON_GetObjectItem(data, "report");
            
            if (shidu) {
                strncpy(s_weather_data.humidity, shidu->valuestring, sizeof(s_weather_data.humidity) - 1);
            }
            if (report) {
                strncpy(s_weather_data.report_time, report->valuestring, sizeof(s_weather_data.report_time) - 1);
            }
        }

四. 结果展示

调用WiFi初始化与天气信息获取输出函数,实现天气信息的输出

void app_main(void)
{
    // 初始化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);

    ESP_LOGI(TAG, "启动WiFi Station模式");
    wifi_init_sta();
}

输出内容如下,可以看到成功获取了网页信息并在串口输出当前的天气信息

五. 心得总结

ESP32-C61-DEVKITC-1-N8R2的ESP32-C61核心有着WiFi功能,可以用于订阅网址获取网页信息,本文利用ESP32-C61订阅了一个开源天气网站并获取了天气信息,对json信息进行解析获取天气信息,最后使用串口将天气信息输出。这个流程基本实现了ESP32-C61的WiFi开发流程,后续可以为ESP32-C61-DEVKITC-1-N8R2添加屏幕设备,让这些WiFi获取到的信息能够可视化。