介绍
本文主要介绍ESP32联网访问
知心天气
平台获取深圳未来三天天气情况,并显示到OLED显示屏上。
一、开发环境
乐鑫自主研发ESP-IDF开发环境
版本:v4.3-beta3
开发环境搭建方法:
参考乐鑫官方文档:
https://docs.espressif.com/projects/esp-idf/zh_CN/v4.3-beta3/esp32c3/get-started/index.html
更多版本开发环境搭建教程切换方法:
二、硬件部分
硬件组成
硬件接线
ESP32 | OLED |
---|---|
V3.3 | V3.3 |
GND | GND |
IO21 | SDA |
IO22 | SCL |
三、软件部分
第三方库的准备:
- OLED显示屏的驱动
-
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 版权协议,转载请附上原文出处链接和本声明。