[ARM入门] 温度测不准?读数据麻烦?来一起从零手搓高精度无线人体温度仪
高精度无线人体温度仪1.前言手中持有一款瑞萨的开发板已经吃灰很久了。关于瑞萨开发板的使用也忘记了好多为了发挥一下开发板的余热同时也重新熟悉一下瑞萨开发板的使用和开发过程。因此想基于这个开发板做一个小而实用的项目。一个高精度无线温度仪由此诞生了。项目目标1-精度高小于0.1度2-带有显示屏方便及时查看3-最重要的是支持蓝牙传输支持BLE和SPP既可以连接手机也可以连接电脑。2.最终效果图从无数的坑里终于爬出来了最终完成目标实现最终效果如下图 1 项目验证实物图后续手机端若是能做成更好的APP适配效果会更好。硬件方面可以集成一个小盒子会更方便收纳。3.系统硬件设计本项目需要使用一些外设和模块因此需要进行硬件设计。3.1.系统整体设计主控采用RA-Eco-RA4M2-100PIN-V1.0开发板通过IIC采集温度传感器数据然后通过OLED显示屏显示计算的人体温度并通过无线模块将数据发送给电脑或者手机等终端。开发通过LED显示系统正常运行。图 2 整体硬件架构图3.2.RA4M2开发板RA-Eco-RA4M2-100PIN-V1.0是一款基于100MHz Arm® Cortex®-M33内核架构的核心板主控芯片为R7FA4M2AD3CFP。 RA4M2 32 位微控制器 (MCU) 产品群使用支持 TrustZone 的高性能 Arm® Cortex®-M33 内核。 与片内的 Secure Crypto Engine (SCE) 配合使用可实现安全芯片的功能。 RA4M2 采用高效的 40nm 工艺由灵活配置软件包 (FSP) 这个开放且灵活的生态系统概念提供支持FSP 基于 FREERTOS 构建并能够进行扩展以使用其他实时操作系统 (RTOS) 和中间件。 RA4M2 适用于物联网应用的需求 如多样化的通信功能、面向未来应用的安全功能、大容量嵌入式 RAM 和较低的运行功耗从闪存运行 CoreMark® 算法时功耗低至 81µA/MHz。以上是官方的介绍这个开发板的相关接口和资源介绍如下1个复位按键2个用户按键2个触摸按键3个LED2个PMOD接口板载USB转TTL模块可用于串口通信和烧录板载SWD接口方便用户调试与下载支持 TrustZone 的 100MHz Arm Cortex-M33安全芯片的功能512kB 闪存、64kB SRAM支持奇偶校验以及 64kB ECC SRAM8KB 数据闪存提供与 EEPROM 类似的数据存储功能1kB 休眠用 SRAM电容式触摸传感单元 (CTSU)全速 USB 2.0支持主机模式和设备模式CAN 2.0B四线 SPISCIUART、简单 SPI、简单 I2C独立SPI/I2C 多主接口SDHI 和 MMC。本项目只是使用部分接口和资源。3.3.OLED显示屏0.96寸OLED显示屏窄白光IIC接口屏幕分辨率为128X64。这个屏幕从立创商城购买来。链接如下https://item.szlcsc.com/5960631.html?spmsc.ols.it2-1___sc.hm.hd.ddlcsc_vidTgJXAgVTFgdaUVFeQVZaBAFfFAJbU11e**MUV0FRlQxVlNTQlBdX1xQQFRaUDtW相关参数如下file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml13540/wps76.jpg图 3 OLED显示屏采购3.4.温度传感器采用敏源的M1820ZT5该传感器具有±0.1℃精度、16bitADC、超低功耗、1-wire数字接口。是一款高精度温度传感芯片。在立创商城上购买链接如下https://item.szlcsc.com/5750395.html?spmsc.ols.it0-1___sc.hm.hd.ddlcsc_vidTgJXAgVTFgdaUVFeQVZaBAFfFAJbU11e**MUV0FRlQxVlNTQlBdX1xQQFRaUDtW该高精度数字温度探头探头直径5MM线长1米内部芯片型号M1820Z最高测温精度±0.1℃0~50℃1-Wire协议数字输出16bit ADC 0.004℃分辨率10.5ms快速测温1.8V~5.5V宽电压供电工作温度范围-20℃~85℃芯片工作温度范围-70℃~150℃。选择这款的原因就是精度很高啊。测量也方便哦。图 4 M1820ZT5温度传感器3.5.无线模块基于KT6368的蓝牙模块支持SPP和BLE双模。不仅可以可以连接手机也可以连接电脑。该模块板载PCB天线。通过串口控制收发数据。供电3.3V。该模块采用立创开源的硬件制作相关开源链接如下https://oshwhub.com/swtblue/kt86368akt6328a-bluetooth-module具体实物如下file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml13540/wps78.jpg图 5 无线模块3.6.LED灯这里直接使用开发板上的3个LED灯不再详述相关原理图如下图所示file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml13540/wps79.jpg图 6 LED控制IO需要对相关GPIO进行配置。4.系统软件设计通过RASC进行初始参数配置基于keil MDK平台使用C语言进行编码。4.1.OLED的IIC配置与关键代码实现OLED使用的IIC的IO分别是SDAP408、SCLP409。为了屏幕刷新的更快这里配置速度为FAST-MODE。大约400KBPS。需要注意选择IIC的通道SLAVE的地址0x3c并命名好回调函数。具体配置如下图所示file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml13540/wps80.jpg图 7 OLED的IIC配置回调函数实现如下i2c_master_event_t i2c_event I2C_MASTER_EVENT_ABORTED;void sci_i2c_master_callback(i2c_master_callback_args_t *p_args){i2c_event I2C_MASTER_EVENT_ABORTED;if (NULL ! p_args){/* capture callback event for validating the i2c transfer event*/i2c_event p_args-event;}}int timeout_ms 100;当然这里还有屏幕的驱动代码等由于篇幅所限不再详述。该屏幕的使用属于常规操作。具体可以查看工程源码。在这里需要注意一下汉字取模我采用的是在线进行汉字取模。网站链接如下https://www.23bei.com/tool/216.html我需要使用的汉字是高精度无线人体温度仪。通过在线取模参数配置如下图所示图 8汉字在线取模配置与生成4.2.温度传感器的IO配置与关键代码实现该传感器单线通信因此只需要一个IOP115该管脚需要外部4.7K的电阻3.3V进行上拉。否则通信会有问题。管脚P115的软件配件如下图所示file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml13540/wps82.jpg图 9温度传感器通信IO该传感器的驱动代码官方已经写好只需要对IO和延时程序重新移植即可。相关需要自行配置和修改的函数如下/*********用户可自行配置us级延时************/#define ow_Delay_us(N) R_BSP_SoftwareDelay(N, BSP_DELAY_UNITS_MICROSECONDS)#define DELAY_Ms(N) R_BSP_SoftwareDelay(N, BSP_DELAY_UNITS_MILLISECONDS)#define ow_DQ_set() { R_IOPORT_PinWrite(g_ioport_ctrl, DQ_PIN,BSP_IO_LEVEL_HIGH); }#define ow_DQ_reset() { R_IOPORT_PinWrite(g_ioport_ctrl, DQ_PIN,BSP_IO_LEVEL_LOW);}uint8_t ow_DQ_get(void){bsp_io_level_t x0;if(R_IOPORT_PinRead(g_ioport_ctrl,DQ_PIN,x)FSP_SUCCESS){return x;}return 1;}void OW_Init(void){ow_DQ_set();}4.3.LED的GPIO配置与关键代码实现这里需要配置三个IO分别是P405、P404、P002分别对应LED1、LED2、LED3。配置起来非常简单将设置为输出即可配置分别如下图所示file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml13540/wps85.jpg图 10 LED控制IO配置具体代码实现控制LED亮灭非常简单如下所示R_BSP_SoftwareDelay(250, BSP_DELAY_UNITS_MILLISECONDS); // NOLINTR_IOPORT_PinWrite(g_ioport_ctrl, LED1, BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(g_ioport_ctrl, LED2, BSP_IO_LEVEL_HIGH);R_BSP_SoftwareDelay(250, BSP_DELAY_UNITS_MILLISECONDS); // NOLINTR_IOPORT_PinWrite(g_ioport_ctrl, LED1, BSP_IO_LEVEL_HIGH);R_IOPORT_PinWrite(g_ioport_ctrl, LED2, BSP_IO_LEVEL_LOW);4.4.无线模块的UART接口配置与关键代码实现无线蓝牙模块的接口为串口因此需要使用1个UART。相关配置如下图 11 无线模块UART通信接口配置相关的回调函数需要自己进行实现相关代码如下fsp_err_t err FSP_SUCCESS;unsigned char send_buff[100];volatile bool uart_send_complete_flag false;void g_uart9_callback (uart_callback_args_t * p_args){if(p_args-event UART_EVENT_TX_COMPLETE){uart_send_complete_flag true;}}为了方便调试和打印相关信息。这里对printf函数进行了重定向相关代码如下所示/* 重定向 printf 输出 */#if defined __GNUC__ !defined __clang__int _write(int fd, char *pBuffer, int size); //防止编译警告int _write(int fd, char *pBuffer, int size){(void)fd;R_SCI_UART_Write(g_uart4_ctrl, (uint8_t *)pBuffer, (uint32_t)size);while(uart_send_complete_flag false);uart_send_complete_flag false;return size;}#elseint fputc(int ch, FILE *f){(void)f;R_SCI_UART_Write(g_uart9_ctrl, (uint8_t *)ch, 1);while(uart_send_complete_flag false);uart_send_complete_flag false;return ch;}#endif4.5.SWD调试与下载接口配置由于我手头上有j-link调试器所以配置SWD接口不仅能适配我的调试器还可以节省IO。具体配置如下图所示file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml13540/wps87.jpg图 12 SWD调试下载接口配置4.6.主程序设计由于在RASC中已经配置了相关的外设这里只需要调用即可。因此主程序实现如下/*******************************************************************************************************************//*** main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function* is called by main() when no RTOS is used.**********************************************************************************************************************/void hal_entry(void){/* TODO: add your own code here */float T0;unsigned char str[16]{0};err R_SCI_UART_Open(g_uart9_ctrl, g_uart9_cfg);assert(FSP_SUCCESS err);/* IIC初始化*/err R_SCI_I2C_Open(g_i2c0_ctrl, g_i2c0_cfg);assert(FSP_SUCCESS err);WriteCmd();//OLED初始化OLED_Clear();//清屏//高精度无线人体温仪OLED_ShowCHinese(0,1,0);//高OLED_ShowCHinese(16,1,1);//精OLED_ShowCHinese(32,1,2);//度OLED_ShowCHinese(48,1,3);//无OLED_ShowCHinese(64,1,4);//线OLED_ShowCHinese(80,1,7);//温OLED_ShowCHinese(96,1,2);//度OLED_ShowCHinese(112,1,8);//仪OW_Init();SetConfig(CFG_MPS_Single,CFG_Repeatbility_High);while(1){//printf(kwin\r\n);T OutputTemp();sprintf(str,%6.2fC,T);printf(%s,str);OLED_ShowString(32,5,str,16);R_BSP_SoftwareDelay(250, BSP_DELAY_UNITS_MILLISECONDS); // NOLINTR_IOPORT_PinWrite(g_ioport_ctrl, LED1, BSP_IO_LEVEL_LOW);R_IOPORT_PinWrite(g_ioport_ctrl, LED2, BSP_IO_LEVEL_HIGH);R_BSP_SoftwareDelay(250, BSP_DELAY_UNITS_MILLISECONDS); // NOLINTR_IOPORT_PinWrite(g_ioport_ctrl, LED1, BSP_IO_LEVEL_HIGH);R_IOPORT_PinWrite(g_ioport_ctrl, LED2, BSP_IO_LEVEL_LOW);}#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();#endif}代码编译成功后会有如下提示file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml13540/wps88.jpg图 13 代码编译成功提示下载之前需要进行配置file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml13540/wps89.jpg图 14 程序下载配置程序调试可以观测到串口输出如下file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml13540/wps90.jpg图 15 程序调试输出验证说明程序运行正常。温度输出为实验室环境温度。最终的效果图参见第二章节的最终成品图。系统演示可以查看如下链接https://www.bilibili.com/video/BV1WUbJzpEgQ/?vd_sourcee36622a05269c0356d6cd566056a2488---------------------作者swtman链接https://bbs.21ic.com/icview-3478831-1-1.html?_dsign3ff1307b来源21ic.com此文章已获得原创/原创奖标签著作权归21ic所有任何人未经允许禁止转载。