瑞萨单片机论坛
直播中

安安踢球球

6年用户 113经验值
擅长:电源/新能源 嵌入式技术
私信 关注
[讨论]

【RA4E2开发板评测】OLED显示DHT11温度测评

温度显示

  1. 套件概述
RA\\-Eco\\-RA4E2\\-64PIN\\-V1\\.0是一款基于100MHz Arm® Cortex®\\-M33内核架构的核心板,主控芯片为R7FA4E2B93CFM。RA4E2组是RA4系列中最新的入门级微控制器,基于带有TrustZone的100MHz Arm® Cortex®\\-M33内核。RA4E2 MCU提供了高性能和优化的外设功能以及最小的封装选项,包括节省空间的36引脚BGA和32引脚QFN封装。这些都满足了对成本敏感和空间受限的应用的需要。由于RA4E2具有均衡的性能、先进的外设功能和可扩展性,它为更广泛的RA系列提供了一个入门点

2.特性:

  • 1个复位按键
  • 1个自定义按键
  • 2个LED
  • 2个PMOD接口
  • 板载USB转TTL模块,可用于串口通信和烧录
  • 板载SWD接口,方便用户调试与下载
  • 100MHz的Arm Cortex-M33,具有TrustZone功能
  • 128KB的闪存和40KB的SRAM
  • 4KB数据闪存,类似EEPROM数据存储功能
  • 1KB待机SRAM
  • 64引脚封装
  • USB 2.0全速
  • CAN FD,I3C
  • HDMI CEC,SSI
  • 12位A/D转换器
  • 12位D/A转换器
  • 通用PWM定时器

3.相关链接

RA生态社区论坛:https://ramcu.cn

资料链接: https://www.ramcu.cn/index.php/lists/21.html

bilibili链接:https://space.bilibili.com/642126046

gitee链接:https://gitee.com/ramcu

其他学习资料

[野火]瑞萨RA系列FSP库开发实战指南:

https://doc.embedfire.com/mcu/renesas/fsp_ra/zh/latest/index.html

[百问网]《ARM嵌入式系统中面向对象的模块编程方法》:

https://renesas-docs.100ask.net/zh/DShanMCU_RA6M5/object_oriented_module_programming_method_in_ARM_embedded_system/

选择P402、P401为OLED显示屏I2C接口的SCL与SDA引脚,选择P110、P109作为UART串口引脚,新建工程选择R7FA4E2B93CFM作为平台芯片,再进行IO和UART设置,设置UART工作方式和中断函数名,uart引脚;设置OLED使用的I2C引脚功能:

接下来移植代码并调试UART数据传输,然后修改 hal_entry.c文件中关键代码:

#include "hal_data.h"

#include<stdio.h>

#include "oled.h"

FSP_CPP_HEADER

void R_BSP_WarmStart(bsp_warm_start_event_t event);

FSP_CPP_FOOTER

fsp_err_t err = FSP_SUCCESS;

volatile bool uart_send_complete_flag = false;

uint8_t RxBuff[1]; //进入中断接收数据的数组

uint8_t DataBuff[5000]; //保存接收到的数据的数组

char hollow[10]="hollow";

int RxLine=0; //接收到的数据长度

int Rx_flag=0; //接受到数据标志

int Rx_flag_finish=0; //接受完成或者时间溢出

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

\\#define PUTCHAR\\_PROTOTYPE int fputc\\(int ch, FILE \\*f\\)

#endif

PUTCHAR_PROTOTYPE

{

err = R\\_SCI\\_UART\\_Write\\(&g\\_uart9\\_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;

}

要使用printf函数还要进行设置,要在编译设置中完成如下配置,右键项目进入属性界面,选择 C/C++ 构建 - 设置 - GNU Arm Cross C Linker - Miscellaneous,勾选 printf 、scanf 以及syscalls 选项:

再将OLED对应代码加入到项目工程中,再修改oled.h中的代码:

#define OLED_SCL_Set() R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_HIGH)

#define OLED_SCL_Clr() R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_LOW)

#define OLED_SDA_Clr() R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_01, BSP_IO_LEVEL_LOW)

#define OLED_SDA_Set() R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_01, BSP_IO_LEVEL_HIGH)

在主函数中调用OLED显示函数:

void hal_entry(void)

{

/\\* TODO: add your own code here \\*/

err = R\\_SCI\\_UART\\_Open\\(&g\\_uart9\\_ctrl, &g\\_uart9\\_cfg\\);

   assert\\(FSP\\_SUCCESS == err\\);

   OLED\\_Init\\(\\);

   OLED\\_ColorTurn\\(0\\);//0正常显示,1 反色显示

   OLED\\_DisplayTurn\\(0\\);//0正常显示 1 屏幕翻转显示

while(1)

{ OLED_Refresh();

R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);

OLED_Clear();

OLED_ShowChinese(0,0,0,16,1);//中

OLED_ShowChinese(18,0,1,16,1);//景

OLED_ShowChinese(36,0,2,16,1);//园

OLED_ShowChinese(54,0,3,16,1);//电

OLED_ShowChinese(72,0,4,16,1);//子

OLED_ShowChinese(90,0,5,16,1);//技

OLED_ShowChinese(108,0,6,16,1);//术

OLED_ShowString(8,16,"ZHONGJINGYUAN",16,1);

OLED_ShowString(20,32,"2014/05/01",16,1);

printf\\("hollow  world \\\\n"\\);

printf\\("length=%d\\\\r\\\\n",RxLine\\);

R\\_SCI\\_UART\\_Write\\(&g\\_uart9\\_ctrl, hollow, 6\\);

R\\_BSP\\_SoftwareDelay\\(500, BSP\\_DELAY\\_UNITS\\_MILLISECONDS\\); // NOLINT

 R\\_IOPORT\\_PinWrite\\(&g\\_ioport\\_ctrl, BSP\\_IO\\_PORT\\_02\\_PIN\\_07, BSP\\_IO\\_LEVEL\\_LOW\\);

    

R\\_BSP\\_SoftwareDelay\\(500, BSP\\_DELAY\\_UNITS\\_MILLISECONDS\\); // NOLINT

R\\_IOPORT\\_PinWrite\\(&g\\_ioport\\_ctrl, BSP\\_IO\\_PORT\\_02\\_PIN\\_07, BSP\\_IO\\_LEVEL\\_HIGH\\);

      \\}

#if BSP_TZ_SECURE_BUILD

/\\* Enter non\\-secure code \\*/

R\\_BSP\\_NonSecureEnter\\(\\);

#endif

}

当然还要根据出现error进行逐个修改;

要测量温度传感器DHT11必须按照协议进行读取数据,接数据线到P0104引脚;

image.png

按照以下协议进行数据读取:
image.png

要注意引脚输入输出切换函数为:

R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, IOPORT_CFG_PORT_DIRECTION_OUTPUT);

R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_DIRECTION_INPUT );

编写DHT11读取程序如下:

typedef struct

{

uint8_t humi_high8bit;

uint8_t humi_low8bit;

uint8_t temp_high8bit;

uint8_t temp_low8bit;

uint8_t check_sum;

float humidity;

float temperature;

} DHT11_Data_TypeDef;

DHT11_Data_TypeDef DHT11_Data;

uint8_t showdata[8];

unsigned char U8FLAG,U8comdata,U8temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H,U8RH_data_L;

unsigned char str[5],U8T_data_H,U8T_data_L,U8checkdata;

static uint8_t DHT11_ReadByte (void )

{

uint8_t i, temp=0;

//R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_07, BSP_IO_DIRECTION_INPUT);

//R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_07, BSP_IO_DIRECTION_OUTPUT);

R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_DIRECTION_INPUT );

for (i=0;i<8;i++)

{

while (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==0);

R_BSP_SoftwareDelay (40, BSP_DELAY_UNITS_MICROSECONDS );

if (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==1)

{

while (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==1);

temp|=(uint8_t)(0x01<<(7-i));

}

else

{

temp&=(uint8_t)~(0x01<<(7-i));

}

}

return temp;

}

uint8_t DHT11_Read_TempAndHumidity (DHT11_Data_TypeDef *DHT11_Data)

{

uint8_t temp;

uint16_t humi_temp;

R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , IOPORT_CFG_PORT_DIRECTION_OUTPUT );

R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_LEVEL_LOW );

R_BSP_SoftwareDelay (20, BSP_DELAY_UNITS_MILLISECONDS );

R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_LEVEL_HIGH );

R_BSP_SoftwareDelay (30, BSP_DELAY_UNITS_MICROSECONDS );

R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_DIRECTION_INPUT );

R_BSP_SoftwareDelay (30, BSP_DELAY_UNITS_MICROSECONDS );

if (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==0)

{

while (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==0);

while (R_BSP_PinRead( BSP_IO_PORT_01_PIN_04 )==1);

DHT11_Data->humi_high8bit= DHT11_ReadByte();

DHT11_Data->humi_low8bit = DHT11_ReadByte();

DHT11_Data->temp_high8bit= DHT11_ReadByte();

DHT11_Data->temp_low8bit = DHT11_ReadByte();

DHT11_Data->check_sum = DHT11_ReadByte();

// DHT11_Mode_Out_PP();

R_IOPORT_PinCfg(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , IOPORT_CFG_PORT_DIRECTION_OUTPUT );

R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04 , BSP_IO_LEVEL_HIGH );

humi_temp=DHT11_Data->humi_high8bit*100+DHT11_Data->humi_low8bit;

DHT11_Data->humidity =( float )humi_temp/100;

humi_temp=DHT11_Data->temp_high8bit*100+DHT11_Data->temp_low8bit;

DHT11_Data->temperature=( float )humi_temp/100;

temp = DHT11_Data->humi_high8bit + DHT11_Data->humi_low8bit +

DHT11_Data->temp_high8bit+ DHT11_Data->temp_low8bit;

if (DHT11_Data->check_sum==temp)

{return 1;}

else return 0;}

else return 0;

}

OLED显示和接线如图:
image.png

86c763a1d4c7192d72152e5ac3af31e3

更多回帖

发帖
×
20
完善资料,
赚取积分