1.概述
本篇文章主要介绍如何使用芯片型号R7FA2L1AB2DFL的开发板外接温湿度传感器进行温湿度检测,并通过串口显示温湿度。
2.硬件准备
这里我们准备的是芯片型号R7FA2L1AB2DFL的开发板,DHT11温湿度传感器模块。

3.温湿度传感器参数

供电电压:3.3V~5.5V DC
输出:单总线数字信号
测量范围:湿度 20~90%RH,温度 0~50℃
测量精度:湿度±5%RH,温度±2%℃
分辨率:湿度1%RH,温度1℃
长期稳定性:<±1%RH/年
4.新建工程
5.工程模板

6.保存工程路径
7.芯片配置
8.工程模板选择

9.UART配置
点击Stacks->NewStack->Driver->Connectivity -> UART Driver on r_sci_uart。

10.UART属性配置
11.设置e2studio堆栈
12.e2studio的重定向printf设置
C++ 构建->设置->GNU ARM Cross CLinker->Miscellaneous去掉Other linker flags中的 “--specs=rdimon.specs”
13.printf输出重定向到串口
打印最常用的方法是printf,所以要解决的问题是将printf的输出重定向到串口,然后通过串口将数据发送出去。
注意一定要加上头文件#include
#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_uart0_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;i++)>
14.DHT11链接图
由下图我们可以得知,我们将DATA接在了P208引脚上。

15.IO配置
可以给P208命名,并将P208引脚设置为输入模式。

16.DHT11数据传输
DHT11数字湿温度传感器采用单总线数据格式,单个数据引脚端口完成输入输出双向传输。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。
数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。

数据传送正确,则byte4+byte3+byte2+byte1=byte0。
17.数据发送时序
首先主机发送开始信号,主机变为输出模式拉低数据线,保持至少18ms时间,再拉高数据线20~40us时间,然后主机变为输入模式读取DHT11的响应。DHT11接收到主机发送的开始信号,DHT11会拉低数据线,保持80us时间,作为响应信号,然后DHT11拉高数据线,保持80us时间后,开始输出数据。待40bit数据传输结束后,上拉电阻拉高总线。

18.数据0&数据1
数据1时序图:

数据0时序图:

通过对比时序图可知,要判断数据0或数据1,只要判断拉高电平时间即可。例如,在电平被拉高的40us判断高低电平,若此时为低电平,则为数据0。若此时为高电平,则为数据1。
19.R_IOPORT_PortDirectionSet()函数原型

故可以通过R_IOPORT_PortDirectionSet()函数设置端口IO方向,设置方法如下所示。
//设置P208为输入
R_IOPORT_PortDirectionSet(&g_ioport_ctrl, BSP_IO_PORT_02, 0<<8, 1<<8);
//设置P208为输出
R_IOPORT_PortDirectionSet(&g_ioport_ctrl, BSP_IO_PORT_02, 1<<8, 1<<8);
20.dht11.c& dht11.h
添加2个文件,dht11.c是驱动文件,dht11.h是头文件。

dht11.c 代码:
#include "hal_data.h"
#include
#include "dht11.h"
uint8_t Temp;
uint8_t Humi;
uint8_t flag=0;
uint8_t retry=0;
bsp_io_level_t p_port_value_dht11;
void DHT11_Rst()
{
DHT11_IO_OUT();//SET OUTPUT
DHT11_DQ_LOW;//拉低DQ
R_BSP_SoftwareDelay(18, BSP_DELAY_UNITS_MILLISECONDS);//拉低至少18ms
DHT11_DQ_HIGH;//DQ=1
R_BSP_SoftwareDelay(20, BSP_DELAY_UNITS_MICROSECONDS);//主机拉高20~40us
}
void DHT11_Check()
{
DHT11_IO_IN();//SET INPUT
retry=0;
R_IOPORT_PinRead(&g_ioport_ctrl, DHT11, &p_port_value_dht11);
while(p_port_value_dht11&&retry<100)
{
R_IOPORT_PinRead(&g_ioport_ctrl, DHT11, &p_port_value_dht11);
retry++;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
}
if(retry>=100)flag=1;
else retry=0;
while(!p_port_value_dht11&&retry<100)
{
R_IOPORT_PinRead(&g_ioport_ctrl, DHT11, &p_port_value_dht11);
retry++;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
}
if(retry>=100)flag=1;
if(flag==1)
{
printf("No dht11\n");
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
}
}
void DHT11_Read_Data()
{
uint8_t buf[5];
uint8_t i;
flag=0;
DHT11_Rst();
DHT11_Check();
if(flag==0)
{
for(i=0;i<5;i++)//读取40位数据
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])//校验读的温湿度结果是否正确
{
Humi=buf[0];
Temp=buf[2];
printf("Humi=%d\n",Humi);
printf("Temp=%d\n",Temp);
}
else printf("Receive error\n");
}
R_BSP_SoftwareDelay(2, BSP_DELAY_UNITS_SECONDS);
}
//从DHT11读取一个位 返回值:1/0
uint8_t DHT11_Read_Bit(void)
{
retry=0;
while(p_port_value_dht11&&retry<100)//等待变为低电平
{
R_IOPORT_PinRead(&g_ioport_ctrl, DHT11, &p_port_value_dht11);
retry++;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
}
retry=0;
while(!p_port_value_dht11&&retry<100)//等待变为高电平
{
R_IOPORT_PinRead(&g_ioport_ctrl, DHT11, &p_port_value_dht11);
retry++;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
}
R_BSP_SoftwareDelay(30, BSP_DELAY_UNITS_MICROSECONDS);
R_IOPORT_PinRead(&g_ioport_ctrl, DHT11, &p_port_value_dht11);
if(p_port_value_dht11)return 1;
else return 0;
}
//从DHT11读取一个字节 //返回值:读到的数据
uint8_t DHT11_Read_Byte(void)
{
uint8_t i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
dht11.h 代码:
#ifndef _DHT11_H_
#define _DHT11_H_
//IO方向设置
#define DHT11_IO_IN() R_IOPORT_PortDirectionSet(&g_ioport_ctrl, BSP_IO_PORT_02, 0<<8, 1<<8)
#define DHT11_IO_OUT() R_IOPORT_PortDirectionSet(&g_ioport_ctrl, BSP_IO_PORT_02, 1<<8, 1<<8)
//IO操作
#define DHT11_DQ_LOW R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_08, BSP_IO_LEVEL_LOW) //数据端口 PA0
#define DHT11_DQ_HIGH R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_08, BSP_IO_LEVEL_HIGH) //数据端口 PA0
void DHT11_Rst(void);
void DHT11_Check(void);
void DHT11_Read_Data(void);
uint8_t DHT11_Read_Bit(void);
uint8_t DHT11_Read_Byte(void);
#endif
21.hal_entry.c
hal_entry.c代码:
#include "hal_data.h"
#include
#include "dht11.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
fsp_err_t err = FSP_SUCCESS;
unsigned char send_buff[100];
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
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
err = R_SCI_UART_Write(&g_uart0_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;i++)>
22.结果演示
22.结果演示

上图是我们测出来的温湿度,下图是当地温湿度。可以看出还是在误差范围内的。
上图是我们测出来的温湿度,下图是当地温湿度。可以看出还是在误差范围内的。
当我们没有接上DHT11时:
当我们没有接上DHT11时:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
mcu
+关注
关注
147文章
19232浏览量
405183 -
ARM
+关注
关注
135文章
9611浏览量
394351 -
开发板
+关注
关注
26文章
6507浏览量
121360 -
瑞萨电子
+关注
关注
39文章
2987浏览量
74603
发布评论请先 登录
相关推荐
热点推荐
【瑞萨RA2L1入门学习】DHT11温湿度采集
数字温湿度传感器
RA2L1 作为 Renesas RA 家族的入门级低功耗产品,在保持极低功耗的同时提供了丰富的外设资源和完善的安全特性,非常适合物联网终端、环境监测等应用场景。
发表于 05-09 22:05
【瑞萨RA2L1入门学习】光敏电阻ADC检测
引脚,光敏传感器的Ao引脚连接开发板上的P000引脚。
四、实验
根据提供的瑞萨e2studio----Adc通过单次扫描多通道方式采样.
发表于 05-09 14:56
【瑞萨RA2L1入门学习】工业级高精度温湿度监控终端
├─────────────────┤
│ 感知层 │ SHT35传感器:完成高精度温湿度数据采集
└─────────────────┘
2、软件架构设计与功能实现
软件整体架构
基于瑞
发表于 05-08 16:24
【瑞萨RA2L1入门学习】+ RA-Eco-RA2L1-V2.0开发板概览、环境搭建与TTL串口烧录点灯
入门指南.pdf
| RA2L1数据手册.pdf
| RA2L1硬件手册.pdf
| RA2L1_E1_LQFP48 TOUCH.pdf
|
+---PPT
| 使用J-Link烧写程序到瑞
发表于 05-01 22:37
【瑞萨RA2L1入门学习】开箱 + 点亮LED灯
宽电压工作范围** ,集成了电容触摸、高精度模拟和多种定时器资源。
收到开发板后,包装比较简洁,主要包括:
RA2L1 开发板
二、开发环境准备
瑞萨官方推荐使用:
发表于 04-28 15:24
基于瑞萨R7FA2L1AB2DFL单片机的水位检测器制作方案
文章主要介绍如何使用e2studio灵活软件包(FSP)对瑞萨R7FA2L1AB2DFL单片机开发板进行ADC单通道采集电压,评估AD功能,以及制作水位
【瑞萨FPB-RA6E2试用】【瑞萨FPB-RA6E2】Zephyr-驱动-DHT11-温湿度传感器及设备树理解
【瑞萨FPB-RA6E2】Zephyr-驱动-DHT11-温湿度传感器及设备树理解
0、视频教程
视频教程地址:
https://www.b
发表于 01-13 14:54
【瑞萨RA6E2地奇星开发板试用】开发板介绍及环境搭建
物联网、工业控制、智能硬件等场景。
核心参数一览
项目
规格
主控芯片
R7FA6E2BB3CNE(瑞萨 RA6E2 系列)
内核
Arm Cortex-M33(带 TrustZone
发表于 12-22 00:40
【瑞萨RA6E2地奇星开发板试用】SHT30传感器串口调试学习和验证
v2.3
https://gitcode.com/Universal-Tool/131ce
总结
本文介绍了【瑞萨 RA6E2 地奇星开发板】驱动 SHT30 传感器实现串口打印环境
发表于 12-11 14:49
【瑞萨RA6E2】瑞萨E2S软件安装过程,等待过程玩下97_e2 studio_ZGZZ
;amp;vd_source=7ab92f6a337b22fda39554fd6e70f01a
本报告旨在记录基于瑞萨RA6E2 MCU评估板的初步开发体验。主要内容包括:
软件开发环
发表于 12-01 22:42
瑞萨RA2L1 MCU e² studio和FSP的使用指南
本期“RA MCU众测宝典” 继续聚焦 “环境搭建” 专题,带大家走进【RA-Eco-RA2L1-48PIN-V1.0】的世界,查看e² studio和FSP的下载、安装及使用指南从零
常见的温湿度传感器类型?
),温度精度为±0.2℃(典型)。湿度和温度数据可以通过MCU、蓝牙芯片或SoC芯片通过数字接口直接读取。它与SMBus、I2C接口兼容。非常适合用于暖通空调、环境监测等。
在选择
发表于 06-24 09:24
【RA4L1-SENSOR】RA4L1-SENSOR开发版开箱评测+e2studio软件安装
RA4L1-SENSOR开发板。如下图所示
拿出里面的开发板,可以看到3件套,接上USB线,
二、e2studio软件安装
e2 studio (简称为
发表于 06-12 23:23
瑞萨e2studio----RA2L1通过传感器检测温湿度
评论