ESP32应用开发——天气预报

  • Post author:
  • Post category:其他




介绍

本文主要介绍ESP32联网访问

知心天气

平台获取深圳未来三天天气情况,并显示到OLED显示屏上。



一、开发环境

乐鑫自主研发ESP-IDF开发环境

版本:v4.3-beta3

开发环境搭建方法:

参考乐鑫官方文档:

https://docs.espressif.com/projects/esp-idf/zh_CN/v4.3-beta3/esp32c3/get-started/index.html


更多版本开发环境搭建教程切换方法:

在这里插入图片描述

在这里插入图片描述



二、硬件部分



硬件组成

  1. 开发板:

    ESP32-S
  2. OLED显示屏:

    0.96寸OLED

    (SSD1306)
  3. 安卓接口数据线



硬件接线

ESP32 OLED
V3.3 V3.3
GND GND
IO21 SDA
IO22 SCL



三、软件部分

第三方库的准备:

  1. OLED显示屏的驱动
  2. cJSON函数库

    关于OLED显示屏的驱动库的获取途径有很多,网上相关教程很多,淘宝店也有资料下载。cJSON库的获取方式就更多了,网上教程也很多,这里就不过多介绍。



1. 程序流程

整个工程代码的流程如下:

在这里插入图片描述



2.程序详解



WiFi部分程序

WiIFi连接参数配置

	wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));	//设置ESP32处于STA模式
	
	wifi_config_t wifi_config= {
        .sta = {
            .ssid = WiFi_STA_SSID,						//设置室内WiFi账号
			.password = WiFi_STA_PASSWORD,				//设置室内WiFi密码
			.bssid_set = 0,
		}
	};

WiFi连接的事件处理

	static EventGroupHandle_t wifi_event_group;
	wifi_event_group = xEventGroupCreate();								//创建WiFi事件组				
	ESP_ERROR_CHECK(esp_event_loop_create_default());					//创建事件循环
    esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();		
    assert(sta_netif);
    ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));	//注册WiFi连接事件至event loop中
	ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));	//注册IP获取事件至event loop中

事件处理部分

	if(event_base == WIFI_EVENT){
		wifi_event_sta_connected_t *wifi_sta_event = (wifi_event_sta_connected_t*) event_data;
		switch(event_id){
			case WIFI_EVENT_STA_START:			//开始连接WiFi
				...
				esp_wifi_connect();
				break;
			case WIFI_EVENT_STA_CONNECTED:		//处理WiFi
				...
				break;
			case WIFI_EVENT_STA_DISCONNECTED:
				...
				break;
			default:
				break;
		}
	}else if(event_base ==  IP_EVENT){
		ip_event_got_ip_t* ip_event = (ip_event_got_ip_t*) event_data;
		if(event_id == IP_EVENT_STA_GOT_IP){	//获取IP
			...
			//start http  task
			xTaskCreate(http_client_task, "http_client", 5120, NULL, 3, NULL);
		}
	}



HTTP部分程序

连接目标服务器、发送get请求并接收响应数据

关于知心天气的访问接口等详情,参考知心官网:

https://seniverse.yuque.com/books/share/e52aa43f-8fe9-4ffa-860d-96c0f3cf1c49/sl6gvt


在这里插入图片描述

	char output_buffer[MAX_HTTP_OUTPUT_BUFFER] = {0};   				//保存相应信息的字符数组
    int content_length = 0;
    //URL为你的知心账户中获取天气实况的域名,其组成如下:
	static const char *URL = "http://"HOST"/v3/weather/daily.json?key="UserKey"&location="Location"&language="Language"&unit=c&start="Strat"&days="Days;
    esp_http_client_config_t config = {
        .url = URL,
    };
    esp_http_client_handle_t client = esp_http_client_init(&config);	//初始化http连接

    // GET Request
    esp_http_client_set_method(client, HTTP_METHOD_GET);
    esp_err_t err = esp_http_client_open(client, 0);
    if (err != ESP_OK) {
        ESP_LOGE(HTTP_TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err));
    } else {
        content_length = esp_http_client_fetch_headers(client);
        if (content_length < 0) {
            ESP_LOGE(HTTP_TAG, "HTTP client fetch headers failed");
        } else {
            int data_read = esp_http_client_read_response(client, output_buffer, MAX_HTTP_OUTPUT_BUFFER);
            if (data_read >= 0) {
                ESP_LOGI(HTTP_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", output_buffer);
				...
            } else {
                ESP_LOGE(HTTP_TAG, "Failed to read response");
            }
        }
    }
    esp_http_client_close(client);
	vTaskDelete(NULL);



OLED部分程序

初始化OLED显示屏

	i2c_master_init(&SSD1306, SSD1306_SDA_GPIO, SSD1306_SCL_GPIO, SSD1306_RST_GPIO);	//初始化i2c
	SSD1306._flip = true;
	ssd1306_init(&SSD1306, 128, 64);													//初始化ssd1306

显示数据

	ssd1306_clear_screen(&SSD1306, false);							//清屏
	ssd1306_contrast(&SSD1306, 0xff);								//设置对比度
	ssd1306_display_text(&SSD1306, 0, "Hello ESP32", 11, false);	//显示



3.工程程序获取

码云平台:

https://gitee.com/ritage/esp32-demo



工程效果

在这里插入图片描述



版权声明:本文为weixin_39506567原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。