1.概述
本篇文章主要介紹如何使用芯片型號(hào)R7FA2L1AB2DFL的開發(fā)板外接溫濕度傳感器進(jìn)行溫濕度檢測(cè),并通過(guò)串口顯示溫濕度。
2.硬件準(zhǔn)備
這里我們準(zhǔn)備的是芯片型號(hào)R7FA2L1AB2DFL的開發(fā)板,DHT11溫濕度傳感器模塊。
3.溫濕度傳感器參數(shù)
供電電壓:3.3V~5.5V DC
輸出:?jiǎn)慰偩€數(shù)字信號(hào)
測(cè)量范圍:濕度 20~90%RH,溫度 0~50℃
測(cè)量精度:濕度±5%RH,溫度±2%℃
分辨率:濕度1%RH,溫度1℃
長(zhǎng)期穩(wěn)定性:<±1%RH/年
4.新建工程
5.工程模板
6.保存工程路徑
7.芯片配置
8.工程模板選擇
9.UART配置
點(diǎn)擊Stacks->NewStack->Driver->Connectivity -> UART Driver on r_sci_uart。
10.UART屬性配置
11.設(shè)置e2studio堆棧
12.e2studio的重定向printf設(shè)置
C++ 構(gòu)建->設(shè)置->GNU ARM Cross CLinker->Miscellaneous去掉Other linker flags中的 “--specs=rdimon.specs”
13.printf輸出重定向到串口
打印最常用的方法是printf,所以要解決的問(wèn)題是將printf的輸出重定向到串口,然后通過(guò)串口將數(shù)據(jù)發(fā)送出去。
注意一定要加上頭文件#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引腳設(shè)置為輸入模式。
16.DHT11數(shù)據(jù)傳輸
DHT11數(shù)字濕溫度傳感器采用單總線數(shù)據(jù)格式,單個(gè)數(shù)據(jù)引腳端口完成輸入輸出雙向傳輸。數(shù)據(jù)分小數(shù)部分和整數(shù)部分,一次完整的數(shù)據(jù)傳輸為40bit,高位先出。
數(shù)據(jù)格式為:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)和。
數(shù)據(jù)傳送正確,則byte4+byte3+byte2+byte1=byte0。
17.數(shù)據(jù)發(fā)送時(shí)序
首先主機(jī)發(fā)送開始信號(hào),主機(jī)變?yōu)檩敵瞿J嚼蛿?shù)據(jù)線,保持至少18ms時(shí)間,再拉高數(shù)據(jù)線20~40us時(shí)間,然后主機(jī)變?yōu)檩斎肽J阶x取DHT11的響應(yīng)。DHT11接收到主機(jī)發(fā)送的開始信號(hào),DHT11會(huì)拉低數(shù)據(jù)線,保持80us時(shí)間,作為響應(yīng)信號(hào),然后DHT11拉高數(shù)據(jù)線,保持80us時(shí)間后,開始輸出數(shù)據(jù)。待40bit數(shù)據(jù)傳輸結(jié)束后,上拉電阻拉高總線。
18.數(shù)據(jù)0&數(shù)據(jù)1
數(shù)據(jù)1時(shí)序圖:
數(shù)據(jù)0時(shí)序圖:
通過(guò)對(duì)比時(shí)序圖可知,要判斷數(shù)據(jù)0或數(shù)據(jù)1,只要判斷拉高電平時(shí)間即可。例如,在電平被拉高的40us判斷高低電平,若此時(shí)為低電平,則為數(shù)據(jù)0。若此時(shí)為高電平,則為數(shù)據(jù)1。
19.R_IOPORT_PortDirectionSet()函數(shù)原型
故可以通過(guò)R_IOPORT_PortDirectionSet()函數(shù)設(shè)置端口IO方向,設(shè)置方法如下所示。
//設(shè)置P208為輸入
R_IOPORT_PortDirectionSet(&g_ioport_ctrl, BSP_IO_PORT_02, 0<<8, 1<<8);
//設(shè)置P208為輸出
R_IOPORT_PortDirectionSet(&g_ioport_ctrl, BSP_IO_PORT_02, 1<<8, 1<<8);
20.dht11.c& dht11.h
添加2個(gè)文件,dht11.c是驅(qū)動(dòng)文件,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);//主機(jī)拉高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位數(shù)據(jù)
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])//校驗(yàn)讀的溫濕度結(jié)果是否正確
{
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讀取一個(gè)位 返回值:1/0
uint8_t DHT11_Read_Bit(void)
{
retry=0;
while(p_port_value_dht11&&retry<100)//等待變?yōu)榈碗娖? {
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)//等待變?yōu)楦唠娖? {
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讀取一個(gè)字節(jié) //返回值:讀到的數(shù)據(jù)
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方向設(shè)置
#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) //數(shù)據(jù)端口 PA0
#define DHT11_DQ_HIGH R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_08, BSP_IO_LEVEL_HIGH) //數(shù)據(jù)端口 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.結(jié)果演示
22.結(jié)果演示
上圖是我們測(cè)出來(lái)的溫濕度,下圖是當(dāng)?shù)販貪穸?。可以看出還是在誤差范圍內(nèi)的。
上圖是我們測(cè)出來(lái)的溫濕度,下圖是當(dāng)?shù)販貪穸?。可以看出還是在誤差范圍內(nèi)的。
當(dāng)我們沒(méi)有接上DHT11時(shí):
當(dāng)我們沒(méi)有接上DHT11時(shí):
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
mcu
+關(guān)注
關(guān)注
146文章
16888瀏覽量
349929 -
ARM
+關(guān)注
關(guān)注
134文章
9027瀏覽量
366492 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4898瀏覽量
97061 -
瑞薩電子
+關(guān)注
關(guān)注
37文章
2827瀏覽量
72120
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
溫濕度傳感器種類及原理的優(yōu)劣分析
傳感器的種類 電阻式溫濕度傳感器 電阻式傳感器是基于材料的電阻隨溫度和濕度的變化而變化的原理進(jìn)行工作的。在溫度測(cè)量方面,常見的電阻式
溫濕度傳感器是什么類型的傳感器
溫濕度傳感器是一種能夠?qū)崟r(shí)監(jiān)測(cè)和記錄環(huán)境中溫度和濕度變化的設(shè)備或裝置。這類傳感器廣泛應(yīng)用于環(huán)境監(jiān)測(cè)、氣象觀測(cè)、農(nóng)業(yè)、工業(yè)生產(chǎn)、倉(cāng)儲(chǔ)管理、智能家居、醫(yī)療健康等多個(gè)領(lǐng)域,為相關(guān)領(lǐng)域的研究、
【RA-Eco-RA0E1-32PIN-V1.0開發(fā)板試用】sht30溫濕度傳感器
這一章節(jié),繼續(xù)探究RA0E1的硬件iic外設(shè)。來(lái)驅(qū)動(dòng)SHT30溫濕度傳感器,該款溫濕度傳感器具有高精度穩(wěn)定性,可以精確到0.125度的分辨率
發(fā)表于 10-14 23:40
瑞薩e2studio(1)----瑞薩芯片之搭建FSP環(huán)境
視頻教學(xué)
樣品申請(qǐng)
請(qǐng)勿添加外鏈
e2studio軟件
e2studio是瑞薩的集成開發(fā)環(huán)境,F(xiàn)SP 提供了眾多可提高效率的工具,用于開發(fā)針對(duì)瑞
發(fā)表于 09-30 15:28
溫濕度傳感器怎么調(diào)試
的工作原理 溫度測(cè)量原理 溫濕度傳感器中的溫度測(cè)量通常采用熱敏電阻或熱電偶。熱敏電阻的阻值隨溫度的變化而變化,通過(guò)測(cè)量電阻值可以計(jì)算出溫度值。熱電偶則是利用兩種不同金屬或合金的接觸點(diǎn)產(chǎn)生的熱電勢(shì)來(lái)測(cè)量溫度。
溫濕度傳感器技術(shù)參數(shù)有哪些
、功耗、輸出接口等。 傳感器類型 溫濕度傳感器主要分為兩大類:接觸式和非接觸式。接觸式傳感器通過(guò)與被測(cè)物體接觸來(lái)測(cè)量溫度和
想要準(zhǔn)確地測(cè)量環(huán)境溫濕度?溫濕度傳感器是關(guān)鍵!
的應(yīng)用十分廣泛。 ?溫濕度傳感器的工作原理 溫濕度傳感器的工作原理主要基于幾種不同的物理效應(yīng): 電 阻式: 電阻式溫濕度
安科瑞AHE100無(wú)線溫濕度傳感器 35mm導(dǎo)軌安裝 安裝于斷路器觸頭 母排電流處
安科瑞 程瑜 01 產(chǎn)品概述 AHE100無(wú)線溫濕度傳感器主要用于中高壓開關(guān)柜、端子箱、環(huán)網(wǎng)柜、箱變等設(shè)備內(nèi)部及配電室環(huán)境的溫濕度的檢測(cè)。模
溫濕度傳感器有哪些應(yīng)用場(chǎng)景?
溫濕度傳感器在眾多領(lǐng)域,特別是在實(shí)時(shí)記錄溫濕度變化的工作中最為廣泛。溫濕度傳感器可以根據(jù)所記錄的內(nèi)容,對(duì)其進(jìn)行科學(xué)有效的管理、分析和歸納。下
溫濕度傳感器工作原理 溫濕度傳感器的接線方法
溫濕度傳感器是一種用于測(cè)量環(huán)境溫度和相對(duì)濕度的裝置。它通常用于工業(yè)、農(nóng)業(yè)、氣象、室內(nèi)空調(diào)等領(lǐng)域。本文將詳細(xì)介紹溫濕度傳感器的工作原理和接線方
【ELF 1開發(fā)板試用】板載資源測(cè)試4:體驗(yàn)溫濕度傳感器
飛凌嵌入式ELF1開發(fā)板(以下簡(jiǎn)稱為“開發(fā)板”)將溫濕度傳感器器AHT20集成在了底板上,此次依舊做最基礎(chǔ)的測(cè)試,以下是測(cè)試過(guò)程記錄。一、實(shí)驗(yàn)名稱ELF
發(fā)表于 12-18 11:09
溫濕度傳感器怎么布線
溫濕度傳感器是一種用于測(cè)量環(huán)境溫度和濕度的設(shè)備,廣泛應(yīng)用于各種工業(yè)領(lǐng)域、農(nóng)業(yè)、氣象、建筑等領(lǐng)域。布線是安裝傳感器的一個(gè)必要步驟,決定了傳感器
【ELF 1開發(fā)板試用】+傳感器檢測(cè)
ELF 1開發(fā)板通過(guò)幾種傳感器的測(cè)試,如溫濕度、六軸傳感器等,而在配備功能擴(kuò)展板的情況下,還能進(jìn)行光照強(qiáng)度的
發(fā)表于 11-29 11:59
評(píng)論