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
+關注
關注
146文章
17893瀏覽量
361817 -
ARM
+關注
關注
134文章
9328瀏覽量
375671 -
開發板
+關注
關注
25文章
5589瀏覽量
103128 -
瑞薩電子
+關注
關注
37文章
2920瀏覽量
73163
發布評論請先 登錄
相關推薦
熱點推薦
【RA4L1-SENSOR】RA4L1-SENSOR開發版開箱評測+e2studio軟件安裝
RA4L1-SENSOR開發板。如下圖所示
拿出里面的開發板,可以看到3件套,接上USB線,
二、e2studio軟件安裝
e2 studio (簡稱為
發表于 06-12 23:23
【RA-Eco-RA4M2開發板評測】RT-Thread上驅動I2C溫濕度傳感器
I2C Bus0
uart9 Character Device2
pinPin Device0
msh />
最后用RT-Thread sensor框架自帶的測試cmd測試下溫濕度傳
發表于 05-08 22:42
【RA-Eco-RA4M2開發板評測】RA-Eco-RA4M2 溫濕度傳感器HS3003
(%)和溫度(℃)數據通過以下公式進行計算。
相對濕度:
溫度轉換:
2 實驗詳解
2.1 實驗目的
1) 通過實驗掌握I
發表于 05-03 22:57
【瑞薩RA2L1入門學習】+e2_studio軟件安裝及使用
一、e2_studio軟件安裝及使用
注冊e2 studio | Renesas 瑞薩電子
下載軟件
安裝
4.創建工程
更改工程位置
新
發表于 03-27 13:25
【瑞薩RA2L1入門學習】2. PWM呼吸燈
開發板:RA-Eco-RA2L1-48PIN-V1.0
IDE:e2studio
程序燒錄工具:RAFP
參考資料:“RA2L1入門教學實驗.pdf”
本次使用的是32位GPT
1.編
發表于 01-30 21:55
【瑞薩RA2L1入門學習】1. 點亮LED
首次使用瑞薩單片機,先說一下使用感受。
本次學習使用的是RA-Eco-RA2L1-48PIN-V1.0開發板+e2studio(官方的集成開發環境)+RAFP(官方的程序燒錄工具)。
發表于 01-29 22:17
【RA-Eco-RA0E1-32PIN-V1.0開發板試用】sht30溫濕度傳感器
這一章節,繼續探究RA0E1的硬件iic外設。來驅動SHT30溫濕度傳感器,該款溫濕度傳感器具有高精度穩定性,可以精確到0.125度的分辨率
發表于 10-14 23:40
瑞薩e2studio(1)----瑞薩芯片之搭建FSP環境
視頻教學
樣品申請
請勿添加外鏈
e2studio軟件
e2studio是瑞薩的集成開發環境,FSP 提供了眾多可提高效率的工具,用于開發針對瑞
發表于 09-30 15:28
溫濕度傳感器怎么調試
的工作原理 溫度測量原理 溫濕度傳感器中的溫度測量通常采用熱敏電阻或熱電偶。熱敏電阻的阻值隨溫度的變化而變化,通過測量電阻值可以計算出溫度值。熱電偶則是利用兩種不同金屬或合金的接觸點產生的熱電勢來測量溫度。
想要準確地測量環境溫濕度?溫濕度傳感器是關鍵!
的應用十分廣泛。 ?溫濕度傳感器的工作原理 溫濕度傳感器的工作原理主要基于幾種不同的物理效應: 電 阻式: 電阻式溫濕度
評論