361|1

219

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【2024 DigiKey 创意大赛】+总结 [复制链接]

 

基于ESP32-S3和rp2040双核心的智能温湿度显示系统

作者:meiyao

一、作品简介

 

本项目是利用自己设计一款功能强大的PCB扩展板,与现有的Espressif(乐鑫)ESP32-S3-LCD-EV-Board触摸屏显示评估板相连接,实现温湿度数据显示、数据存储等实用功能。使用软件部分将基于ESP32-S3和rp2040双核心进行通信开发,其中ESP32-S3作为主核心负责LVGL用户交互界面的运行和显示,而rp2040作为副核心则负责温湿度数据的采集、处理以及与主核心的两者之间通信,并实时的显示在屏上,而且也在PC端进行数据打印,使用LVGL界面显示时间,目前采集的数据等功能。

 

二、系统框图

 

硬件连接示意图:

 

硬件示意图上面是分两个板,一个是Espressif(乐鑫)ESP32-S3-LCD-EV-Board触摸屏显示评估板,一个是自己设计的PICO转接板。

 

Espressif(乐鑫)ESP32-S3-LCD-EV-Board触摸屏显示评估板相连接,实现温湿度数据显示、数据存储等实用功能。采用rp2040副核心,Bosch的BME280传感器,为用户提供便捷的数据传输和实时环境监测功能。

下面请看软件流程图:

 

 

 

工作流程图描述

将PCB扩展板与ESP32-S3-LCD-EV-Board触摸屏显示评估板相连接。

连接rp2040副核心板,确保通信接口(UART)正确连接。

软件初始化

在ESP32-S3主核心上安装并配置LVGL(Light and Versatile Graphics Library)以支持用户交互界面。

在rp2040副核心上编写并安装温湿度数据采集和处理程序。

配置主核心和副核心之间的通信协议(UART通信)。

温湿度数据采集

副核心(rp2040)启动温湿度传感器,开始数据采集。

副核心处理采集到的温湿度数据,可能包括数据滤波、校准等处理步骤。

数据通信

副核心将处理后的温湿度数据通过预定义的通信协议发送给主核心(ESP32-S3)。

数据显示

主核心使用LVGL在触摸屏上显示温湿度数据。

显示界面可能包括当前温湿度值、时间等。

数据打印(PC端)

主核心通过串口通信或其他方式将温湿度数据发送到PC端。

实时监控与反馈

系统持续监控温湿度数据的变化。

如果数据超出预设范围,系统可以通过用户界面提供警告或报警信息。

结束

 

 

三、各部分功能说明

 

硬件部分

ESP32-S3-LCD-EV-Board是一款功能强大的触摸屏显示评估板,使用的是ESP32-S3芯片设计。具备双核CPU和强大的AI算力,为屏幕方案带来灵敏的触控体验、流畅的GUI响应,以及高性能的离、在线人机语音交互功能。支持IIC、SPI、UART、8080等多种接口类型,能够驱动多种分辨率和接口的LCD显示屏,满足用户对不同触摸屏应用产品的开发需求。配备了一块480×480分辨率的触摸屏,能够清晰地显示图像和文本信息,方便用户进行交互操作。

 

PICO与BMP280:

BMP280传感器通常通过I²C接口与副板PICO进行连接,这个是自己设计的板了,已经集成在下图紫色的板上。

在连接时,需要确保BMP280的VCC、GND、SCL(时钟线)、SDA(数据线)等引脚与副板PICO的相应引脚正确对接。为什么要提出来,因为这个东西蛮小,而且很容易弄错方向,但不好处理的是不好焊接。

PICO是最小系统核心板,使用排针进行板载对接。

 

 

 

 

PICO与ESP32 S3通信上PC端输出的数据:

屏幕上实际输出画面:

 

四、作品源码

界面设计:

利用LVGL(Light and Versatile Graphics Library)库,设计直观、易用的用户交互界面,界面应包含温湿度数据显示区域、数据刷新按钮。

数据更新与显示:

编写程序,使ESP32-S3主核心能够实时接收来自rp2040副核心的温湿度数据。

利用LVGL库中的图表或标签等控件,将接收到的数据动态显示在界面上。

实现数据刷新功能,用户点击刷新按钮时,界面将更新显示最新的温湿度数据。

LVGL用户交互界面实现:
static lv_disp_t *display_init(ESP_PanelLcd *lcd)
{
    ESP_PANEL_CHECK_FALSE_RET(lcd != nullptr, nullptr, "Invalid LCD device");
    ESP_PANEL_CHECK_FALSE_RET(lcd->getHandle() != nullptr, nullptr, "LCD device is not initialized");

    static lv_disp_draw_buf_t disp_buf;
    static lv_disp_drv_t disp_drv;

    // Alloc draw buffers used by LVGL
    void *buf[LVGL_PORT_BUFFER_NUM_MAX] = { nullptr };
    int buffer_size = 0;

    ESP_LOGD(TAG, "Malloc memory for LVGL buffer");
#if !LVGL_PORT_AVOID_TEAR
    // Avoid tearing function is disabled
    buffer_size = LVGL_PORT_BUFFER_SIZE;
    for (int i = 0; (i < LVGL_PORT_BUFFER_NUM) && (i < LVGL_PORT_BUFFER_NUM_MAX); i++) {
        buf[i] = heap_caps_malloc(buffer_size * sizeof(lv_color_t), LVGL_PORT_BUFFER_MALLOC_CAPS);
        assert(buf[i]);
        ESP_LOGD(TAG, "Buffer[%d] address: %p, size: %d", i, buf[i], buffer_size * sizeof(lv_color_t));
}

温湿度数据采集与处理

传感器初始化与配置:

在rp2040副核心上编写代码,初始化BME280传感器,并配置其采集模式和采样率等参数。

数据采集与传输:

编写数据采集循环,使rp2040能够定期从BME280传感器读取温湿度数据。

实现数据通信协议,将采集到的数据通过UART、SPI等通信接口发送给ESP32-S3主核心。

 



温湿度数据采集与处理
    Serial.begin(115200);
    while(!Serial);    // time to get serial running
    Serial.println(F("BME280 test"));

    unsigned status;

    status = bme.begin();  
    
    if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
        Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
        Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
        Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
        Serial.print("        ID of 0x60 represents a BME 280.\n");
        Serial.print("        ID of 0x61 represents a BME 680.\n");
        while (1) delay(10);

if (isnan(temperature) || isnan(humidity)) {  
    // 如果读取失败,则通过串口输出错误信息  
    Serial.println("Failed to read from BME280 sensor!");  
} else {  
    // 如果温度和湿度数据读取成功,则执行以下操作  
      
    // 创建一个静态JSON文档对象,分配200字节的内存空间  
    // 用于存储JSON格式的数据  
    StaticJsonDocument<200> doc;  
      
    // 向JSON文档中添加温度数据  
    doc["temperature"] = temperature;  
      
    // 向JSON文档中添加湿度数据  
    doc["humidity"] = humidity;  
      
    // 假设pressure和altitude变量已经通过某种方式获取(例如从BME280传感器)  
    // 向JSON文档中添加气压数据  
    doc["pressure"] = pressure;  
      
    // 向JSON文档中添加海拔数据(注意:BME280传感器本身不提供海拔数据,  
    // 这里可能是通过其他方式计算或获取的)  
    doc["altitude"] = altitude;  
      
    // 创建一个字符串对象,用于存储序列化后的JSON数据  
    String jsonString;  
      
    // 使用serializeJson函数将JSON文档序列化为字符串  
    // 并存储在jsonString变量中  
    serializeJson(doc, jsonString);  
      
    // 通过串口输出序列化后的JSON字符串(通常用于调试)  
    Serial.println(jsonString);   
      
    // 通过Serial1串口输出序列化后的JSON字符串  
    // 这可能用于将数据发送到其他设备或系统  
    Serial1.println(jsonString);   
}
显示地理位置代码:
    String cityCode = "66666";                         // 查看你的 城市代码
    String userKey = "66666"; // 要去注册一个高德地图的开发用户

esp-bsp 库,使用 VSCode 打开 esp-bsp 文件夹, bsp/esp32_s3_eye/esp32_s3_eye.c 文件, bsp_display_lcd_init()函数,下代码所示:
static lv_display_t *bsp_display_lcd_init(const bsp_display_cfg_t *cfg)
{
    assert(cfg != NULL);
    esp_lcd_panel_io_handle_t io_handle = NULL;
    esp_lcd_panel_handle_t panel_handle = NULL;
    const bsp_display_config_t bsp_disp_cfg = {
        .max_transfer_sz = BSP_LCD_DRAW_BUFF_SIZE * sizeof(uint16_t),
    };
    BSP_ERROR_CHECK_RETURN_NULL(bsp_display_new(&bsp_disp_cfg, &panel_handle, &io_handle));

#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)
    esp_lcd_panel_disp_off(panel_handle, false);
#else
    esp_lcd_panel_disp_on_off(panel_handle, true);
#endif

    /* Add LCD screen */
    ESP_LOGD(TAG, "Add LCD screen");
    const lvgl_port_display_cfg_t disp_cfg = {
        .io_handle = io_handle,
        .panel_handle = panel_handle,
        .buffer_size = cfg->buffer_size,
        .double_buffer = cfg->double_buffer,
        .hres = BSP_LCD_H_RES,
        .vres = BSP_LCD_V_RES,
        .monochrome = false,
        /* Rotation values must be same as used in esp_lcd for initial settings of the screen */
        .rotation = {
            .swap_xy = false,
            .mirror_x = false,
            .mirror_y = false,
        },
        .flags = {
            .buff_dma = cfg->flags.buff_dma,
            .buff_spiram = cfg->flags.buff_spiram,
#if LVGL_VERSION_MAJOR >= 9
            .swap_bytes = (BSP_LCD_BIGENDIAN ? true : false),
#endif
        }
    };

    return lvgl_port_add_disp(&disp_cfg);
}


// 显示屏初始化函数
lv_disp_t* initialize_display(const bsp_display_cfg_t* cfg) {
    // 使用esp-bsp库初始化LCD显示屏的代码
    // ...
    // 返回LVGL显示屏句柄
}

// 温湿度数据采集与处理函数
void read_and_process_sensor_data() {
    // 初始化串口和BME280传感器
    // ...
    // 读取温度和湿度数据
    // ...
    // 处理数据(例如,创建JSON文档并输出)
    // ...
}

// 主函数或其他调用点
void setup() {
    // 初始化显示屏
    lv_disp_t* disp = initialize_display(/* 配置参数 */);
    
    // 读取并处理传感器数据
    read_and_process_sensor_data();
    
    // 其他初始化代码...
}

 

 

五、作品功能演示视频

视频:

58cc23bcdb4cbf183c7875e692d04567


67d78eec74b8c8e8ae0e56c8642c37ab

文档:
DigiKey_contest_2024_word.doc (1.62 MB, 下载次数: 3)

原码:

https://download.eeworld.com.cn/detail/meiyao/634898
【2024 DigiKey 创意大赛】+功能

https://bbs.eeworld.com.cn/thread-1298153-1-1.html

【2024 DigiKey 创意大赛】+硬件准备

https://bbs.eeworld.com.cn/thread-1298135-1-1.html

 

总结:

一个基于ESP32-S3和rp2040双核心的智能温湿度显示系统。硬件部分通过连接BME280传感器实现数据采集,软件部分则利用LVGL库设计用户交互界面,并实时显示温湿度数据。ESP32-S3作为主核心负责界面运行与数据显示,而rp2040则负责数据采集与传输。项目关键工作包括界面设计、数据更新与显示、LVGL用户交互界面实现以及温湿度数据采集与处理。通过此系统,用户可直观获取当前环境的温湿度信息。

 

 

 

 

ev_board2A.zip

60.29 MB, 下载次数: 0

ev_board2A.zip

60.29 MB, 下载次数: 0

ev_board2A.zip

60.29 MB, 下载次数: 0

最新回复

界面设计、数据更新与显示、LVGL用户交互界面实现以及温湿度数据采集与处理,几个部分,该有的都有了,不错   详情 回复 发表于 2024-11-6 07:24
点赞 关注
 
 

回复
举报

6802

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

界面设计、数据更新与显示、LVGL用户交互界面实现以及温湿度数据采集与处理,几个部分,该有的都有了,不错

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表