0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

瑞萨e2studio----RA2L1通过传感器检测温湿度

RA生态工作室 2022-01-04 14:38 次阅读

1.概述

本篇文章主要介绍如何使用芯片型号R7FA2L1AB2DFL的开发板外接温湿度传感器进行温湿度检测,并通过串口显示温湿度。

2.硬件准备

这里我们准备的是芯片型号R7FA2L1AB2DFL的开发板,DHT11温湿度传感器模块

5e16e074-6b23-11ec-ad3b-dac502259ad0.png

3.温湿度传感器参数

5e85e758-6b23-11ec-ad3b-dac502259ad0.png

供电电压:3.3V~5.5V DC
输出:单总线数字信号

测量范围:湿度 20~90%RH,温度 0~50℃

测量精度:湿度±5%RH,温度±2%℃

分辨率:湿度1%RH,温度1℃

长期稳定性:<±1%RH/年

4.新建工程

5e950e0e-6b23-11ec-ad3b-dac502259ad0.png

5.工程模板

5ecf24ea-6b23-11ec-ad3b-dac502259ad0.png


6.保存工程路径

5ee049dc-6b23-11ec-ad3b-dac502259ad0.png

7.芯片配置

5eedd2e6-6b23-11ec-ad3b-dac502259ad0.png

8.工程模板选择

5f1fa8f2-6b23-11ec-ad3b-dac502259ad0.png


9.UART配置

点击Stacks->NewStack->Driver->Connectivity -> UART Driver on r_sci_uart。

5f2e986c-6b23-11ec-ad3b-dac502259ad0.png


10.UART属性配置

5f4116cc-6b23-11ec-ad3b-dac502259ad0.png

11.设置e2studio堆栈

5f53f1e8-6b23-11ec-ad3b-dac502259ad0.png

12.e2studio的重定向printf设置

5fb8bf92-6b23-11ec-ad3b-dac502259ad0.png

C++ 构建->设置->GNU ARM Cross CLinker->Miscellaneous去掉Other linker flags中的 “--specs=rdimon.specs”

5fccdfea-6b23-11ec-ad3b-dac502259ad0.png

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引脚上。

5fddc012-6b23-11ec-ad3b-dac502259ad0.png

15.IO配置

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

5fecea7e-6b23-11ec-ad3b-dac502259ad0.png


16.DHT11数据传输

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

数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。

5ffe7e10-6b23-11ec-ad3b-dac502259ad0.png

数据传送正确,则byte4+byte3+byte2+byte1=byte0。

17.数据发送时序

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

600ab00e-6b23-11ec-ad3b-dac502259ad0.png

18.数据0&数据1

数据1时序图:

601b162e-6b23-11ec-ad3b-dac502259ad0.png

数据0时序图:

602c985e-6b23-11ec-ad3b-dac502259ad0.png

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

19.R_IOPORT_PortDirectionSet()函数原型

603910c0-6b23-11ec-ad3b-dac502259ad0.png

故可以通过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是头文件。

604c3fa6-6b23-11ec-ad3b-dac502259ad0.png

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.结果演示

605f5406-6b23-11ec-ad3b-dac502259ad0.png

上图是我们测出来的温湿度,下图是当地温湿度。可以看出还是在误差范围内的。

60a4f402-6b23-11ec-ad3b-dac502259ad0.png

当我们没有接上DHT11时:

60b0acd4-6b23-11ec-ad3b-dac502259ad0.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    145

    文章

    15985

    浏览量

    343311
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8639

    浏览量

    361622
  • 开发板
    +关注

    关注

    25

    文章

    4400

    浏览量

    93769
  • 瑞萨电子
    +关注

    关注

    37

    文章

    2734

    浏览量

    71693
收藏 人收藏

    评论

    相关推荐

    【原创】DHT11传感器温湿度监测系统毕设,论文、代码、原理图和仿真介绍

    设计要求 1.设计一个基于51单片机和DHT11传感器温湿度监测系统; 2.传感器DHT11实现对环境
    发表于 03-13 00:53

    温湿度传感器工作原理 温湿度传感器的接线方法

    温湿度传感器是一种用于测量环境温度和相对湿度的装置。它通常用于工业、农业、气象、室内空调等领域。本文将详细介绍温湿度传感器的工作原理和接线方
    的头像 发表于 02-14 18:00 3837次阅读

    温湿度传感器接线端子T是什么意思

    于将传感器与监测设备或控制系统的温度输入端连接起来。通过读取T端子的电信号,监测设备或控制系统可以获取到当前环境的温度数据。 温湿度传感器的接线端子通常有三个,T端子用于温度输入,而另
    的头像 发表于 01-16 09:16 451次阅读

    4G远程温湿度传感器在养殖场中的应用

    在养殖业中,温湿度是影响动植物生长和健康的关键因素之一。而温湿度传感器则可以实时监测和记录这些数据,帮助养殖户及时发现和解决问题,提高生产效率和动物福利。首先,温湿度
    的头像 发表于 01-09 16:02 166次阅读
    4G远程<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>在养殖场中的应用

    4G远程温湿度传感器在仓库中的应用—蜂窝物联

    。为了更好的观测和掌握温湿度的变化,仓库需要安装温湿度传感器实时监测温湿度状态,确保适宜货物储存的温湿度环境。 蜂窝物联仓库存储环境远程监控
    的头像 发表于 01-02 09:36 148次阅读

    【ELF 1开发板试用】板载资源测试4:体验温湿度传感器

    飞凌嵌入式ELF1开发板(以下简称为“开发板”)将温湿度传感器AHT20集成在了底板上,此次依旧做最基础的测试,以下是测试过程记录。一、实验名称ELF
    发表于 12-18 11:09

    【ELF 1开发板试用】+传感器检测

    ELF 1开发板通过几种传感器的测试,如温湿度、六轴传感器等,而在配备功能扩展板的情况下,还能进行光照强度的
    发表于 11-29 11:59

    基于51单片机和AHT10温湿度传感器温湿度计源码

    一款基于51单片机和AHT10温湿度传感器温湿度计源码。
    发表于 10-09 08:39

    瑞萨RA6M3 MCU通过I2C读取HS3001温湿度传感器

    瑞萨RA6M3 MCU通过I2C读取HS3001温湿度传感器
    的头像 发表于 09-26 16:57 509次阅读
    瑞萨<b class='flag-5'>RA</b>6M3 MCU<b class='flag-5'>通过</b>I2C读取HS3001<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>

    大数据中心温湿度监控系统解决方案之以太网温湿度传感器

    成为数据中心运维中不可忽视的问题。为了解决这一难题,H-THRJ45以太网温湿度传感器应运而生。 H-THRJ45以太网温湿度传感器的工作原理 H-THRJ45以太网
    的头像 发表于 08-02 09:52 783次阅读
    大数据中心<b class='flag-5'>温湿度</b>监控系统解决方案之以太网<b class='flag-5'>温湿度</b><b class='flag-5'>传感器</b>

    温湿度检测仪:环境监测的关键工具

    温湿度检测仪的工作原理 温湿度检测仪主要由温度传感器湿度
    的头像 发表于 08-01 11:43 540次阅读

    ​什么是温湿度传感器

    温湿度传感器由于体积小,性能稳定等特点,被广泛应用在生产生活的各个领域。温湿度一体化传感器是采用数字集成传感器做探头,配以数字化处理电路,从
    的头像 发表于 07-07 16:50 696次阅读

    如何选择温湿度传感器

    温湿度传感器在各种领域中起着至关重要的作用,无论是室内环境监测还是工业自动化控制,然而市场上存在各种类型和品牌的温湿度传感器,如何选择适合自己需求的
    的头像 发表于 06-18 11:06 914次阅读

    【CW32饭盒派开发板试用体验】读取自己的温湿度传感器

    周末到了,是时候折腾手里的开发板了。我自己有一个DHT11的温湿度传感器,想想就用开发板读一下这个传感器的数据吧。 DHT11是一款数字温湿度传感器
    发表于 06-03 11:01

    FPB-RA6E1快速原型板】开箱+环境搭建+e2studio项目搭建

    1.选择一个目录作为工作目录 2.文件--新建--新建C/C++--新建RA 3.项目名称为testblink,点击下一步。然后选择
    发表于 05-25 01:17