一. 简介
在温湿度传感器中,dht11是使用最多的一个,是很多课程的首选。只需要一个IO温湿度可完成温湿度采集。在这里分享使用FPGA来完成DHT11温湿度采集demo分享。 需要完整代码的可以关注微信微信官方账号 回复 获取
二. 温湿度采集
- 数据传输过程包括以下三个部分 : 收集开始,收集数据,收集结束。
- 采集开始,FPGA降低数据线,然后释放,等待dht11响应。
- 采集数据为40bit,分别为(高到底) 8bit湿度整数,8bit湿度小,8bit温度整数,8bit小温度,8bit校验和。
- 对温湿度数据进行验证后8位。
- 收集结束时,从机拉下数据线。
数据传输过程相对容易,下面详细说明各部分的连续性。
(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; //完成数据采集
状态转移过程
- S_START: 当收集请求来临时,它将进入开始状态
- S_DATA:step表示start状态的四个部分是主机降低、从机响应开始和结束以及数据传输。
- S_OVER:step表示接收数据的数量,当接收数据为40时,进入S_OVER状态
- 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