السبت، 23 فبراير، 2013

temperature and humidity Sensor DHT11


الحساس DHT 11 

حساس الحرارة و الرطوبة 

في هذه التدوينة الجديدة من سلسلة الحساسات و النواقل Sensors and Transducers سأتحدث عن الحساس DHT11 و هو حساس حرارة و رطوبة رقمي ,  اليوم سنتعلم كيفية التحكم بهذا الحساس و أهم القيم المتعلقة به .

قبل البدء باستعمال هذا الحساس , يجب قراءة النشرة الفنية لهذا الحساس لمعرفة البارمترات و القيم القياسية له .   Datasheet

و سنستخدم مكتبة خاصة في لغة أردوينو مخصصة للتحكم به ,  و يمكن تحميلها من خلال الرابط  DHT11 Library Download

حسناً لنرى ما هي المعدات التي سنحتاجها في هذه التجربة :

1) بطاقة اردوينو .
2) حساس DHT11 أنا سأستخدم هذا النوع الذي بالصورة 
3) اسلاك توصيل 
4) لوحة تعليمية مثقوبة BreadBoard .


هذا كل شي :)

التوصيل : 

الرسم التوضيحي يبين كيفية التوصيل .



قراءة في النشرة الفنية Datasheet

عند قراءة المعلومات الفنية للقطعة , نرى المعلومات التالية :


نرى أن هذا الحساس يمكنه قراءة الرطوبة بين 20-90% اقل أو أكثر من ذلك لن يستطيع الحساس قراءتها , و بالنسبة لدرجة الحرارة فهي بين 0-50C  .

كما يوجد في النشرة الفنية تفاصيل اكثر عن عمل هذا الحساس 



و طريقة التوصيل أيضاً موجودة كما في الرسم , أي طريقة توصيله مع اي متحكم MCU



مبدأ عمل هذا الحساس :

في البداية يرسل المتحكم MCU بنبضة بدء للحساس لينقله من وضع الأستعداد إلى وضع التشغيل Starting signal و بعد اكتمال وصول النبضه إلى الحساس و استجابته لهذه النبضة , يرسل الحساس موجه تضم 40Bit تضم اشارات الحرارة و الرطوبة , و يرسلها إلى المتحكم الذي يقوم بدوره بمعالجتها و إظهار النتائج 

و الفكرة موجوده في هذا المخطط الزمني :


كيف يعرف المتحكم أن هذا البت هو واحد 1 أو صفر 0 ؟

يستخدم هذا الحساس تقنية التواصل بالخط الواحد One wire و على ذلك يمكن معرفة أن النبضة هي اشارة  0 , حيث يقوم الحساس بارسال 1bit لمدة 50us ثم يرسل 1bit لمدة 26-30us تقريباً و هكذا يكون الحساس مرسل 0 signal bit


اما بالنسبة للhigh ,  يقوم الحساس بارسال 1bit لمدة 50us ثم يرسل 1bit لمدة 70us تقريباً و هكذا يكون الحساس مرسل 1 signal bit



حسناً الآن لننتقل للبرنامج .

ستحتاج لتحميل مكتبة للتعامل مع هذا الحساس , و يمكنك تحميلها من هنا .
بعد تحميل المكتبة , و وضعها في مسار المكتبات في ملف برنامج الأردوينو , 

يبقى فقط أن تذهب للمسار التالي داخل ملف الأردوينو و فتح هذا المثال كما في الصورة .


البرنامج dht11_functions هو برنامج يأتي مع المكتبة لتوضيح كيفية عمل المكتبة , و بعد تحميلها على المتحكم , يمكن فتح الSerial Port و رؤية النتائج فيها .



هذا بشكل عام كل ما قد تحتاجه للتعامل مع هذا الحساس .

أرجو أن تكون هذه التدوينة قد حققت الفائدة المرجوة .

إلى اللقاء .

        


3 التعليقات :

  1. السلام عليكم لو انا عايز استخدم الحساس ده مع الريسبيرى باى ،، ونزلت برنامج ولكن عايز ادخل جزء على البرنامج انى اشغل fan او اشغل heater باستخدام if case ممكن اعرف هاضيف الحاله دى فين بالظبط فى مكان البرنامج ؟؟ وجزاكم الله خيرا
    وده البرنامج


    /*
    * dht11.c:
    * Simple test program to test the wiringPi functions
    * DHT11 test
    */

    #include

    #include
    #include
    #include
    #define MAXTIMINGS 85
    #define DHTPIN 7
    int dht11_dat[5] = {0,0,0,0,0};

    void read_dht11_dat()
    {
    uint8_t laststate = HIGH;
    uint8_t counter = 0;
    uint8_t j = 0, i;
    float f; // fahrenheit

    dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;

    // pull pin down for 18 milliseconds
    pinMode(DHTPIN, OUTPUT);
    digitalWrite(DHTPIN, LOW);
    delay(18);
    // then pull it up for 40 microseconds
    digitalWrite(DHTPIN, HIGH);
    delayMicroseconds(40);
    // prepare to read the pin
    pinMode(DHTPIN, INPUT);

    // detect change and read data
    for ( i=0; i< MAXTIMINGS; i++) {
    counter = 0;
    while (digitalRead(DHTPIN) == laststate) {
    counter++;
    delayMicroseconds(1);
    if (counter == 255) {
    break;
    }
    }
    laststate = digitalRead(DHTPIN);

    if (counter == 255) break;

    // ignore first 3 transitions
    if ((i >= 4) && (i%2 == 0)) {
    // shove each bit into the storage bytes
    dht11_dat[j/8] <<= 1;
    if (counter > 16)
    dht11_dat[j/8] |= 1;
    j++;
    }
    }

    // check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
    // print it out if data is good
    if ((j >= 40) &&
    (dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF)) ) {
    f = dht11_dat[2] * 9. / 5. + 32;
    printf("Humidity = %d.%d %% Temperature = %d.%d *C (%.1f *F)\n",
    dht11_dat[0], dht11_dat[1], dht11_dat[2], dht11_dat[3], f);
    }
    else
    {
    printf("Data not good, skip\n");
    }
    }

    int main (void)
    {

    printf ("Raspberry Pi wiringPi DHT11 Temperature test program\n") ;

    if (wiringPiSetup () == -1)
    exit (1) ;

    while (1)
    {
    read_dht11_dat();
    delay(1000); // wait 1sec to refresh
    }

    return 0 ;
    }

    ردحذف
    الردود
    1. على اي اساس ؟ و كيف هي طبيعة الشرط

      حذف
  2. يعطيك العافيه انا بشتغل على تربية الدجاج عملت قسم بس مش عارف اتحكم بدرجة الحرارة في حالة ارتفاعها تقوم بعمل شي وفي حالة انخفاضها اعمل امر اخر عن طريق الريله بس القيم يجب ادخالها عن طريق الكي باد لان القيم التي اريدها تتغير كل يوم
    وهاد الشي شبيه بعمل فقاسة البيض
    وشكرا

    #include

    #include

    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    dht11 x;
    void setup()
    {
    lcd.begin(16, 2);
    }

    void loop()
    {
    int readSensorValue =x.read(7);
    delay (10);
    lcd.setCursor(0, 0);
    lcd.print((float)x.humidity);
    lcd.setCursor(0, 1);
    lcd.print(x.temperature);

    }

    ردحذف

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.