【S&SD|培训】2019秋季学期Arduino第三课

网友投稿 2019-10-25 13:17

本次学习内容:

DHT11 温湿度传感器

https://cdn.china-scratch.com/timg/191027/131I53149-0.jpg

第一回合

模块简介

https://cdn.china-scratch.com/timg/191027/131IB940-1.jpg

1.基本参数 ↓

GND 接口连接板子上的GND接口

VCC 接口连接板子上的5V或3.3V接口

Data 接口单线制串行接口,信号传输接口

https://cdn.china-scratch.com/timg/191027/131I61613-2.jpg

分辨率:8bit    量程:0~50℃

DHT11温湿度传感器 具体参数表 ↓

https://cdn.china-scratch.com/timg/191027/131ICM1-3.jpghttps://cdn.china-scratch.com/timg/191027/131I61564-4.jpghttps://cdn.china-scratch.com/timg/191027/131IB940-1.jpg

2.数据传输格式

DHT11传感器在传输数据的时候

以 二进制传输 40bit(位)数据,其数据格式如下:

   数据[0]~数据[7]:湿度整数 数据

   数据[8]~数据[15]:   湿度小数 数据

   数据[16]~数据[23]:   温度整数 数据

   数据[24]~数据[31]:温度小数 数据

   数据[32]~数据[40]:校验和

其中,校验和应当 =

             前32位数据总和末8位

https://cdn.china-scratch.com/timg/191027/131IJF7-6.jpg

↑ DHT11  触发状态

https://cdn.china-scratch.com/timg/191027/131I53149-0.jpghttps://cdn.china-scratch.com/timg/191027/131IM203-8.jpg

整体 流程

空闲状态

主机保持高电平->

主机变为低电平至少18ms

等待设备相应->

主机变回高电平

信号结束

延时20μs到40μs->

DHT11变为低电平80μs相应信号->

DHT11拉高电平延时准备输出->

——开始传输数据——

https://cdn.china-scratch.com/timg/191027/131IJ2U-9.jpg

↑ DHT11 发送数据状态

https://cdn.china-scratch.com/timg/191027/131IM203-8.jpg

发送 数据 流程

(对于每一位数据):

低电平50μs->拉高电平

持续时间由发送数据决定——

026μs~28μs170μs->

传输完成,拉低电平。

第二回合

代码部分

https://cdn.china-scratch.com/timg/191027/131IB940-1.jpg

1.定义变量及程序初始化部分

https://cdn.china-scratch.com/timg/191027/131I53149-0.jpg

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

}

https://cdn.china-scratch.com/timg/191027/131I53149-0.jpghttps://cdn.china-scratch.com/timg/191027/131IB940-1.jpg

2.程序主体部分

https://cdn.china-scratch.com/timg/191027/131I53149-0.jpg

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