<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.jackslab.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.jackslab.org/index.php?action=history&amp;feed=atom&amp;title=DHT21%2FAM2301_%E6%95%B0%E5%AD%97%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8</id>
		<title>DHT21/AM2301 数字温湿度传感器 - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.jackslab.org/index.php?action=history&amp;feed=atom&amp;title=DHT21%2FAM2301_%E6%95%B0%E5%AD%97%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8"/>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=DHT21/AM2301_%E6%95%B0%E5%AD%97%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8&amp;action=history"/>
		<updated>2026-08-12T10:09:55Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.19.2</generator>

	<entry>
		<id>http://wiki.jackslab.org/index.php?title=DHT21/AM2301_%E6%95%B0%E5%AD%97%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8&amp;diff=2710&amp;oldid=prev</id>
		<title>Comcat：以“DHT21/AM2301 数字温度传感器模块只有三根线，VCC（红），DATA（黄），GND（黑）。VCC 接 3.3V 供电，DATA 为数字电平输出，直接接...”为内容创建页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=DHT21/AM2301_%E6%95%B0%E5%AD%97%E6%B8%A9%E6%B9%BF%E5%BA%A6%E4%BC%A0%E6%84%9F%E5%99%A8&amp;diff=2710&amp;oldid=prev"/>
				<updated>2014-06-25T09:06:55Z</updated>
		
		<summary type="html">&lt;p&gt;以“DHT21/AM2301 数字温度传感器模块只有三根线，VCC（红），DATA（黄），GND（黑）。VCC 接 3.3V 供电，DATA 为数字电平输出，直接接...”为内容创建页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;DHT21/AM2301 数字温度传感器模块只有三根线，VCC（红），DATA（黄），GND（黑）。VCC 接 3.3V 供电，DATA 为数字电平输出，直接接数字 I/O 口即可&lt;br /&gt;
&lt;br /&gt;
[[文件:DH21.png]]&lt;br /&gt;
&lt;br /&gt;
DHT21/AM2301 数字温度传感器使用单总线串行接口，完整的湿度温度数据是 40 位；&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
读时高位先出，每次读一位，连续读取 40bit，其中高 16 位是湿度，中间 16 位是温度，后 8 位是校验数据：&lt;br /&gt;
&lt;br /&gt;
0000 0010 1000 1100 | 0000 0001 0101 1111 | 1110 1110&lt;br /&gt;
湿度数据 温度数据 校验和&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其中校验和应为： 湿度高8位 + 湿度低8位 + 温度高8位 + 温度低8位&lt;br /&gt;
&lt;br /&gt;
例如：0000 0010 + 1000 1100 + 0000 0001 + 0101 1111 = 1110 1110&lt;br /&gt;
&lt;br /&gt;
上面的数值表示：湿度 = 65.2%RH  温度 = 35.1℃&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当温度低于0℃时温度数据的最高位置 1&lt;br /&gt;
&lt;br /&gt;
例如：-10.1℃表示为1000 0000 0110 0101&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
主机发送一次开始信号后，DHT21从低功耗模式转换到高速模式，等待主机开始信号结束后，DHT21发送响应信号，送出40bit的数据，并触发一次信号采集&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:DH21-bus-1.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
空闲时总线为高电平，通讯开始时主机拉低总线 1~10ms 后释放总线，延时20-40us后主机开始检测从机（DHT21）的响应信号。&lt;br /&gt;
&lt;br /&gt;
从机的响应信号是一个 80us 左右的低电平，随后从机在拉高总线80us左右代表即将进入数据传送。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:DH21-bus-2.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
高电平后就是数据位，每 1bit 数据都是由一个低电平时隙和一个高电平组成。低电平时隙就是一个 50us 左右的低电平，它代表数据位的起始，其后的高电平的长度决定数据位所代表的数值，较长的高电平代表 1，较短的高电平代表 0。共 40bit 数据，当最后一Bit数据传送完毕后，从机将再次拉低总线 50us 左右，随后释放总线，由上拉电阻拉高。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:DH21-bus-3.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[文件:DH21-bus-4.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
则撰写测试驱动为：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int dataPin = 12;&lt;br /&gt;
int flag = 0;&lt;br /&gt;
byte temp, RH_H, RH_L, T_H, T_L, crc;&lt;br /&gt;
int tt, rh;&lt;br /&gt;
&lt;br /&gt;
byte read_8bit_data()&lt;br /&gt;
{&lt;br /&gt;
  byte i, data = 0;&lt;br /&gt;
  for(i = 0; i &amp;lt; 8; i++)&lt;br /&gt;
  {&lt;br /&gt;
    flag = 2;&lt;br /&gt;
    while((digitalRead(dataPin) == 0) &amp;amp;&amp;amp; flag++);&lt;br /&gt;
    delayMicroseconds(30);&lt;br /&gt;
    temp = 0;&lt;br /&gt;
    if(digitalRead(dataPin) == 1) temp = 1;&lt;br /&gt;
    flag = 2;&lt;br /&gt;
    while((digitalRead(dataPin) == 1) &amp;amp;&amp;amp; flag++);&lt;br /&gt;
    if(flag == 1) break;&lt;br /&gt;
    data &amp;lt;&amp;lt;= 1;&lt;br /&gt;
    data |= temp;&lt;br /&gt;
  }&lt;br /&gt;
  return data;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
byte get_dh21()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(dataPin, OUTPUT);&lt;br /&gt;
  digitalWrite(dataPin, LOW);&lt;br /&gt;
  delay(4);&lt;br /&gt;
&lt;br /&gt;
  digitalWrite(dataPin, HIGH);&lt;br /&gt;
  delayMicroseconds(40);&lt;br /&gt;
&lt;br /&gt;
  pinMode(dataPin, INPUT);&lt;br /&gt;
  if(digitalRead(dataPin) == 0)&lt;br /&gt;
  {&lt;br /&gt;
    flag = 2;&lt;br /&gt;
    while((digitalRead(dataPin) == 0) &amp;amp;&amp;amp; flag++);&lt;br /&gt;
    flag = 2;&lt;br /&gt;
    while((digitalRead(dataPin) == 1) &amp;amp;&amp;amp; flag++);&lt;br /&gt;
    RH_H = read_8bit_data();&lt;br /&gt;
    RH_L = read_8bit_data();&lt;br /&gt;
    T_H = read_8bit_data();&lt;br /&gt;
    T_L = read_8bit_data();&lt;br /&gt;
    crc = read_8bit_data();&lt;br /&gt;
    pinMode(dataPin, OUTPUT);&lt;br /&gt;
    digitalWrite(dataPin,HIGH);&lt;br /&gt;
    temp = (T_H + T_L + RH_H + RH_L);&lt;br /&gt;
    if(temp != crc)&lt;br /&gt;
    {&lt;br /&gt;
        RH_H = 0;&lt;br /&gt;
        RH_L = 0;&lt;br /&gt;
        T_H = 0;&lt;br /&gt;
        T_L = 0;&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
  return -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(dataPin, OUTPUT);&lt;br /&gt;
  digitalWrite(dataPin, HIGH);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  if(get_dh21() == -1)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Read DH21 error&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    tt = (T_H &amp;lt;&amp;lt; 8 ) | T_L;&lt;br /&gt;
    rh = (RH_H &amp;lt;&amp;lt; 8 ) | RH_L;&lt;br /&gt;
    Serial.print(&amp;quot;Current Temperature: &amp;quot;);&lt;br /&gt;
    Serial.print(tt, DEC);&lt;br /&gt;
    Serial.print(&amp;quot;C   &amp;quot;);&lt;br /&gt;
    Serial.print(&amp;quot;Current Humidity: &amp;quot;);&lt;br /&gt;
    Serial.print(rh);&lt;br /&gt;
    Serial.println(&amp;quot;%&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  delay(60000*5);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Comcat</name></author>	</entry>

	</feed>