【CPKCOR-RA8D1】Home Assistant 物联网 ADC 电压温度计

【CPKCOR-RA8D1】Home Assistant 物联网ADC电压温度计

本文介绍了瑞萨 CPKCOR-RA8D1B 开发套件由 ADC 采集引脚电压、温度传感器数据,通过串口发送 JSON 消息至 ATK D20 WiFi 模块,ATK-D20 模块将 MQTT 消息透传至 Home Assistant 平台,实现 HA 物联网电压表的项目设计,包括项目介绍、工程创建、工程编译、效果演示等。

项目介绍

  • 硬件连接:RA8D1 和 ATK-D20 WiFi 模块的接线;
  • 流程图:代码和项目流程;
  • 工程代码:ADC 配置、双串口配置和主程序;
  • MQTT透传:包括 ATK-D20 模块 MQTT 透传配置、软件测试等;
  • 效果演示:包括接入 Home Assistant 平台、YAML 配置等。

项目结构

硬件连接

连接方案

  • 连接 ATK-D20 模块
RA8D1 ATK-D20 Note
RXD9 (P208) TX Receive data
TXD9 (P209) RX Transmit data
GND GND Ground
实物图

环境搭建

这里使用 Renesas 瑞萨 e2 studio 开发工具,

下载 FSP (flexible software package) 软件包 并安装。

  • FSP 安装程序内包含 e² studio 集成开发环境、工具链和 FSP 软件包。

流程图

透传 转发 开始 初始化ADC 初始化串口 主循环 读取ADC
电压&温度 构造MQTT报文 串口输出JSON ATK-D20模块 MQTT服务器 HA显示 延时1秒

工程创建

  • 打开 e2 studio 软件;

  • 依次点击 文件 - 新建 - 瑞萨 C/C++ 项目 - Renesas RA

  • 依次进行工程命名,路径设置,FSP版本,目标开发板选择,Device 选择 R7FA8D18HECBD ,工具链选择 GNU ARM Embedded ,调试器选择 J-Link ;

  • 完成工程创建 ;

工程配置

包括时钟、引脚和堆栈等工程配置流程。

时钟配置

由于调用了 SCI 的 UART 堆栈,需要使能相应的时钟,包括 CLKOUT 和 SCICLK;

引脚配置

根据核心板原理图可知,板载 JLINK 串口与 UART3 相连;

对应引脚为 P408 (RXD) 和 P409 (TXD);

  • 相应的引脚配置需定义为 异步串口模式

串口配置

  • 新建串口通信堆栈 New Stack - Connectivity - UART (r_sci_b_uart)

  • 串口属性配置,选中串口堆栈,属性 - General 、名称 g_uart3、通道为 3、Interrupts 设置

  • 回调函数名称设置为 user_uart_callback

  • 配置完成后,点击 Generate Project Content 生成工程;

  • 配置完成后,构建工程,确保无误。

串口通信

这里首先实现串口打印的功能及效果演示。

代码

打开项目工程目录 src 文件夹下的主函数文件 hal_entry.c ,并添加如下代码

c++ 复制代码
#include "hal_data.h"
#include <stdio.h>

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
        uart_send_complete_flag = true;
    }
}

/*------------- 串口重定向 -------------*/
#ifdef __GNUC__
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else

#endif

PUTCHAR_PROTOTYPE
{
        err = R_SCI_B_UART_Write(&g_uart3_ctrl, (uint8_t *)&ch, 1);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){}
        uart_send_complete_flag = false;
        return ch;
}

int _write(int fd,char *pBuffer,int size)
{
    for(int i=0;i<size;i++)
    {
        __io_putchar(*pBuffer++);
    }
    return size;
}

void hal_entry(void)
{
    /* TODO: add your own code here */
    /* Open the transfer instance with initial configuration. */
    err = R_SCI_B_UART_Open(&g_uart3_ctrl, &g_uart3_cfg);
    assert(FSP_SUCCESS == err);

    while(1)
    {
        printf("hello world!\n");
        R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS);
    }
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

保存代码并构建工程。

效果

  • 使用 Type-C 数据线连接开发板和电脑;

  • 点击菜单栏 Debug 按钮,进入调试功能界面,点击 Continue 按钮开始执行程序;

  • 打开串口调试助手工具,选择 JLINK 对应的串口设备,配置串口相关参数;

  • 点击打开串口按钮,即可接收到开发板发送的字符串,发送间隔为 1 秒;

ADC 电压温度

通过 ADC 功能实现引脚电压转换和数据测量,结合芯片内部的温度传感器实现 ADC 温度值计算。

ADC 配置

  • 新建ADC堆栈 New Stack - Analog - ADC (r_adc)

  • 属性配置 General 选项下设置 ADC 单次扫描

  • Input 选项下勾选 Channel0Temperature Sensor,配置中断与回调函数 adc_callback

    注意 RA8D1 使能芯片内部温度传感器需要开启时钟 PCLKC (默认开启).

  • ADC 及串口配置完成后,构建工程,确保无误。

ADC 电压

通过 ADC 获取引脚 P004 对应的电压值。

代码

在完成串口通信的基础上,打开 hal_entry.c ,添加如下代码

c++ 复制代码
/*********** ADC Callback**********/
volatile bool scan_complete_flag = false;
void adc_callback (adc_callback_args_t * p_args)
{
    FSP_PARAMETER_NOT_USED(p_args);
    scan_complete_flag = true;
}

/*******************
 * main
********************/
void hal_entry(void)
{
    /* TODO: add your own code here */
    /* Open the transfer instance with initial configuration. */
    err = R_SCI_B_UART_Open(&g_uart3_ctrl, &g_uart3_cfg);
    assert(FSP_SUCCESS == err);

    printf("RA8D1 ADC Sensor\n");

    /* Initializes the module. */
    err = R_ADC_Open(&g_adc0_ctrl, &g_adc0_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);
    /* Enable channels. */
    err = R_ADC_ScanCfg(&g_adc0_ctrl, &g_adc0_channel_cfg);
    assert(FSP_SUCCESS == err);

    while(1)
    {
        uint16_t adc_raw = 0;
        double volt;
        
        /* Enable scan triggering from ELC events. */
        (void) R_ADC_ScanStart(&g_adc0_ctrl);
        scan_complete_flag = false;
        while (!scan_complete_flag)
        {
            /* Wait for callback to set flag. */
        }

        err = R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_0, &adc_raw);
        assert(FSP_SUCCESS == err);

        volt = (double)(adc_raw/4095.0)*3.3;
        printf("ADC = %d, Voltage = %fV\n",adc_raw,volt);

        R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);
    }
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

保存代码并构建工程。

效果
  • 打开串口调试助手工具,选择 JLINK 对应的串口设备,配置串口相关参数;
  • 点击打开串口按钮,即可接收到开发板发送的 ADC 原始值和 P004 引脚的电压值;

ADC 温度

通过芯片内部的温度传感器获取 ADC 温度数据。

代码

在完成串口通信和 ADC 电压采集的基础上,打开 hal_entry.c ,添加如下代码

c++ 复制代码
/******************
 * ADC Temperature
 * (详见 https://renesas.github.io/fsp/group___a_d_c.html )
 *******************/
/* 官方例程常数 */
#define VCC_UV           (3300000UL)   /* 3.3 V → μV */
#define RES_SHIFT        (12U)         /* 12-bit ADC */
#define REF_TEMP         (127)         /* 校准点 127 ℃ */
#define SLOPE_UV_PER_C   (4000L)       /* 4 mV/℃ → 4000 μV/℃ */

/* 获取ADC通道温度 */
static int32_t get_temperature_c(void)
{
    /* 1. 启动 ADC 并等待完成 */
    R_ADC_ScanStart(&g_adc0_ctrl);
    adc_status_t status = { .state = ADC_STATE_SCAN_IN_PROGRESS };
    while (status.state == ADC_STATE_SCAN_IN_PROGRESS)
    {
        R_ADC_StatusGet(&g_adc0_ctrl, &status);
    }

    /* 2. 读温度通道原始码值 */
    uint16_t raw;
    R_ADC_Read(&g_adc0_ctrl, ADC_CHANNEL_TEMPERATURE, &raw);

    /* 3. 取 127 ℃ 校准码值(TSCDR) */
    adc_info_t info;
    R_ADC_InfoGet(&g_adc0_ctrl, &info);
    int32_t cal127 = (int32_t)info.calibration_data;

    /* 4. 官方公式(单位 μV) */
    int32_t v1_uv   = (VCC_UV >> RES_SHIFT) * cal127;   /* 127 ℃ 对应电压 */
    int32_t vs_uv   = (VCC_UV >> RES_SHIFT) * raw;      /* 当前电压 */
    int32_t temp_c  = (vs_uv - v1_uv) / SLOPE_UV_PER_C + REF_TEMP;
    //printf("raw=%u cal127=%ld v1=%ld vs=%ld temp=%ld\r\n",raw, cal127, v1_uv, vs_uv, temp_c);
    return temp_c;
}

/*******************
 * main
********************/
void hal_entry(void)
{
    /* TODO: add your own code here */
    //......
    //......

    while(1)
    {
        int32_t temp_c = get_temperature_c();
        printf("{\"temp\": %ld}\r\n",temp_c);
        R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);
    }
}

保存代码并构建工程。

效果
  • 打开串口调试助手工具,选择 JLINK 对应的串口设备,配置串口相关参数;
  • 点击打开串口按钮,即可接收到开发板发送的 ADC 芯片内部温度传感器的数值;

Home Assistant

为了实现物联网 ADC 电压温度计,使用 ATK-D20 WiFi 模块,结合 MQTT 透传功能,实现 JSON 格式消息上传至 Home Assistant 智能家居平台。

ATK D20

这里使用 ATK-D20 WiFi DTU 模块实现串口 MQTT 透传。

ATK-D20 是由正点原子团队(ALIENTEK)自主研发的一款高性能 2.4GHz WiFi DTU 模块,主要用于实现串口设备通过 WiFi 无线方式接入网络。

  • 模块支持 TCP、UDP、HTTP、MQTT、原子云等多种通信协议,支持 AT 指令控制、注册包、心跳包、Modbus 采集等功能,极大地方便了二次开发与系统集成。

详见:D20 WiFi DTU | 文档 .

双串口输出

考虑到需要连接串口 MQTT 透传设备,根据扩展板原理图可知,JTAG 接口包含一对串口 UART9,引脚对应 P208和 P209,因此需要使能双串口输出 ADC 电压和温度数据。

工程配置
  • 在工程配置中新增串口 Stacks 堆栈,选择通道 9,波特率设置为 9600,回调函数命名为 user_uart9_callback
  • 串口 9 对应引脚设置为 P208 (RXD) 和 P209 (TXD);
  • 点击 Generate Project Content 生成工程;
代码

在完成之前工作的基础上,打开 hal_entry.c ,添加如下代码

c++ 复制代码
/* 串口 9 回调 */
volatile bool uart9_send_complete_flag = false;
void user_uart9_callback(uart_callback_args_t *p_args)
{
    if (p_args->event == UART_EVENT_TX_COMPLETE)
        uart9_send_complete_flag = true;
}

/**************************
 * main
****************************/
void hal_entry(void)
{
    /* TODO: add your own code here */
    //......
    //......
    /* Open the transfer instance with initial configuration. */
    err = R_SCI_B_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
    assert(FSP_SUCCESS == err);

    while(1)
    {
    	//......
    	//......
        printf("{\"adc\": %u, \"volt\": %.3f, \"temp\": %ld}\r\n", adc_raw, volt, temp_c); // uart3 print
        /* *********** UART9 print ************/
        char buf[64];
        int  len = snprintf(buf, sizeof(buf), "{\"adc\": %u, \"volt\": %.3f, \"temp\": %ld}\r\n", adc_raw, volt, temp_c);
        uart9_send_complete_flag = false;
        R_SCI_B_UART_Write(&g_uart9_ctrl, (uint8_t *)buf, len);
        while (!uart9_send_complete_flag) ;          // 等待发完

        R_BSP_SoftwareDelay (1000, BSP_DELAY_UNITS_MILLISECONDS);
    }
}

保存代码并构建工程。

效果
  • 打开串口调试助手工具,选择 JLINK 对应的串口设备,配置串口相关参数;
  • 点击打开串口按钮,即可接收到 ADC 对应的 JSON 消息;
  • 使用 USB 转 TTL 模块连接 UART9(P208/P209)可获取其输出字符串

MQTT 配置

  • 检查硬件连接,打开 ATK-D2x 配置软件,打开串口;

  • 进入左侧 模式配置 界面,工作模式选择 MQTT;

  • 填写 MQTT 服务器用户名、密码、ip地址、订阅主题、发送主题等信息;

  • 点击上方 保存所有参数 按钮,此时上位机自动发送 AT 指令,完成 MQTT 配置并自动重启;

详见:正点原子 D20 WiFi 模块 .

MQTTX

使用 MQTTX 软件测试串口透传与服务器转发。

  • 打开 MQTTX 软件,新建连接;

  • 填写 MQTT 服务器地址、用户名信息等,点击 Connect 按钮;

  • 新建订阅主题,输入 ATK-D20 上位机对应的发布主题信息,如 homeassistant/sensor/adc/state

  • 窗口不断弹出接收到的 MQTT 服务器转发的电压等信息;

YAML 配置

配置 HA 平台的 YAML 文件,根据主题添加相关参数;

YAML 文件代码

yaml 复制代码
mqtt:
  sensor:
    - name: "ADC 数值"
      state_topic: "homeassistant/sensor/adc/state"
      unit_of_measurement: "%"
      value_template: "{{ value_json.adc }}"
    - name: "ADC 电压"
      state_topic: "homeassistant/sensor/adc/state"
      unit_of_measurement: "%"
      value_template: "{{ value_json.volt }}"
    - name: "ADC 温度"
      state_topic: "homeassistant/sensor/adc/state"
      unit_of_measurement: "°C"
      value_template: "{{ value_json.temp }}"
  • 进入 HA 概览页面,编辑仪表盘,添加对应的卡片即可;
  • 卡片的 ADC 数值每秒更新

总结

本文介绍了瑞萨 CPKCOR-RA8D1B 开发套件由 ADC 采集引脚电压、温度传感器数据,通过串口发送 JSON 消息至 ATK D20 WiFi 模块,ATK-D20 模块将 MQTT 消息透传至 Home Assistant 平台,实现 HA 物联网电压表的项目设计,为该产品在物联网领域的开发设计和快速应用提供了参考。

相关推荐
DuHz2 小时前
论文阅读——Edge Impulse:面向微型机器学习的MLOps平台
论文阅读·人工智能·物联网·算法·机器学习·edge·边缘计算
芯联智造2 小时前
【stm32简单外设篇】- 单路 TTP223 电容式触摸传感器
c语言·stm32·单片机·嵌入式硬件
张工在路上3 小时前
(深入探讨句柄泄漏、内存泄漏检测工具)我将分析可能导致内存泄漏(包括托管内存和非托管内存,如句柄泄漏)
stm32·单片机·嵌入式硬件
网络安全那些事3 小时前
Node-RED 物联网实践系列(4.1):核心节点精讲(Inject/Debug/Change/Switch/Function)
物联网·低代码·数据采集·工业互联网·nodered
数据库学啊4 小时前
物联网(IoT)项目,时序数据库选型推荐哪个?
数据库·物联网·时序数据库
工程师平哥4 小时前
APE-01 新建工程
笔记·嵌入式硬件
恒锐丰小吕5 小时前
无锡黑锋 HF6206 系列低压差线性稳压器技术解析
嵌入式硬件·硬件工程
DolphinDB智臾科技5 小时前
工业物联网时序数据库选型指南:DolphinDB vs InfluxDB vs TimescaleDB
数据库·物联网·时序数据库
周周记笔记8 小时前
[元器件专题] RC充电电路(七)
嵌入式硬件·测试工具·硬件开发
ACP广源盛139246256738 小时前
GSV2712@ACP#2 进 1 出 HDMI 2.0/Type-C DisplayPort 1.4 混合切换器 + 嵌入式 MCU
单片机·嵌入式硬件·计算机外设·音视频