资讯详情

FPGA采集DHT11温湿度

一. 简介

在温湿度传感器中,dht11是使用最多的一个,是很多课程的首选。只需要一个IO温湿度可完成温湿度采集。在这里分享使用FPGA来完成DHT11温湿度采集demo分享。 需要完整代码的可以关注微信微信官方账号 回复 获取


二. 温湿度采集

  1. 数据传输过程包括以下三个部分 : 收集开始,收集数据,收集结束。
  2. 采集开始,FPGA降低数据线,然后释放,等待dht11响应。
  3. 采集数据为40bit,分别为(高到底) 8bit湿度整数,8bit湿度小,8bit温度整数,8bit小温度,8bit校验和。
  4. 对温湿度数据进行验证后8位。
  5. 收集结束时,从机拉下数据线。

数据传输过程相对容易,下面详细说明各部分的连续性。

(1) 采集开始
  1. FPGA至少188条数据线ms,推荐20ms。释放总线,等待从机拉低总线响应。接收响应后,释放总线。详细流程如下。

在这里插入图片描述

(2) 采集数据

数据表示: : 50us的低电平加26us~28us的高电平 。:50us的低电平加70us的高电平

(3) 采集结束

从机拉低总线50us。


这里的时间可以根据实际测试结果进行调整。这很重要,否则收集到的数据可能不准确。


三. 代码实现

需要完整代码的可以关注微信微信官方账号 回复 获取 这里采用三级状态机,更方便。整个采集过程可以通过四个状态轻松确定。 以下是逻辑分析仪获得的收集结果,可以看到S_OVER中,已经采集到了一次完整的数据。 通过计算42 05 1D 03 = 67 (十六进制)可以确定收集到的数据是完全正确的。

module DTH11(  input  clk,  input  rst,  inout  dht11,  input  dht11_req,   ///数据采集请求  output dht11_down,   //完成数据采集  output[7:0] tempH,   ///温度数据整数  output[7:0] tempL,   ///温度数据小数  output[7:0] humidityH,  ///温度数据整数  output[7:0] humidityL  ///温度数据小数 ); 
localparam S_IDLE  = 'd0; ///空闲状态 localparam S_START  = 'd1; //开始收集数据 localparam S_DATA  = 'd2; ////接收收集到的数据 localparam S_OVER  = 'd3; //完成数据采集 

状态转移过程

  1. S_START: 当收集请求来临时,它将进入开始状态
  2. S_DATA:step表示start状态的四个部分是主机降低、从机响应开始和结束以及数据传输。
  3. S_OVER:step表示接收数据的数量,当接收数据为40时,进入S_OVER状态
  4. S_IDLE : timeCount 降低时间结束进入S_IDLE状态。
always@(*) begin  case(state)  S_IDLE:   if(dht11_req == 1'b1)    next_state <= S_START;   else    next_state &t;= S_IDLE;
	S_START:
		if(step == 'd4)
			next_state <= S_DATA;
		else
			next_state <= S_START;
	S_DATA:
		if(step == 'd40)
			next_state <= S_OVER;
		else
			next_state <= S_DATA;
	S_OVER:
		if(timeCount == Time50us)
			next_state <= S_IDLE;
		else
			next_state <= S_OVER;
	default:
		next_state <= S_IDLE;
	endcase
end

标签: d40传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台