[作品提交] 基于ESP32的在线天气时钟

Tristan_C   2022-10-16 00:40 楼主

 

基于ESP32的在线天气时钟

 

作者:  Tristan_C      

一、作品简介
本项目为《基于ESP32的在线天气时钟》通过开发板上各自的ESP32-S2和ESP-S3进行Wi-Fi联网,并通过https的方式连接天气服务提供商”心知天气“,获取本地的整点天气实况,包括了本地的温度和适度,等信息。

二、系统框图
项目硬件上利用digi-key提供的esp32开发板,且主要使用其上面的esp32-s2(ESP32-S2-Kaluga-1)和esp32-s3(ESP32-S3-DEVKITC-1-N8R2)这两个模块上的ESP32芯片,并利用串口与上位机PC进行交互,如将系统运行信息进行打印,并将签署的整点天气实况,包括班底的温度和湿度等信息,进行打印。

硬件部分框图如下

image-20221016015417-1.png  

软件部分主要利用乐鑫提供的ESP-IDF丰富的例程中esp_http_client_test,使用Wi-Fi,以及http组件进型开发

image-20221016015417-2.png  

 

三、各部分功能说明

(各部分实现的功能说明及讲解,以图文结合的展示。)

  1. 开发环境的搭建

本次软件开发环境是Windows10 +esp-idf + vscode

1)软件下载

下载地址:https://code.visualstudio.com/

image-20221016015417-3.png  

 安装过程不赘述了,需要注意的是,安装时,下面的选项最好选择打勾

image-20221016015417-4.png  

  1. ESP-IDF的插件安装

在插件中搜索“ESP-IDF”,点击“indtall”

image-20221016015417-5.png  

安装好之后选择“ADVANCED”进行配置

image-20221016015417-6.png  

 配置过程中,有一个路径选择的配置项

可以参考如下进行创建和配置,放在一个合适位置,同一个文件夹下放idf和tools工具

image-20221016015417-7.png  

image-20221016015417-8.png  

 3)安装就一直安装即可,需要注意的是,期间有可能会安装失败,只要多重试,即可实现安装完成

4)安装好之后,搜索“ESP-IDF:Example”,创建/打开例程

image-20221016015417-9.png  

image-20221016015417-10.png  

 创建时,保存工程到合适位置即可

5)之后可在VScode查看相对应的功能按钮

image-20221016015417-11.png  

 6)选择端口和芯片类型

image-20221016015417-12.png  

image-20221016015417-13.png  

7)编译

image-20221016015417-14.png  

image-20221016015417-15.png  

8)使用串口monitor

image-20221016015417-16.png  

 9)另外可以使用如下的几条命令

编译命令: idf.py build

下载命令: idf.py -p COMXXX flash

打开串口监视:idf.py -p COMXXX monitor

清除工程:idf.py fullclean

命令可以使用插件的下面这个按钮打开

image-20221016015417-17.png  

  1. 如果遇到芯片选择错误,或者需要更改芯片型号,可以如下方式

del Env:\IDF_TARGET

idf.py fullclean

idf.py set-target esp32s3

至此,开发环境算是搭建完成

  1. 心知天气

获取天气和温度我们可以通过心知天气的API进行,心知天气网站:https://www.seniverse.com/

其提供了免费版本的方式,对访问等做了一些限制,但对我们的开发测试已经足够了。

image-20221016015417-18.png  

申请账号,免费版本即可,在控制台的“免费版本”中,可以看到API密钥,其中的私钥就是下面代码调用API接口中需要用到的key值,用此填进去即可。

image-20221016015417-19.png  

  1. 进行本地天气温湿度的获取

以esp32-s3(ESP32-S3-DEVKITC-1-N8R2)为例说明开发过程

  1. 打开命令面板

image-20221016015417-20.png  

  1. 找到”esp_http_client_example”demo code例程,并将函数 “static void http_test_task(void *pvParameters)”完整替换为如下代码:
static void http_test_task(void *pvParameters)
{

//02-1 定义需要的变量
      char output_buffer[MAX_HTTP_OUTPUT_BUFFER] = {0};   //用于接收通过http协议返回的数据
    int content_length = 0;  //http协议头的长度
    

    //02-2 配置http结构体
   
   //定义http配置结构体,并且进行清零
    esp_http_client_config_t config ;
    memset(&config,0,sizeof(config));

    //向配置结构体内部写入url
    static const char *URL = "https://api.seniverse.com/v3/weather/now.json?key=ShYbryRIeeSH_0c2x&location=hangzhou&language=zh-Hans&unit=c";
    config.url = URL;

    //初始化结构体
    esp_http_client_handle_t client = esp_http_client_init(&config);	//初始化http连接

    //设置发送请求 
    esp_http_client_set_method(client, HTTP_METHOD_GET);

    //02-3 循环通讯

    while(1)
    {


    // 与目标主机创建连接,并且声明写入内容长度为0
    esp_err_t err = esp_http_client_open(client, 0);

    //如果连接失败
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err));
    } 
    //如果连接成功
    else {

        //读取目标主机的返回内容的协议头
        content_length = esp_http_client_fetch_headers(client);

        //如果协议头长度小于0,说明没有成功读取到
        if (content_length < 0) {
            ESP_LOGE(TAG, "HTTP client fetch headers failed");
        } 

        //如果成功读取到了协议头
        else {

            //读取目标主机通过http的响应内容
            int data_read = esp_http_client_read_response(client, output_buffer, MAX_HTTP_OUTPUT_BUFFER);
            if (data_read >= 0) {

                //打印响应内容,包括响应状态,响应体长度及其内容
                ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %d",
                esp_http_client_get_status_code(client),				//获取响应状态信息
                esp_http_client_get_content_length(client));			//获取响应信息长度
                printf("data:%s\n", output_buffer);

            #if 0
				//对接收到的数据作相应的处理
                cJSON* root = NULL;
                root = cJSON_Parse(output_buffer);

                cJSON* cjson_item =cJSON_GetObjectItem(root,"results");
                cJSON* cjson_results =  cJSON_GetArrayItem(cjson_item,0);
                cJSON* cjson_now = cJSON_GetObjectItem(cjson_results,"now");
                cJSON* cjson_temperature = cJSON_GetObjectItem(cjson_now,"temperature");
            
                printf("%d\n",cjson_temperature->type);
                printf("%s\n",cjson_temperature->valuestring);
             #endif

              
               
                


            } 
            //如果不成功
            else {
                ESP_LOGE(TAG, "Failed to read response");
            }
        }
    }

    //关闭连接
    esp_http_client_close(client);

    //延时,因为心知天气免费版本每分钟只能获取20次数据
    vTaskDelay(3000/portTICK_PERIOD_MS);

    }
}
  1. 注意上述代码中标红的key为心知天气账号中的key,而location则填写所在地即可,本人的所在地为杭州,因此填写”hangzhou”。
  2. 编译下载成功之后运行效果如下

image-20221016015417-21.png  

image-20221016015417-22.png  

可以看到,设备启动,并成功联网,对心知天气服务进行了访问,并成功获取整天实时天气信息。

  1. 对于ESP32-S2模块芯片,则按照前述的芯片更改方法进行更改,并编译下载运行即可。
  • 作品源码

链接:https://download.eeworld.com.cn/detail/Tristan_C/625520
 

五、作品功能演示视频

同上分享信息,内有包含测试视频信息

六、项目总结

不得不说,物联网的魅力在于连接,毫无疑问的是乐鑫做到了这一点,并结合了强大的处理器,以及配套的完善的更能体现软实力的idf,推出了ESP32系列,使其名声大噪。本次时间仓促,精力实在也有限,待后续时间宽裕,必当细细研究,更期待能在后续的产品上,能使其用于适合产品的量产。

  • 其他

 

 

 

 

 

 

补充内容 (2022-10-27 13:51): 视频链接:https://training.eeworld.com.cn/video/34704

回复评论 (8)

恭喜完成作品
点赞  2022-10-16 09:01
这个项目不是esp32很基础的例程了吗?一堆桌面小时钟都是这样的啊。
点赞  2022-10-16 09:45

完成的很好很好

点赞  2022-10-16 12:53

恭喜完成作品

点赞  2022-10-16 14:57
感谢作者的分享,自己有时间也想研究下这方面的内容。
点赞  2022-10-16 16:30
引用: Honghuzaitian 发表于 2022-10-16 09:45 这个项目不是esp32很基础的例程了吗?一堆桌面小时钟都是这样的啊。

对大神们来说可能确实简单,见笑了哈

点赞  2022-10-16 23:32
引用: Tristan_C 发表于 2022-10-16 23:32 对大神们来说可能确实简单,见笑了哈

也不能说简单吧,但是确实是比较容易复现的作品。做出来不难,但是要做好也不简单。

点赞 (1) 2022-10-17 00:25
引用: Honghuzaitian 发表于 2022-10-17 00:25 也不能说简单吧,但是确实是比较容易复现的作品。做出来不难,但是要做好也不简单。

确实是,也是看做到什么程度。多谢指教

点赞  2022-10-17 09:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复