野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 900|回复: 1

[野火]瑞萨RA MCU创意氛围赛+基于瑞萨RA6M5的环境监测系统

[复制链接]
发表于 2023-8-5 10:33:13 | 显示全部楼层 |阅读模式
本帖最后由 delehub 于 2023-8-9 17:11 编辑

1. 设计简介
本项目初步设计思路是打算以瑞萨单片机作为控制和数据处理的单元,使用温湿度,光照传感器去监测周围的环境参数,在屏幕上完成传感器数据和相关信息的显示。同时,使用WIFI无线模组与单片机之间进行数据交互,接入物联网云平台。尝试利用上位机实现对于温度、湿度、光照强度等相关环境参数监测。但是由于时间原因以及个人能力有限制,只完成了部分设计。
本项目是基于启明6M5开发板完成了环境监测系统设计,传感器DHT11获取温度湿度的数据;传感器GY39获取光照强度数据;0.96寸OLED屏幕提供显示功能,能够显示传感器数据以及相关信息。编写上位机软件,实现温湿度传感器数据的上报。
2. 设计框架
RA6M5-SYSTEM.png
3. 项目说明
本项目是基于启明6M5开发板完成设计,RA6M5芯片配置如下:采用 Arm Cortex-M33 内核的瑞萨 RA 系列 32 位 MCU; 主芯片为的R7FA6M5BH3CFC,主高达200MHz,2MB的代码闪 存,8KB数据闪存,以及512KB的带奇偶校验/ECC的SRAM。启明6M5开发板具有丰富的接口与外设,例如基本的LED,按键,电容按键,蜂鸣器等,同时也具有RS232,RS485,CAN,以太网接口,板载ESP8266无线WiFi等.
RA6M5-I.png RA6M5-I2.png
3.1 传感器模块
1. 温湿度传感器
DHT11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。
下图为DHT11的引脚说明图,DATA引脚为信号输入输出。
DHT11pin.png
2. 光照强度传感器
  • GY-39 是一款低成本,气压,温湿度,光强度传感器模块。工作电压 3-5v,功耗小,安装方便。
  • 其工作原理是,MCU 收集各种传感器数据,统一处理,直接输出计算后的结果。此模块,有两种方式读取数据,即串口 UART(TTL 电平)或者 IIC(2 线)。串口的波特率有 9600bps 与 115200bps,可配置,有连续,询问输出两种方式,可掉电保存设置。可适应不同的工作环境,与单片机及电脑连接。
  • 模块另外可以设置单独传感器芯片工作模式,作为简单传感器模块,MCU 不参与数据处理工作。
  • 传感器参考资料网站 https://www.gysensor.cn/air-gy39/
  • 传感器技术参数

gy1.png

      GY39-MCU-IIC协议

gy39-iic.png

    传感器接线示意图
Snipaste_2023-08-09_16-50-37.png

3. OLED显示模块
        OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快的特点。
目前市面上常用的0.96寸OLED屏幕通讯方式主要有SPI和I2C两种!SPI为4线制较多,而I2C为2线制。2种通讯协议较为浅显的区别:总所周知,SPI的通讯速度明显快于I2C的通讯速度,所以通常使用SPI通讯协议的OLED屏幕可以实现更高的帧数显示,画面更为流畅丝滑。本次实验所采用的0.96寸OLED屏幕为I2C通讯方式,故在此稍微给读者介绍一下I2C通讯原理。
    IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。​    I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。​    开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。​    结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。​    应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,​    表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。

ra-oled-demo.jpg

4 项目配置

瑞萨RA系列的MCU,提供了图形化配置工具,和STM32CubeMX类似,这大大的方便了开发者配置。同时,瑞萨的Flexible Software Package 旨在以较低的内存占用量提供快速高效的驱动程序和协议栈。 FSP 集成了中间件协议栈、独立于 RTOS 的硬件抽象层(HAL)驱动程序, 以及最基础的板级支持包(BSP)驱动程序。
在本次的设计中,主要是对于传感器模块,显示模块进行相关的配置,下面是配置过程。
4.1 OLED显示模块
        选择了使用EBF模块接口上的I2C接口,因为改接口的布线顺序和OLED的I2C接口一致。可以直接将OLED插上去,减少了接线。该接口使用的是SCI6的I2C功能。
        Pin下配置如下:选择SCI6,复用I2C模式。
ra-oled-1.png
ra-oled-2.png
ra-oled-3.png
2. 传感器模块
      温湿度传感器DHT11,任意配置一个GPIO端口就可以了,不需要其他的配置,只要注意时序问题即可,重点在GY39传感器的配置。
Pin下配置如下:选择SCI2,复用I2C模式。
gy-ra-iic1.png
gy-ra-iic2.png
gy-ra-iic3.png
主函数代码

主函数的代码主要是传感器的基本配置,OLED模块的配置,调试串口的配置与上位机通信的格式。
  1. //--------------------------------------------------------------------------------------------------
  2. // 函数头文件    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9
  3. //--------------------------------------------------------------------------------------------------
  4. #include "hal_data.h"
  5. #include "oled.h"
  6. #include "bsp_debug_uart.h"
  7. #include "bsp_led.h"
  8. #include "bsp_dht11.h"
  9. #include "bsp_gpt_timing.h"

  10. #define SUCCESS 1

  11. void Hardware_init(void);//硬件初始化

  12. FSP_CPP_HEADER
  13. void R_BSP_WarmStart(bsp_warm_start_event_t event);
  14. FSP_CPP_FOOTER

  15. /* Callback function */
  16. i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
  17. //oled sci6_i2c 回调函数
  18. void sci6_i2c_master_callback(i2c_master_callback_args_t *p_args)
  19. {
  20.     i2c_event = I2C_MASTER_EVENT_ABORTED;
  21.     if (NULL != p_args)
  22.     {
  23.         /* capture callback event for validating the i2c transfer event*/
  24.         i2c_event = p_args->event;
  25.     }

  26. }
  27. //gy39 sci2_i2c 回调函数
  28. void sci2_i2c_master_callback(i2c_master_callback_args_t *p_args)
  29. {
  30.     i2c_event = I2C_MASTER_EVENT_ABORTED;
  31.     if (NULL != p_args)
  32.     {
  33.         /* capture callback event for validating the i2c transfer event*/
  34.         i2c_event = p_args->event;
  35.     }

  36. }

  37. fsp_err_t err = FSP_SUCCESS;
  38. uint32_t  timeout_ms = 1000;

  39. DHT11_Data_TypeDef DHT11_Data;
  40. uint8_t Temperature,Humidity;
  41. extern uint8_t temp_humi_flag;
  42. extern uint32_t time1s_flag;
  43. //gy39传感器,数据点定义
  44. typedef struct
  45. {
  46.     uint32_t P;
  47.     uint16_t Temp;
  48.     uint16_t Hum;
  49.     uint16_t Alt;
  50. } bme;
  51. bme Bme;
  52. uint32_t Lux;
  53. float LightLux;
  54. //==================================================================================================
  55. //  函数说明: 硬件初始化
  56. //  函数备注: Hardware_init
  57. //--------------------------------------------------------------------------------------------------
  58. //  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9
  59. //==================================================================================================
  60. void Hardware_init(void)
  61. {
  62.         Debug_UART4_Init(); // SCI4 UART 调试串口初始化
  63.         GPT0_Timing_Init();
  64.         printf("Debug-UART4-Init OK \r\n");
  65.         LED_Init();
  66.         printf("LED_Init    OK \r\n");
  67.         printf("IIC-Config  Start \r\n");
  68.         DHT11_Init();
  69.         printf("DHT11_Init OK \r\n");
  70.         /* Initialize the I2C module */
  71.         err = R_SCI_I2C_Open(&g_sci6_i2c_ctrl, &g_sci6_i2c_cfg);//配置IIC接口,完成OLED模块的配置
  72.         /* Handle any errors. This function should be defined by the user. */
  73.         assert(FSP_SUCCESS == err);
  74.         printf("IIC-Config OK \r\n");
  75.         OLED_Init();            //初始化OLED
  76.         OLED_Clear();
  77.         printf("oled-Init OK \r\n");

  78. }

  79. //读取传感器数据
  80. void read_bme(void)
  81. {
  82.     uint16_t data_16[2] ={ 0 };
  83.     uint8_t data[10] = { 0x00 }; //接收读取后的数据
  84.     uint8_t write_buffer = 0x04; //写数据
  85.     err = R_SCI_I2C_Open (&g_sci2_i2c_ctrl, &g_sci2_i2c_cfg);
  86.     err = R_SCI_I2C_Write (&g_sci2_i2c_ctrl, &write_buffer, 1, true);
  87.     err = R_SCI_I2C_Abort (&g_sci2_i2c_ctrl);
  88.     R_BSP_SoftwareDelay (3, BSP_DELAY_UNITS_MILLISECONDS);
  89.     err = R_SCI_I2C_Read (&g_sci2_i2c_ctrl, data, 10, false);
  90.     R_BSP_SoftwareDelay (3, BSP_DELAY_UNITS_MILLISECONDS);
  91.     err = R_SCI_I2C_Abort (&g_sci2_i2c_ctrl);
  92.     err = R_SCI_I2C_Close (&g_sci2_i2c_ctrl);

  93.     Bme.Temp = (data[0] << 8) | data[1];
  94.     data_16[0] = (data[2] << 8) | data[3];
  95.     data_16[1] = (data[4] << 8) | data[5];

  96.     Bme.P = (((uint32_t) data_16[0]) << 16) | data_16[1];
  97.     Bme.Hum = (data[6] << 8) | data[7];
  98.     Bme.Alt = (data[8] << 8) | data[9];
  99. }
  100. //读取传感器数据 获得光照强度
  101. void read_lux(void)
  102. {
  103.     uint16_t data_16[2] ={ 0 };
  104.     uint8_t data[4] = { 0 };
  105.     uint8_t write_buffer = 0x00; //写数据
  106.     err = R_SCI_I2C_Open (&g_sci2_i2c_ctrl, &g_sci2_i2c_cfg);
  107.     err = R_SCI_I2C_Write (&g_sci2_i2c_ctrl, &write_buffer, 1, true);
  108.     err = R_SCI_I2C_Abort (&g_sci2_i2c_ctrl);
  109.     R_BSP_SoftwareDelay (3, BSP_DELAY_UNITS_MILLISECONDS);
  110.     err = R_SCI_I2C_Read (&g_sci2_i2c_ctrl, data, 4, false);
  111.     R_BSP_SoftwareDelay (3, BSP_DELAY_UNITS_MILLISECONDS);
  112.     err = R_SCI_I2C_Abort (&g_sci2_i2c_ctrl);
  113.     err = R_SCI_I2C_Close (&g_sci2_i2c_ctrl);
  114.     data_16[0] = (data[0] << 8) | data[1];
  115.     data_16[1] = (data[2] << 8) | data[3];
  116.     Lux = (((uint32_t) data_16[0]) << 16) | data_16[1];

  117. }
  118. //==================================================================================================
  119. //  函数说明: 主函数入口
  120. //  函数备注: hal_entry
  121. //--------------------------------------------------------------------------------------------------
  122. //  |   -   |   -   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9
  123. //==================================================================================================
  124. void hal_entry(void)
  125. {
  126.         Hardware_init();
  127.         printf("RA6M5-Board-Init OK \r\n");

  128.         OLED_ShowCHinese(0,0,0);//瑞
  129.         OLED_ShowCHinese(16,0,1);//萨
  130.         OLED_ShowCHinese(32,0,5);//电
  131.         OLED_ShowCHinese(48,0,6);//子
  132.         OLED_ShowString(60,0,"Renesas",16);
  133.         OLED_ShowNum(0,2,2023,4,16);//显示ASCII字符的码值
  134.         OLED_ShowCHinese(32,2,2);//中文字->年
  135.         OLED_ShowNum(48,2,8,2,16);//显示ASCII字符的码值
  136.         OLED_ShowCHinese(64,2,3);//中文字->月
  137.         OLED_ShowNum(80,2,5,2,16);//显示ASCII字符的码值
  138.         OLED_ShowCHinese(96,2,4);//中文字->日

  139.         OLED_ShowCHinese(0,4,7);   //中文字->温
  140.         OLED_ShowCHinese(16,4,9);  //中文字->度

  141.         OLED_ShowCHinese(64,4,8);  //中文字->湿
  142.         OLED_ShowCHinese(80,4,9);  //中文字->度

  143.         OLED_ShowString(0,6,"Light:",16);
  144.         OLED_ShowString(96,6,"Lux",16);
  145.         R_BSP_PinAccessEnable();
  146.         R_BSP_PinWrite(BSP_IO_PORT_00_PIN_01, BSP_IO_LEVEL_HIGH); //DHT11端口配置

  147.           while(1)
  148.           {

  149.               if (time1s_flag == 1)
  150.               {
  151.                   printf("T%dPH%dI", Temperature, Humidity);//1S串口打印一次,与上位机进行通信
  152.                   printf("\r\n");
  153.               }
  154.              OLED_ShowNum(32,4,Temperature,2,16);
  155.              OLED_ShowNum(96,4,Humidity,2,16);
  156.              read_bme();
  157.              read_lux (); //光照传感器
  158.              LightLux = Lux / 100;
  159.              //printf("LightLux: %.2f lux \r\n ",(float)LightLux );
  160.              OLED_ShowNum(48,6,LightLux,5,16);
  161.           }


  162. #if BSP_TZ_SECURE_BUILD
  163.     /* Enter non-secure code */
  164.     R_BSP_NonSecureEnter();
  165. #endif
  166. }
复制代码
测试效果
ra6m5-image.png
ra-app2.png

参考代码:https://gitee.com/delehubcode/Op ... sas/RA6M5-Embedfire

总结
首先非常感谢野火举办的瑞萨RA MCU创意氛围赛,能让我入围获得这次参赛的机会。本次创意氛围赛学习到了很多东西,对RA6M5单片机的内核以及控制有了了解,野火官方提供的手册例程使用起来也很方便,能够快速上手,便于开发使用。本项目初步设计思路是打算以瑞萨单片机作为控制和数据处理的单元,使用传感器去监测周围的环境参数,在屏幕上完成传感器数据和相关信息的显示。同时,使用无线模组接入物联网云平台。尝试利用上位机实现对于相关环境参数监测。但是由于时间原因以及个人能力有限制,只完成了部分设计。虽然现在完成的功能较为简单,但是希望后面有时间继续完善系统设计,添加实时操作系统,接入云平台,利用微信小程序,app等相关技术完善作品,最后,再次感谢野火和瑞萨举办RA-MCU创意氛围赛,提供了学习机会。

回复

使用道具 举报

 楼主| 发表于 2023-8-19 08:59:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 17:16 , Processed in 0.040810 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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