아두이노

온도, 습도 센서 (KY-015)

iseohyun 2022. 1. 17.

목차

    int DHpin = 8; // input/output pin
    byte dat[5];   
    
    byte read_data()
    {
      byte i = 0;
      byte result = 0;
      for (i = 0; i < 8; i++) {
          while (digitalRead(DHpin) == LOW); // wait 50us
          delayMicroseconds(30); //The duration of the high level is judged to determine whether the data is '0' or '1'
          if (digitalRead(DHpin) == HIGH)
            result |= (1 << (8 - i)); //High in the former, low in the post
        while (digitalRead(DHpin) == HIGH); //Data '1', waiting for the next bit of reception
        }
      return result;
    }
    
    void start_test()
    {
      digitalWrite(DHpin, LOW); //Pull down the bus to send the start signal
      delay(30); //The delay is greater than 18 ms so that DHT 11 can detect the start signal
      digitalWrite(DHpin, HIGH);
      delayMicroseconds(40); //Wait for DHT11 to respond
      pinMode(DHpin, INPUT);
      while(digitalRead(DHpin) == HIGH);
      delayMicroseconds(80); //The DHT11 responds by pulling the bus low for 80us;
      
      if(digitalRead(DHpin) == LOW)
        delayMicroseconds(80); //DHT11 pulled up after the bus 80us to start sending data;
      for(int i = 0; i < 5; i++) //Receiving temperature and humidity data, check bits are not considered;
        dat[i] = read_data();
      pinMode(DHpin, OUTPUT);
      digitalWrite(DHpin, HIGH); //After the completion of a release of data bus, waiting for the host to start the next signal
    }
    
    void setup()
    {
      Serial.begin(9600);
      pinMode(DHpin, OUTPUT);
    }
    
    void loop()
    {
      start_test();
      Serial.print("Humdity = ");
      Serial.print(dat[0], DEC); //Displays the integer bits of humidity;
      Serial.print('.');
      Serial.print(dat[1], DEC); //Displays the decimal places of the humidity;
      Serial.println('%');
      Serial.print("Temperature = ");
      Serial.print(dat[2], DEC); //Displays the integer bits of temperature;
      Serial.print('.');
      Serial.print(dat[3], DEC); //Displays the decimal places of the temperature;
      Serial.println('C');
    
      byte checksum = dat[0] + dat[1] + dat[2] + dat[3];
      if (dat[4] != checksum) 
        Serial.println("-- Checksum Error!");
      else
        Serial.println("-- OK");
     
      delay(1000);
    }

     

    '아두이노' 카테고리의 다른 글

    LED  (0) 2022.01.17
    건반 만들기  (0) 2022.01.17
    서보모터 SG90  (0) 2022.01.17
    조이스틱 AxisJoystic  (0) 2022.01.17
    아날로그 입력  (0) 2022.01.17

    댓글