
瑞萨-ESP多传感互联显控
简介
本项目基于瑞萨RA6E2和ESP32-S3,实现了温湿度、烟雾浓度的实时采集与传输,并可通过微信小程序远程查看。系统采用双MCU架构,性能稳定可靠,提供完整的环境监测解决方案。
简介:本项目基于瑞萨RA6E2和ESP32-S3,实现了温湿度、烟雾浓度的实时采集与传输,并可通过微信小程序远程查看。系统采用双MCU架构,性能稳定可靠,提供完整的环境监测解决方案。开源协议
:GPL 3.0
描述
Renesas & Esp32s3 物联网环境监测网关
视频链接:
项目简介
本项目是一套基于 瑞萨 (Renesas) RA6E2 的智能化扩展方案。项目以瑞萨单片机为核心主控,负责底层的传感器数据采集与核心业务逻辑;采用 ESP32-S3 “实战派”开发板 作为“智能网关与显示终端”。
两者通过 UART 串口连接,“实战派”负责将瑞萨采集的数据进行可视化展示,并通过蓝牙 (BLE) 将数据透传至微信小程序,实现了传统单片机项目的屏幕升级与移动端物联网 (IoT) 互联。
项目功能
本项目主要实现以下核心功能:
- 多维数据采集:由瑞萨 MCU 负责采集环境数据(包括温度、湿度、烟雾浓度及 ADC 电压值),并将数据打包。
- 双机通信与解析:ESP32-S3 作为网关,通过 UART 串口实时接收并解析来自瑞萨下位机的格式化数据。
- 本地可视化显示:ESP32-S3 将解析后的数据通过 LVGL 图形库在板载 IPS 屏幕上进行实时刷新和展示。
- 无线蓝牙透传:集成 Wechat_BLE 服务,支持微信小程序直连。实现将传感器数据实时上报至微信小程序,并预留了反向控制接口。
项目参数
- 核心主控 (Core MCU):瑞萨 Renesas MCU (负责传感器驱动、底层数据采集)
- 智能网关/显示终端:ESP32-S3 “实战派”开发板 (双核 Xtensa® LX7, 240MHz)
- 显示屏幕:2.0寸 IPS 彩屏 (ST7789 驱动)
- 通信接口:UART (波特率 115200), BLE 5.0
- 供电方式:Type-C 5V 供电
- 数据协议:nimble低功耗蓝牙 WiFi
原理解析(硬件说明)
本项目硬件逻辑主要分为 数据采集端 和 数据处理端 两部分,通过物理链路进行连接。
数据采集

数据处理

通信链路电路:
ESP32-S3 通过硬件串口 (UART1) 与瑞萨开发板连接,实现全双工或半双工通信。
- 瑞萨开发板 TX 引脚连接至 ESP32-S3 的 RX 引脚 (IO10)。
- 瑞萨开发板 RX 引脚连接至 ESP32-S3 的 TX 引脚 (IO11)。
- 关键点:两块开发板的 GND (地线) 必须连接在一起,以建立公共参考电平,否则无法通信。
软件代码
系统上电后,瑞萨 MCU 初始化传感器并周期性读取数据,通过 printf 或串口发送函数将数据格式化输出。ESP32-S3 端的 UART 接收中断捕获数据包,经由 FreeRTOS 任务进行解析,分发给 UI 线程更新屏幕,同时通过 BLE 协议栈广播数据,等待手机连接。
RA6E2主函数部分代码
/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 文档网站:wiki.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 嘉立创社区问答:https://www.jlc-bbs.com/lckfb
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*/
#include "app.h"
#include "stdio.h"
#include "string.h" // 用于sprintf
/* BSP头文件引入 */
#include "bsp_uart.h"
#include "bsp_dht11.h"
#include "bsp_mq2.h"
#include "oled.h"
/******************************************************************
* 函 数 名 称:led_blink
* 函 数 说 明:LED心跳灯,用于指示系统正在运行
* 函 数 形 参:无
* 函 数 返 回:无
******************************************************************/
static void led_blink(void)
{
/* 翻转LED电平,假设P402是板载LED */
/* 注意:如果不使用LED或者引脚不同,请自行修改或删除 */
static uint8_t level = BSP_IO_LEVEL_LOW;
if(level == BSP_IO_LEVEL_LOW)
{
level = BSP_IO_LEVEL_HIGH;
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_HIGH);
}
else
{
level = BSP_IO_LEVEL_LOW;
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_LOW);
}
}
/******************************************************************
* 函 数 名 称:Run
* 函 数 说 明:用户主应用程序入口
******************************************************************/
void Run(void)
{
/* 1. 初始化调试串口 | RX:P100 | TX:P101 | */
UART0_Debug_Init();
printf("\r\n--- System Init Start ---\r\n");
/* 2. 初始化 OLED 屏幕 */
/* 注意:OLED初始化内部通常会有延时,确保上电稳定 */
OLED_Init();
OLED_Clear(); // 清屏
OLED_ShowString(0, 0, (uint8_t*)"System Init...", 16, 1);
OLED_Refresh();
/* 3. 初始化 DHT11 温湿度传感器 */
DHT11_Init();
/* DHT11 上电后需要等待一段时间才能稳定读取 */
/* 为了数据准确,建议先空读两次 */
DHT11_Read_Data(NULL, NULL);
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
DHT11_Read_Data(NULL, NULL);
/* 4. 初始化 MQ2 烟雾传感器 (包含ADC初始化) */
/* 假设 Module_BSP_Init 包含了 MQ2 所需的 ADC 初始化 */
Module_BSP_Init();
printf("Sensors Init Complete.\r\n");
OLED_Clear(); // 初始化完成后清屏准备显示数据
/* 定义数据变量 */
float temperature = 0.0f;
float humidity = 0.0f;
int mq2_adc = 0;
int mq2_percent = 0;
/* 定义OLED显示缓存字符串 */
char display_buff[32];
while(1)
{
/* --- 步骤1:读取传感器数据 --- */
if(DHT11_Read_Data(&temperature, &humidity) != 1)
{
// 如果出错,可以选择不打印,或者打印错误标记
// printf("Error\r\n");
}
mq2_adc = Get_Adc_MQ2_Value();
mq2_percent = Get_MQ2_Percentage_value();
/* --- 步骤2:串口打印数据 (已修改) --- */
// 输出:Temp:25.5,Humi:60.2,Smoke:12,ADC:1205
printf("Temp:%.1f,Humi:%.1f,Smoke:%d,ADC:%d\r\n", temperature, humidity, mq2_percent, mq2_adc);
/* --- 步骤3:OLED 显示数据 (保持原样) --- */
sprintf(display_buff, "Temp: %.1f C ", temperature);
OLED_ShowString(0, 0, (uint8_t *)display_buff, 16, 1);
sprintf(display_buff, "Humi: %.1f %% ", humidity);
OLED_ShowString(0, 16, (uint8_t *)display_buff, 16, 1);
sprintf(display_buff, "Smoke: %d %% ", mq2_percent);
OLED_ShowString(0, 32, (uint8_t *)display_buff, 16, 1);
OLED_Refresh();
/* --- 步骤4:系统心跳与延时 --- */
led_blink();
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
}
}
实战派掌机瑞萨app接口
// Task/renesas_task.c
#include
#include
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "wechat_ble.h" // 引用上面的头文件
#include "renesas_ui.h" // 引用 UI 协议
#define RX_PIN 10
#define TX_PIN 11
#define RX_BUF_SIZE 512
#define BAUD_RATE 115200
#define TAG "RenesasTask"
static void uart_rx_task(void *arg) {
uint8_t *data = (uint8_t *) malloc(RX_BUF_SIZE + 1);
float temp = 0.0f, humi = 0.0f;
int smoke = 0, adc = 0;
// 配置 UART
const uart_config_t uart_config = {
.baud_rate = BAUD_RATE,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.source_clk = UART_SCLK_DEFAULT,
};
uart_driver_install(UART_NUM_1, RX_BUF_SIZE * 2, 0, 0, NULL, 0);
uart_param_config(UART_NUM_1, &uart_config);
uart_set_pin(UART_NUM_1, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
ESP_LOGI(TAG, "Listening on UART1 (TX:11, RX:10)...");
while (1) {
// 读取数据
const int rxBytes = uart_read_bytes(UART_NUM_1, data, RX_BUF_SIZE, pdMS_TO_TICKS(100));
if (rxBytes > 0) {
data[rxBytes] = 0;
// 假设数据格式: "Temp:25.5,Humi:60.2,Smoke:12,ADC:1205"
int n = sscanf((char *)data, "Temp:%f,Humi:%f,Smoke:%d,ADC:%d", &temp, &humi, &smoke, &adc);
if (n == 4) {
// 1. 发送给 微信小程序
ble_send_sensor_data(temp, humi, smoke, adc);
// 2. 更新 本地屏幕 (解耦调用)
renesas_ui_update_sensor(temp, humi, smoke, adc);
ESP_LOGI(TAG, "Data Sync: T:%.1f H:%.1f", temp, humi);
}
}
// 不需要延时,uart_read_bytes 会阻塞
}
free(data);
vTaskDelete(NULL);
}
// 初始化函数,在 main.c 调用
void renesas_task_init(void) {
xTaskCreate(uart_rx_task, "renesas_task", 4096, NULL, 5, NULL);
}
实物图/视频
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










