我是靠谱客的博主 温暖向日葵,最近开发中收集的这篇文章主要介绍arduino 土壤温湿度传感器_Arduino不调用库实现DHT11数据读取,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

09a37031db38f0e4407bed92618ef4e8.png

DHT11概述

fa8cda3cd801f6d838b1565ac6087d2d.png

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。DHT11技术文档

引脚参数

67ad9baa5e9d7187262f49152e60c8a8.png

Data脚通信

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次 通讯时间4ms左右,数据分小数部分和整数部分。

数据格式

一次完整的数据传输为40bit,高位先出:8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据 + 8bit校验和

时序图

总时序图

34a25110602ce04ef119f26bb15685b4.png

开始数据传送时序图

7bc84b148e8b404cc21f831b24ef07f2.png

数据传送时序图

c06dcb52402cec2346e036a50280b5f7.png

c80316b5dbafb1d5a3dece0117d278e8.png

通讯步骤

根据时序定义来完成通讯过程

  1. 总线空闲状态为高电平HIGH,主机把总线拉低LOW等待DHT11响应,主机把总线拉低必须大于18ms,保证DHT11能检测到起始信号;
  2. 主机把总线拉高HIGH, 延迟等待20-40ms让DHT11 把总线拉低到LOW
  3. 主机检测到总线为LOW后延迟等待80us
  4. 主机检测到总线为HIGH后继续延迟等待80us即可开始进行数据读取;
  5. 主机等待50us,当检测到总线为HIGH时,延时30us再次检测总线状态,根据时序图定义,高电平持续时间大于30us时候为1小于为0即可获取到数据,不断重复8次即可获取到1字节的数据;
  6. 重复执行步骤5,5次即可获取到全部的数据

Arduino实现

设备连接

d3e1af12aa2127c2c730a52e10746422.png

7b53f1aa0d45fdfbfa9b51fdf5d9dedc.png

代码编写

//Test the DHT11
int dhPin = 2;  // 温湿度信号接脚连入 Arduino 的 Pin 8
byte dat[5];   // 存放湿度2byte, 温度 2 byte, checksum 1 byte
byte readData() {  // 每次读取 8 bits  ( one byte)
  byte data = 0 ; // 初始化数据,不然可能出错
  for (int i = 0; i < 8; i++) {
    if (digitalRead(dhPin) == LOW) {  // 一开始要 LOW 才表示要传过来
      while (digitalRead(dhPin) == LOW); //等待 50us;
      // 现在已经变成 HIGH 了
      delayMicroseconds(30); //判断高电平持续时间,以判定资料是‘0’还是‘1’;
      if (digitalRead(dhPin) == HIGH) // 持续了 30 us 以上就是 1
        data |= (1 << (7 - i)); //高位在前,低位元在后;
      //如果这时已经是 LOW, 表示这 bit 是 0, 不必塞入 data
      //..而且以下的 while 也会立即结束(因为 LOW), 准备接收下一个 bit
      while (digitalRead(dhPin) == HIGH); // 等待下一bit的接收;
      //这时一定已经变成 LOW 了
    }// if
  }// for(
  return data;   // 收完 8 bit = one byte = one char
} // readData(
void start_test(  ) {  // 每次要与 DHT11 沟通
  digitalWrite(dhPin, LOW); //拉低到 LOW,发送表示要开始沟通的信号;
  delay(30); //延时要大于 18ms,以便 DHT11 能检测到开始信号;我们用30ms
  digitalWrite(dhPin, HIGH);  // 拉高HIGH, 让 DHT11 拉低到 LOW 告诉我们要传送
  delayMicroseconds(40);  // 给40us等待 DHT11 响应;
  pinMode(dhPin, INPUT); // 改为输入 mode 准备 digitalRead( )
  while (digitalRead(dhPin) == HIGH);  // 必须等到 LOW
  delayMicroseconds(80); //DHT11 发出响应,会拉低 80us;所以至少等80us
  while (digitalRead(dhPin) == LOW); // 继续等到变 HIGH
  delayMicroseconds(80); //DHT11 会拉高到HIGH 80us 后开始发送数据;
  /// 以下连续读入 5 bytes (40 bits), 最后的 byte 是 checksum 校验值
  for (int i = 0; i < 5; i++) dat[i] = readData(); //接收温湿度资料,校验位元;
  pinMode(dhPin, OUTPUT); // 改为 Output mode, 准备拉高HIGH
  digitalWrite(dhPin, HIGH); //发送完一次资料后释放bus,等待下一次开始信号;
}
void setup(  ) {
  Serial.begin(9600);
  Serial.println("begin!");
  pinMode(dhPin, OUTPUT);
}
void loop(  ) {
  start_test( );  // 读取湿度温度和检核位到 dat[ ]; 其中dat[4]是checkSum
  // 根据datasheet规定, dat[4] 要 == (dat[0]+dat[1]+dat[2]+dat[3]) %256
  // 否则表示沟通有错误 !!
  Serial.print("Current humdity = ");
  Serial.print(dat[0], DEC); //显示湿度的整数部分;
  Serial.print('.');
  Serial.print(dat[1], DEC); //显示湿度的小数位;(其实是 0)
  Serial.println(" %");  // 注意有空格要用 " %"  不可用 ' %'
  Serial.print("Current temperature = ");
  Serial.print(dat[2], DEC); //显示温度的整数部分;
  Serial.print('.');
  Serial.print(dat[3], DEC); //显示温度的小数位;(其实是 0)
  Serial.println(" C");
  delay(1985);
}

串口输出

cb3db18484fbe15264275bce46322913.png

参考文档

不使用 DHTxx 庫, 如何自己读取 DHT11 湿度温度 ?

Arduino教程——DHT11数字温湿度传感器

最后

以上就是温暖向日葵为你收集整理的arduino 土壤温湿度传感器_Arduino不调用库实现DHT11数据读取的全部内容,希望文章能够帮你解决arduino 土壤温湿度传感器_Arduino不调用库实现DHT11数据读取所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(102)

评论列表共有 0 条评论

立即
投稿
返回
顶部