【S&SD|培训】2019秋季学期Arduino第三课
本次学习内容:
DHT11 温湿度传感器
第一回合
模块简介
1.基本参数 ↓
GND 接口:连接板子上的GND接口
VCC 接口:连接板子上的5V或3.3V接口
Data 接口:单线制串行接口,信号传输接口
分辨率:8bit 量程:0~50℃
DHT11温湿度传感器 具体参数表 ↓
2.数据传输格式
DHT11传感器在传输数据的时候
以 二进制传输 40bit(位)数据,其数据格式如下:
数据[0]~数据[7]:湿度整数 数据
数据[8]~数据[15]: 湿度小数 数据
数据[16]~数据[23]: 温度整数 数据
数据[24]~数据[31]:温度小数 数据
数据[32]~数据[40]:校验和
其中,校验和应当 =
前32位数据总和的末8位。
↑ DHT11 触发状态
整体 流程
空闲状态
主机保持高电平->
主机变为低电平至少18ms
等待设备相应->
主机变回高电平
信号结束
延时20μs到40μs->
DHT11变为低电平80μs相应信号->
DHT11拉高电平延时准备输出->
——开始传输数据——
↑ DHT11 发送数据状态
发送 数据 流程
(对于每一位数据):
低电平50μs->拉高电平
持续时间由发送数据决定——
0为26μs~28μs,1为70μs->
传输完成,拉低电平。
第二回合
代码部分
1.定义变量及程序初始化部分
int temp;
//定义整型变量temp(温度)
int humi;
//定义整型变量 humi(湿度)
int tol;
//定义整型变量tol(校验和)
unsigned int loopCnt;
//定义长整型变量loopCnt
int chr[40] = {0};
//定义整型数组,储存DHT11发送的数据
unsigned long time;
//定义长整型变量time(时间)
#define pin 2
//定义2号引脚为信息口
void setup() {
Serial.begin(9600); //设置波特率为9600
}
2.程序主体部分
void loop() {
bgn: //设置bgn点
delay(2000); //延时2000ms
pinMode(pin, OUTPUT);
//设置2号口为输出口
digitalWrite(pin, LOW);
//设置主机为低电平
delay(20); //延时20ms(主机变为低电平至少18ms,等待设备相应)
digitalWrite(pin, HIGH); //设置主机为高电平
delayMicroseconds(40); //延时40μs(主机变回高电平,信号结束,延时20μs到40μs)
digitalWrite(pin, LOW);
//设置主机为低电平
pinMode(pin, INPUT); //设置2号口为输入口
loopCnt = 10000; //设置loopCnt变量为10000(高电平响应信号)
while (digitalRead(pin) == HIGH)
{
if (loopCnt-- == 0) {
loopCnt--;
Serial.println("HIGH_ERROR");//如果长时间不响应,报告高电平错误
goto bgn; //返回bgn点
}
}
loopCnt = 10000; //设置loopCnt变量为10000(低电平响应信号)
while (digitalRead(pin) == LOW)
{
loopCnt--;
if (loopCnt-- == 0) {
Serial.println("LOW_ERROR"); //如果长时间不响应,报告低电平错误
goto bgn; //返回bgn点
}
}
for (int i = 0; i < 40; i++) //开始记录数据,储存在数组中
{
while (digitalRead(pin) == LOW) {}
time = micros(); //出现高电平时,记下时间time
while (digitalRead(pin) == HIGH) {}
if (micros() - time > 50) {
//计算持续时间,大于50μs则在数组中记录为1,否则
chr[i] = 1; //为0
}
else {
chr[i] = 0;
}
}
humi = chr[0] * 128 + chr[1] * 64 + chr[2] * 32 + chr[3] * 16 + chr[4] * 8 + chr[5] * 4 + chr[6] * 2 + chr[7];
//以二进制的形式记录数据,转换为十进制
temp = chr[16] * 128 + chr[17] * 64 + chr[18] * 32 + chr[19] * 16 + chr[20] * 8 + chr[21] * 4 + chr[22] * 2 + chr[23];
tol = chr[32] * 128 + chr[33] * 64 + chr[34] * 32 + chr[35] * 16 + chr[36] * 8 + chr[37] * 4 + chr[38] * 2 + chr[39];
Serial.print("temp:");
//将结果输出在屏幕上
Serial.println(temp);
Serial.print("humi:");
Serial.println(humii);
Serial.print("tol:");
Serial.println(tol);
}
--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com