meiyao 发表于 2024-11-5 23:28

【2024 DigiKey 创意大赛】+总结

<p style="text-align: center;"><span style="font-size:18px;"><strong>基于ESP32-S3和rp2040双核心的智能温湿度显示系统</strong></span></p>

<p style="text-align: right;"><span style="font-size:16px;">作者:meiyao</span></p>

<p><span style="font-size:18px;"><strong>一、作品简介</strong></span></p>

<p align="center">&nbsp;</p>

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

<p>&nbsp;</p>

<p><span style="font-size:18px;"><strong>二、系统框图</strong></span></p>

<p>&nbsp;</p>

<p align="left"><strong>硬件连接示意图:</strong></p>

<p align="left"> &nbsp;</p>

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

<p align="left">&nbsp;</p>

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

<p align="left">下面请看软件流程图:</p>

<p align="left">&nbsp;</p>

<p align="left"> &nbsp;</p>

<p align="left">&nbsp;</p>

<p dir="ltr">工作流程图描述</p>

<p dir="ltr">将PCB扩展板与ESP32-S3-LCD-EV-Board触摸屏显示评估板相连接。</p>

<p dir="ltr">连接rp2040副核心板,确保通信接口(UART)正确连接。</p>

<p dir="ltr">软件初始化</p>

<p dir="ltr">在ESP32-S3主核心上安装并配置LVGL(Light and Versatile Graphics Library)以支持用户交互界面。</p>

<p dir="ltr">在rp2040副核心上编写并安装温湿度数据采集和处理程序。</p>

<p dir="ltr">配置主核心和副核心之间的通信协议(UART通信)。</p>

<p dir="ltr">温湿度数据采集</p>

<p dir="ltr">副核心(rp2040)启动温湿度传感器,开始数据采集。</p>

<p dir="ltr">副核心处理采集到的温湿度数据,可能包括数据滤波、校准等处理步骤。</p>

<p dir="ltr">数据通信</p>

<p dir="ltr">副核心将处理后的温湿度数据通过预定义的通信协议发送给主核心(ESP32-S3)。</p>

<p dir="ltr">数据显示</p>

<p dir="ltr">主核心使用LVGL在触摸屏上显示温湿度数据。</p>

<p dir="ltr">显示界面可能包括当前温湿度值、时间等。</p>

<p dir="ltr">数据打印(PC端)</p>

<p dir="ltr">主核心通过串口通信或其他方式将温湿度数据发送到PC端。</p>

<p dir="ltr">实时监控与反馈</p>

<p dir="ltr">系统持续监控温湿度数据的变化。</p>

<p dir="ltr">如果数据超出预设范围,系统可以通过用户界面提供警告或报警信息。</p>

<p dir="ltr">结束</p>

<p dir="ltr">&nbsp;</p>

<p align="left">&nbsp;</p>

<p align="left"><strong><span style="font-size:18px;">三、各部分功能说明</span></strong></p>

<p align="left">&nbsp;</p>

<p align="left">硬件部分</p>

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

<p align="left"> &nbsp;</p>

<p dir="ltr">PICO与BMP280:</p>

<p dir="ltr">BMP280传感器通常通过I&sup2;C接口与副板PICO进行连接,这个是自己设计的板了,已经集成在下图紫色的板上。</p>

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

<p dir="ltr">PICO是最小系统核心板,使用排针进行板载对接。</p>

<p align="left">&nbsp;</p>

<p align="left"> &nbsp;</p>

<p align="left">&nbsp;</p>

<p>&nbsp;</p>

<p>PICO与ESP32 S3通信上PC端输出的数据:</p>

<p align="left"></p>

<p align="left"><b>屏幕上实际输出画面:</b></p>

<p align="left"></p>

<p align="left">&nbsp;</p>

<p align="left"><strong>四、作品源码</strong></p>

<p>界面设计:</p>

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

<p>数据更新与显示:</p>

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

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

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

<pre>
<code>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-&gt;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 = { 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 &lt; LVGL_PORT_BUFFER_NUM) &amp;&amp; (i &lt; LVGL_PORT_BUFFER_NUM_MAX); i++) {
      buf = heap_caps_malloc(buffer_size * sizeof(lv_color_t), LVGL_PORT_BUFFER_MALLOC_CAPS);
      assert(buf);
      ESP_LOGD(TAG, "Buffer[%d] address: %p, size: %d", i, buf, buffer_size * sizeof(lv_color_t));
}</code></pre>

<p><strong>温湿度数据采集与处理</strong></p>

<p>传感器初始化与配置:</p>

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

<p>数据采集与传输:</p>

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

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

<p align="left">&nbsp;</p>

<pre>
<code>

温湿度数据采集与处理
    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&lt;200&gt; 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(&amp;bsp_disp_cfg, &amp;panel_handle, &amp;io_handle));

#if ESP_IDF_VERSION &lt; 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-&gt;buffer_size,
      .double_buffer = cfg-&gt;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-&gt;flags.buff_dma,
            .buff_spiram = cfg-&gt;flags.buff_spiram,
#if LVGL_VERSION_MAJOR &gt;= 9
            .swap_bytes = (BSP_LCD_BIGENDIAN ? true : false),
#endif
      }
    };

    return lvgl_port_add_disp(&amp;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();
   
    // 其他初始化代码...
}</code></pre>

<p align="left">&nbsp;</p>

<p align="left">&nbsp;</p>

<p align="left"><span style="font-size:18px;"><strong>五、作品功能演示视频</strong></span></p>

<p align="left">视频:</p>

<p align="left">5fa65f99896cae6117497e83aa643c75</p>

<p align="left"><br />
652e1cb2367ebe39bafaef6c09ca39e7<br />
文档:<br />
</p>

<p align="left">原码:</p>

<p align="left"><a href="https://download.eeworld.com.cn/detail/meiyao/634898" target="_blank">https://download.eeworld.com.cn/detail/meiyao/634898</a><br />
<a href="https://bbs.eeworld.com.cn/thread-1298153-1-1.html" target="_blank">【2024 DigiKey 创意大赛】+功能</a></p>

<p align="left"><a href="https://bbs.eeworld.com.cn/thread-1298153-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1298153-1-1.html</a></p>

<p align="left"><a href="https://bbs.eeworld.com.cn/thread-1298135-1-1.html" target="_blank">【2024 DigiKey 创意大赛】+硬件准备</a></p>

<p align="left"><a href="https://bbs.eeworld.com.cn/thread-1298135-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1298135-1-1.html</a></p>

<p align="left">&nbsp;</p>

<p align="left">总结:</p>

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

<p align="left">&nbsp;</p>

<p align="left">&nbsp;</p>

<p align="left">&nbsp;</p>

<p align="left">&nbsp;</p>

Jacktang 发表于 2024-11-6 07:24

<p>界面设计、数据更新与显示、LVGL用户交互界面实现以及温湿度数据采集与处理,几个部分,该有的都有了,不错</p>
页: [1]
查看完整版本: 【2024 DigiKey 创意大赛】+总结