野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 761|回复: 0

【野火】瑞萨RA MCU创意氛围赛+基于瑞萨单片机的环境温湿...

[复制链接]
发表于 2023-8-16 21:17:05 | 显示全部楼层 |阅读模式
@[TOC](【野火】瑞萨RA MCU创意氛围赛+基于瑞萨单片机的环境温湿度监测装置)
野火论坛202308162105224827..jpg
功能:
1.通过DHT11温湿度模块采集环境温湿度数据
2.通过软件SPI实现SPI屏幕显示温湿度数据
3.通过上位机显示温湿度数据并将数据换算成图像显示

视频展示:[【野火】瑞萨RA MCU创意氛围赛+基于瑞萨单片机的环境温湿度监测装置](https://b23.tv/jk62qxa)
# 1.设计简介
最开始的设计是准备使用DHT11温湿度模块、MQ-2烟雾模块、人体红外做数据采集,使用板载ESP8266做WiFi数据传输,通过HTTP或者MQTT协议连接OneNET平台,实现云平台数据收发,同时运行RTOS操作系统。但由于本人忙于工作,无法按时制作,于是制作了简易版本,本次设计选择使用野火启明6M5单片机,采集模块使用的是DHT11温湿度模块,显示模块使用的是SPI屏幕,同时还做了串口通讯。
# 2.硬件设计
野火论坛202308162109529674..jpg
## 2.1主控板
本次使用的是瑞萨的R7FA6M5BH3CFC单片机。RA 产品家族单片机 (MCU) 于 2019 年 10 月推出,丰富了瑞萨的 32 位 MCU 系列产品。除了 RA系列之外的 32 位 MCU 产品还有 RX 系列(CPU 使用瑞萨自家 RX 内核)和 Renesas Synergy™ 平台 MCU。Renesas Advanced (RA) 32 位 MCU 是采用 Arm® Cortex®-M33、-M23 和 -M4 处理器内核,并经过 PSA Certified ® 1 级认证的、行业领先的 32 位 MCU。是 Arm 公司于 2017 年推出的行业通用框架,旨在打造各种安全的互联设备。许多业界领先企业已宣布支持该架构的基础原则,为物联网设备和解决方案加入令人信任的安全级别。
RA 系列的所有 MCU 在功能上和大部分引脚上都是兼容的。小型器件上的外设大体上是大型器件上外设的子集。这便于实现可扩展性和不同器件之间的代码重用。对于不同系列的类似封装,其引脚排列几乎相同。
瑞萨 RA 系列产品家族包括:
• RA2 系列,适用于低功耗应用;
• RA4 系列,适用于需要低功耗、高性能和高安全性的设备;
• RA6 系列,具有卓越的连接性能和安全性能;
• RA8 系列,可以为采用人机界面、连接、安全和模拟功能的应用提供出色性能。
## 2.2DHT11温湿度采集模块
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
野火论坛202308162105599161..jpg
模块使用单总线连接,DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
一次完整的数据传输为40bit,高位先出。数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集, 用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集, 如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。通讯过程如图所示
野火论坛202308162107328871..png
引脚连接为:
P0.10——DATA
Mode选择Output mode(Initial Low)
野火论坛202308162108304435..png
## 2.3SPI屏幕
屏幕使用了软件SPI,SPI协议是由摩托罗拉公司提出的通讯协议(SerialPeripheralInterface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在ADC、LCD等设备与MCU间,要求通讯速率较高的场合。
野火论坛202308162110503989..png
SPI通讯使用3条总线及片选线,3条总线分别为SCK、MOSI、MISO,片选线为,它们的作用介绍如下:
(1)(SlaveSelect):从设备选择信号线,常称为片选信号线,也称为NSS、CS,以下用NSS表示。
当有多个SPI从设备与SPI主机相连时,设备的其它信号线SCK、MOSI及MISO同时并联到相同的SPI总线上,即无论有多少个从设备,都共同只使用这3条总线;而每个从设备都有独立的这一条NSS信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而SPI协议中没有设备地址,它使用NSS信号线来寻址,当主机要选择从设备时,把该从设备的NSS信号线设置为低电平,该从设备即被选中,即片选有效,接着主机开始与被选中的从设备进行SPI通讯。所以SPI通讯以NSS线置低电平为开始信号,以NSS线被拉高作为结束信号。
(2)SCK(SerialClock):时钟信号线,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不一样,如RA6M5的SPI时钟频率最大为fpclkA/2,两个设备之间通讯时,通讯速率受限于低速设备。
(3)MOSI(MasterOutput,SlaveInput):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
(4)MISO(MasterInput,,SlaveOutput):主设备输入/从设备输出引脚。主机从这条信线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。
引脚连接为:
P0.2——MOSI
P0.1——CLK
P0.7——CS
P0.6——DC
P0.3——RST
P0.8——BL
使用的是软件SPI,所以引脚配置Mode选择Output mode(Initial High)
野火论坛202308162111307079..png
# 3.软件设计
需要注意一下串口的配置,串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。
串口配置如下图所示,需要主要,引脚一定是P511\P512,引脚选错是无法监测到输出的
野火论坛202308162111583800..png
在“属性”窗口中配置名字(name)、通道(Channel)、回调函数(Callback)名字即可,引脚(Pins)、波特率(Baud Rate)等其他的属性按照默认的配置即可。
野火论坛202308162112091373..png
Name:名字,根据读者需求设置即可。
Channel :通道,根据 SCI 号设置即可,例如实验使用 SCI4,则这里配置为通道 4。
Data Bits: 每个字(word)的比特(bit)数,默认为 8bits
Parity :校验模式,可选择“Odd”奇校验,“Even”偶校验或“None”无校验。
Stop Bits: 停止位,可选 1 或 2bit。
Baud Rate :波特率
Baud Rate Modulation :波特率调制,通过调整时钟周期,以减少申请波特率与实际波特率之间的误差。
Max Error(%) :计算波特率时允许的最大百分比误差。
Callback: 回调函数的名字,根据读者需求设置即可。
Receive Interrupt Priority :接收中断优先级
Transmit Data Empty InterruptPriority:发送数据空中断优先级
Transmit End Interrupt Priority: 发送完成中断优先级
Error Interrupt Priority: 错误中断优先级


使用 printf 函数时,需要使用到堆,默认情况下堆的大小为 0,因此我们需要修改堆的大小。可以在 FSP 配置界面中的“BSP”属性栏的“RA Common”中通过修改“Heap size”来设置堆区大小。这里需要设置为 8 的整数倍,推荐至少为 4K(0x1000)
野火论坛202308162112348581..png
# 4.效果展示
上位机效果如图所示
野火论坛202308162112538718..png
实物效果
野火论坛202308162113093558..jpg
# 5.部分代码
hal_entry.c代码:

#include "hal_data.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER


/* 用户头文件包含 */
#include "led/bsp_led.h"
#include "debug_uart/bsp_debug_uart.h"
#include "led/ST7735.h"
#include "led/bsp_dht11.h"

//温湿度变量定义
uint8_t humdity_integer;//湿度整数
uint8_t humdity_decimal;//湿度小数
uint8_t temp_integer ;//温度整数
uint8_t temp_decimal ;//温度小数
uint8_t dht11_check ;//校验值

/*******************************************************************************************************************//**
* 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 */
    DHT11_Init();// DHT11 初始化
    XTFT_Init_GPIO();//LCD引脚初始化
    LCD_Init();//LCD——SPI初始化
    ST7735_FillScreen(ST7735_BLACK);
    R_BSP_PinWrite(BSP_IO_PORT_00_PIN_10, BSP_IO_LEVEL_HIGH); //DHT11端口配置
    LED_Init();         // LED 初始化
    Debug_UART4_Init(); // SCI4 UART 调试串口初始化

    printf("PrairieOne\r\n");
//    printf("打开串口助手发送数据,接收窗口会回显所发送的数据\r\n");
    while(1)
    {
        DHT11_Read();
       // ST7735_DrawString(0, 0, "CSDN", Font_7x10, ST7735_RED, ST7735_BLACK);
        //ST7735_DrawString(0, 32, "CSDN", Font_16x26, ST7735_BLUE, ST7735_BLACK);
        ST7735_DrawString(0, 0, "RA6M5", Font_11x18, ST7735_GREEN, ST7735_BLACK);
        ST7735_DrawString(0, 16, "PrairieOne", Font_11x18, ST7735_GREEN, ST7735_BLACK);
        ST7735_DrawString(0, 32, "-----------", Font_11x18, ST7735_RED, ST7735_BLACK);
        ST7735_DrawString(0, 48, "Temp:", Font_11x18, ST7735_GREEN, ST7735_BLACK);
        ST7735_DrawString(0, 64, "Humi:", Font_11x18, ST7735_GREEN, ST7735_BLACK);
        LCD_ShowIntNum(55, 48, temp_integer, Font_11x18, ST7735_GREEN, ST7735_BLACK);
        LCD_ShowIntNum(55, 64, humdity_integer, Font_11x18, ST7735_GREEN, ST7735_BLACK);
        printf("T%dPH%dI", temp_integer, humdity_integer);
        //printf("Temp%dHumi%d", temp_integer, humdity_integer);
        printf("\r\n");

        ST7735_DrawString(77, 48, "C", Font_11x18, ST7735_GREEN, ST7735_BLACK);
        ST7735_DrawString(77, 64, "%", Font_11x18, ST7735_GREEN, ST7735_BLACK);
        LED1_ON; // LED1亮
        LED2_ON; // LED2亮
        LED3_ON; // LED3亮
       // printf("1\r\n");
        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
        LED1_OFF; // LED1灭
        LED2_OFF; // LED2灭
        LED3_OFF; // LED3灭
       // printf("2\r\n");
//        printf((uint8_t *)123);
        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
    }


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

/*******************************************************************************************************************//**
* This function is called at various points during the startup process.  This implementation uses the event that is
* called right before main() to set up the pins.
*
* @param[in]  event    Where at in the start up process the code is currently at
**********************************************************************************************************************/
void R_BSP_WarmStart(bsp_warm_start_event_t event)
{
    if (BSP_WARM_START_RESET == event)
    {
#if BSP_FEATURE_FLASH_LP_VERSION != 0

        /* Enable reading from data flash. */
        R_FACI_LP->DFLCTL = 1U;

        /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and
         * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */
#endif
    }

    if (BSP_WARM_START_POST_C == event)
    {
        /* C runtime environment and system clocks are setup. */

        /* Configure pins. */
        R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
    }
}

#if BSP_TZ_SECURE_BUILD

BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();

/* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
{

}
#endif

```


19_UART_Receive_Send.zip

1.4 MB, 下载次数: 29

代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-29 22:11 , Processed in 0.037867 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表