当前位置: 首页 > news >正文

【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 模块
RA8D1ATK-D20Note
RXD9 (P208)TXReceive data
TXD9 (P209)RXTransmit data
GNDGNDGround
实物图

在这里插入图片描述

环境搭建

这里使用 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 ,并添加如下代码

#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#endifPUTCHAR_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 ,添加如下代码

/*********** 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 ,添加如下代码

/******************* 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 ,添加如下代码

/* 串口 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 文件代码

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 物联网电压表的项目设计,为该产品在物联网领域的开发设计和快速应用提供了参考。

http://www.dtcms.com/a/597563.html

相关文章:

  • STM32外设学习--DMA直接存储器读取(AD扫描程序,DMA搬运)--学习笔记。
  • 贵州网站开发制作公司开发公司各部门职责
  • FreeRTOS 学习:(十八)FreeRTOS 中断管理
  • 做外贸网站 怎么收钱池州哪里做网站
  • 介绍一下 机器人坐标转换的 RT 矩阵
  • 网站备案换公司吗盐山县网站建设
  • 为智能制造护航:SASE如何重塑制造业网络安全与连接
  • 品牌授权网站什么网站可以做软件有哪些东西
  • h5网站系统企业网站制作排名
  • ZeroNews 场景案例 | 结合小皮面板实现公网web服务发布
  • 本地的赣州网站建设电商网站支付接口
  • C# 记录类型(record)全面解析:从概念到最佳实践
  • 广西响应式网站制作怎么修改自己网站内容
  • 万网网站建设教程免费做网站的网站
  • Meta Omnilingual ASR:一个支持超1600种语言的语音识别系统解析
  • 9、prometheus-PromQL-3-偏移量修改器
  • 【题解】洛谷 P2471 [SCOI2007] 降雨量 [线段树 + 逻辑]
  • [8]. SpringAI Alibaba Tool Calling
  • 怎样建一个收费网站wordpress摘要过滤
  • 现在给别人做网站ui设计的软件
  • 【架构方法论】领域模型:如何通过领域模型,提高系统的可扩展性?
  • 基于Spring Security +JWT+Redis实现登录认证的流程
  • 深圳做网站最好的公司什么是企业形象设计
  • 【C++基础与提高】第六章:函数——代码复用的艺术
  • 【学习记录】ros2中处理livox_ros_driver1格式的msg
  • 仙游县住房和城乡建设局网站wordpress编辑角色无法上传图片
  • 邮箱类网站模板智联招聘官方网
  • 台湾旺久PL27A1芯片参数|USB3.0对拷线方案芯片|PL27A1对拷线芯片规格书
  • 开源企业建站系统哪个好广州网站建设q479185700棒
  • 网站开发制作流程中国招商网