اطلاعیه

Collapse
No announcement yet.

راه اندازی سنسور رطوبت DHT 11/22

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    #16
    DHT11 سنسور رطوبت و دما

    کمکو کنید چطور DHT11 سنسور رطوبت و دما رو با avr راه اندازی کنم...

    دیدگاه


      #17
      پاسخ : DHT11 سنسور رطوبت و دما

      نوشته اصلی توسط hamed.9999
      کمکو کنید چطور DHT11 سنسور رطوبت و دما رو با avr راه اندازی کنم...
      بنظرتون با این طرح سوال کسی میتونه کمکتون کنه ؟

      1=با چه زبانی کار میکنید ؟

      تا کجا پیش رفتید .

      الان کجا کارید
      یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

      دیدگاه


        #18
        پاسخ : راه اندازی سنسور رطوبت DHT 11/22

        وال به خدا!!!! oo:

        کتابخانه که من در پروژه ی نمونه گذاشتم DHT 11 رو هم ساپورت می کنه.

        دیدگاه


          #19
          پاسخ : راه اندازی سنسور رطوبت DHT 11/22

          سلام به همه دوستان عزیز ECA

          یه سوال راجعبه سنسور

          توی اول تاپیک گفته شده که دقت HS1101 پایین هست..... با توجه به اینکه ساختار داخلی dht11 در قسمت رطوبت یک سنسور مقاومتی هست و ساختار داخلی hs1101 سنسور خازنی هست کدام سنسور بهتر هست؟؟

          بنده قبلا تجربه کار با سنسور مقاومتی رو داشته ام... سنسوری کاملا مزخرف بود که با رطوبت بالا خیلی زود خراب میشد و دقت فوق العاده بدی پیدا میکرد... (قسمت صفحات کربنی شکل روی سنسور خراب میشدند)

          کسی با hs1101 کار کرده؟؟ که واقعا توی شرایط مختلف تست کرده یاشه؟؟؟ با dht 11 چه طور؟؟

          :mrgreen: :mrgreen: :mrgreen: :mrgreen:
          دیگه رو زمین جا نیست... باید رفت....

          دیدگاه


            #20
            پاسخ : راه اندازی سنسور رطوبت DHT 11/22

            نوشته اصلی توسط roodi
            سلام به همه دوستان عزیز ECA

            یه سوال راجعبه سنسور

            توی اول تاپیک گفته شده که دقت HS1101 پایین هست..... با توجه به اینکه ساختار داخلی dht11 در قسمت رطوبت یک سنسور مقاومتی هست و ساختار داخلی hs1101 سنسور خازنی هست کدام سنسور بهتر هست؟؟

            بنده قبلا تجربه کار با سنسور مقاومتی رو داشته ام... سنسوری کاملا مزخرف بود که با رطوبت بالا خیلی زود خراب میشد و دقت فوق العاده بدی پیدا میکرد... (قسمت صفحات کربنی شکل روی سنسور خراب میشدند)

            کسی با hs1101 کار کرده؟؟ که واقعا توی شرایط مختلف تست کرده یاشه؟؟؟ با dht 11 چه طور؟؟

            :mrgreen: :mrgreen: :mrgreen: :mrgreen:
            سلا م دوست عزیز.
            سنسور هایی که گفتی من تجربه کار کردن باهاشون و دارم. هر کدومشون یه سری مزایا دارن، یه سری معایب هم دارن. کار آمد بودن این سه تا سنسور به این بستگی داره که چه استفاده ای می خوای ازشون بکنی.
            حالا من در مورد هر کدوم واست توضیح می دم خوب گوش کن! :read:

            الف) سنسور رطوبت مقاومتی: دقت این سنسور خیلی داقونه! یعنی تو بهترین شرایط ( کم نویز بودن مدار ) نمیتونی مطمئن بشی که مقداری که داره نشونت میده درسته یا نه. ولتاژ تغذیشم باید به صورت AC باشه. به نظر من تنها تو مواردی که میخوای تشخیص بدی رطوبت وجود داره یا نه، کم هست یا زیاد میتونه گزینه مناسبی باشه، با توجه به قیمته کمی که داره. سنسور DHT11 این سنسور توش به کار رفته، با وجود این که این سنسور با ابزار دقیق ساخته میشه بازم دقت اندازه گیریش خیلی داقونه، حدوده +-10 درصد دقتشه.

            ب) سنسور HS1101: دقت این سنسور خیلی عالیه، تو بدترین شرایط 3 درصد خطا داره که خیلی خوبه! مورد مناسبی می تونه باشه برای استفاده های صنعتی. فقط تنها مشکلش اینه که این سنسور از نوع خازنیه که برای اینه بخوای تغییرات خازنی رو به تغییرات فرکانسی تبدیل کنی باید از یک IC555 استفاده کنی (دیتا شیت شو بخون). خوب حالا از مرحله تبدیل تغییرات خازنی به تغییرات نوسانی بگیر تا اندازه گیری اون نوسانات توسط میکرو یک سری نویزها و مشکلات مداری پیش میاد که دقت اندازه گیری رو خیلی کم میکنه!
            علت اینکه خیلیا از این سنسور استفاده نمیکنن اینه که طراحی مدار واسش یه خورده مشکله! قیمتشم حدود 6000 تومنه. تو بد ترین شرایط می تونین مطمئن باشین که 6 ماهی واستون کار میکنه! ( شرایط بد که میگم یعنی: صفر یا صد شدن طولانی مدت رطوبت یا کم یا زیاد بودن دمای محیط).

            ج) سنسور DHT22: این سنسور از از همون سنسور خازنی HS1101 با یک مدار مبدل آنالوگ بخ دیجیتال درست شده. دقتش خیلی، خیلی خوبه ( حدود 3 درصد). نوساناتشم در حد دهم درصد هست. از پروتوکل ارتباطی 1WIRE مختص به خودش استفاده میکنه. اما از این سنسور تو محیط های صنعتی استفاده نکنین خیلی بهتره!!!!! oo: میدونین چرا؟ چون اگه رطوبت برای مدت کوتاهی 100 یا صفر بشه سنسور هنگ میکنه و دیگه هیچ پاسخی نمیده. برای راه اندازیشم باید یک بار تغذیش و قطع و وصل کنین. در کل نمیشه روش حساب کرد هر آن احتمال داره هنگ کنه! در ضمن اگه در یک ثانیه چندین بار باهاش ارتباط برقرار کنین و بخواین مقدارشو بخونین بازم هنگ میکنه! oo: .

            نتیجه گیری:
            ---با توجه به توضیحاتی که دادم، اگه دقت واستون مهم نیست از سنسور مقاومتی استفاده کنین.
            ---اگه دقت و قیمت هر دو واستون مهمه یه چند روزی وقت بزارین و برای سنسور HS1101 یه مدار خوب طراحی کنین. این کار بهترین کاره! در ضمن سعی کنین مدارتون و جوری طراحی کنین که تغییرات خازنی سنسور رو به تغییرات Duty cycle ( زمان وظیفه ) تبدیل کنه این کار دقت و ضد نویز بودن اندازه گیریتون خیلی خیلی خیلی بالا میبره ( یه خورده فکر کنین میتونین بفهمین چرا تغییرات DC بهتره).
            ---اگر هم که حوصله یا توان طراحی مدار رو ندارین برین از DHT22 استفاده کنین. فقط دقت کنین که رطوبت و طوری کنترل کنین که به 100 یا صفر نزدیک نشه! حداکثرم ثانیه ای یک بار با سنسور ارتباط بر قرار کنین! در این صورت خیالتون راحت هیچ مشکلی پیش نمیاد. :NO:
            --- در نهایت اگه تنها دقدقه شما دقت سنسور هست برین سراق سنسورهای خانواده SHT که برای محیط های صنعتی و حساس طراحی شدن. ضریب اطمینان این سنسور ها خیلی بالاس. از پروتوکل 1WIRE پشتیبانی میکنن.
            تو را دانش و دين نمايد درست در رستگاري ببايدت جست
            وگر دل نخواهي كه باشي نژند نخواهي كه دائم بوي مستمند
            به گفتار پيغمبرت راه جوي دل از تيرگي ها بدين آب شوي

            دیدگاه


              #21
              پاسخ : راه اندازی سنسور رطوبت DHT 11/22

              نوشته اصلی توسط ma.eca91

              ج) سنسور DHT22: این سنسور از از همون سنسور خازنی HS1101 با یک مدار مبدل آنالوگ بخ دیجیتال درست شده. دقتش خیلی، خیلی خوبه ( حدود 3 درصد). نوساناتشم در حد دهم درصد هست. از پروتوکل ارتباطی 1WIRE مختص به خودش استفاده میکنه. اما از این سنسور تو محیط های صنعتی استفاده نکنین خیلی بهتره!!!!! oo: میدونین چرا؟ چون اگه رطوبت برای مدت کوتاهی 100 یا صفر بشه سنسور هنگ میکنه و دیگه هیچ پاسخی نمیده. برای راه اندازیشم باید یک بار تغذیش و قطع و وصل کنین. در کل نمیشه روش حساب کرد هر آن احتمال داره هنگ کنه! در ضمن اگه در یک ثانیه چندین بار باهاش ارتباط برقرار کنین و بخواین مقدارشو بخونین بازم هنگ میکنه! oo: .

              نتیجه گیری:

              ---اگر هم که حوصله یا توان طراحی مدار رو ندارین برین از DHT22 استفاده کنین. فقط دقت کنین که رطوبت و طوری کنترل کنین که به 100 یا صفر نزدیک نشه! حداکثرم ثانیه ای یک بار با سنسور ارتباط بر قرار کنین! در این صورت خیالتون راحت هیچ مشکلی پیش نمیاد. :NO:
              --- در نهایت اگه تنها دقدقه شما دقت سنسور هست برین سراق سنسورهای خانواده SHT که برای محیط های صنعتی و حساس طراحی شدن. ضریب اطمینان این سنسور ها خیلی بالاس. از پروتوکل 1WIRE پشتیبانی میکنن.
              سلام
              شما خودتون در عمل از dht22 جواب گرفتید ؟
              تا چند متر کابل کشی کردید و جواب گرفتید ؟
              یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

              دیدگاه


                #22
                پاسخ : راه اندازی سنسور رطوبت DHT 11/22

                سلام دوستان
                من تو راه اندازی dht11 به مشکل خوردم :angry: و چندتا سوال دارم
                در مورد روش کار با این سنسور یکم توضیح میخوام
                من با بسکام کار میکنم . از کد های آماده ای که دوستان گذاشته بودن استفاده کردم ولی 0 نشون میده

                اگه امکانش هست یکم توضیح بدین که برای راه اندازی باید چکارکنم :read:
                :applause: :applause: :applause: :applause:

                دیدگاه


                  #23
                  پاسخ : راه اندازی سنسور رطوبت DHT 11/22

                  نوشته اصلی توسط sanjaghak545
                  سلام دوستان
                  من تو راه اندازی dht11 به مشکل خوردم :angry: و چندتا سوال دارم
                  در مورد روش کار با این سنسور یکم توضیح میخوام
                  من با بسکام کار میکنم . از کد های آماده ای که دوستان گذاشته بودن استفاده کردم ولی 0 نشون میده

                  اگه امکانش هست یکم توضیح بدین که برای راه اندازی باید چکارکنم :read:
                  :applause: :applause: :applause: :applause:
                  شماتیک و برنامه رو قرار بدید
                  یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                  دیدگاه


                    #24
                    پاسخ : راه اندازی سنسور رطوبت DHT 11/22

                    سلام دوستان اگه کسی راه اندازی کرد فایل هگز و بس و پرتوس شو بگذاره استفاده کنیم دمتون گرم

                    دیدگاه


                      #25
                      پاسخ : راه اندازی سنسور رطوبت DHT 11/22

                      سلام دوستان

                      این کد زیر بدون هیچ مشکلی سنسور DHT11 رو راه اندازی میکنه مشکل کدهای قبلی از زمان خوندن بین هر بیت هست

                      موفق باشید

                      کد:
                      $regfile = "m8def.dat"
                      $crystal = 8000000
                      
                      Config Lcd = 20 * 4
                      Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
                      Cursor Off
                      Cls
                      Lcd "be name KHODA"
                      Waitms 1000
                      Cls
                      
                      Declare Sub Get_th(t As Byte , H As Byte)
                      
                      Config Serialin = Buffered , Size = 128
                      Config Serialout = Buffered , Size = 128
                      
                      
                      Dht_put Alias Portd.6
                      Dht_get Alias Pind.6
                      Dht_io_set Alias Ddrd.6
                      
                      Dim T As Byte
                      Dim H As Byte
                      Dim Crc As Byte
                      Dim Mybyte As Byte
                      Dim Sensor_data As String * 40
                      Dim Tmp_str8 As String * 8
                      Dim Count As Byte
                      
                      Enable Interrupts
                      
                      Set Dht_io_set
                      Set Dht_put
                      
                      Cls
                      Do
                        Waitms 200
                        Call Get_th(t , H)
                        Home
                        Lcd "TMP: " ; T ; "C  "
                        Lowerline
                        Lcd "HDT: " ; H ; "%  "
                      
                      Loop
                      
                      Sub Get_th(t As Byte , H As Byte)
                      
                       Count = 0
                       Sensor_data = ""
                       Set Dht_io_set
                       Reset Dht_put
                       Waitms 30
                      
                       Set Dht_put
                       Waitus 50
                       Reset Dht_io_set
                       Waitus 40
                       If Dht_get = 1 Then
                        H = 1
                        Exit Sub
                       End If
                      
                      
                       Waitus 80
                       If Dht_get = 0 Then
                        H = 2
                        Exit Sub
                       End If
                      
                      
                      
                       While Dht_get = 1 : Wend
                      
                        Do
                        While Dht_get = 0 : Wend
                        Waitus 30
                         If Dht_get = 1 Then
                          Sensor_data = Sensor_data + "1"
                          While Dht_get = 1 : Wend
                          Else
                          Sensor_data = Sensor_data + "0"
                        End If
                        Incr Count
                        Loop Until Count = 40
                      
                        Set Dht_io_set
                        Set Dht_put
                      
                      
                      
                        Tmp_str8 = Left(sensor_data , 8)
                        H = Binval(tmp_str8)
                      
                        Tmp_str8 = Mid(sensor_data , 17 , 8)
                        T = Binval(tmp_str8)
                      
                        Tmp_str8 = Right(sensor_data , 8)
                        Crc = Binval(tmp_str8)
                      
                      
                      
                        Mybyte = T + H
                        If Mybyte <> Crc Then
                         H = 3
                        End If
                      
                      End Sub
                      عامل کليدي تمام موفقيتها " عمل کردن" است

                      دیدگاه


                        #26
                        پاسخ : راه اندازی سنسور رطوبت DHT 11/22

                        سلام. من dht11 رو با کدویژن راه اندازی کردم ولی به یه مشکل برخوردم. اینکه وقتی به سنسور سیگنال فعال سازی میفرستی اونم جوابمو می ده یعنی 80 میکرو ثانه خاموش و بعدش 80 میکروثانیه پول اپ می شه ولی دیگه اطلاعات نمی فرسته ! نمی دونم سنسور سوخته یا اینکه چپه زدم !!!! ولی اگه هم چپه زده یاشم چرا سنسور باید پاسخ بده؟؟؟ نمی دونم مشکل چیه در ضمن تو دیتاشیت نوشته که اگر پول اپ موند مشکل اتصالات الکتریکی ولی به صورت چشمی نگاه کردم اتصالات رو درست زدم ( با مولتی متر چک نکردم که جریان و ولتاژ چقدر است ) من برای تغزیه از یه آداپتر و یه رگلاتر 5 ولتی استفاده کردم . مقاومت پایه دیتا هم به vdd وصل کردم . بازم نتیجه نمی گیرم :sad: :sad: :sad: چی کار کنم؟ ترخدا بگین من تا 15 روزه دیگه باید پروژه تحویل بدم.

                        دیدگاه


                          #27
                          پاسخ : راه اندازی سنسور رطوبت DHT 11/22

                          نوشته اصلی توسط اقای دکتر
                          سلام
                          شما خودتون در عمل از dht22 جواب گرفتید ؟
                          تا چند متر کابل کشی کردید و جواب گرفتید ؟
                          دوست عزیز.
                          من با این سنسور یه چند ماهی کار کردم، سنسوره خوبیه و دقت بالاهی هم داره، فقط در هین استفاده از اون باید حواستون باشه رطوبت 100 یا صفر درصد نشه که هنگ میکنه! اونوقت باید برای چند ثانیه برقشو قطع کنی تا درست بشه! درضمن در هر ثانیه بیش از یک بار نباید باهاش ارتباط برقرار کنی!!! oo:
                          در مورد طول کابل اینم بگم که من یه جا خوندم تا 20 متر جواب میده.
                          تو را دانش و دين نمايد درست در رستگاري ببايدت جست
                          وگر دل نخواهي كه باشي نژند نخواهي كه دائم بوي مستمند
                          به گفتار پيغمبرت راه جوي دل از تيرگي ها بدين آب شوي

                          دیدگاه


                            #28
                            پاسخ : راه اندازی سنسور رطوبت DHT 11/22

                            نوشته اصلی توسط sanjaghak545
                            سلام دوستان
                            من تو راه اندازی dht11 به مشکل خوردم :angry: و چندتا سوال دارم
                            در مورد روش کار با این سنسور یکم توضیح میخوام
                            من با بسکام کار میکنم . از کد های آماده ای که دوستان گذاشته بودن استفاده کردم ولی 0 نشون میده

                            اگه امکانش هست یکم توضیح بدین که برای راه اندازی باید چکارکنم :read:
                            :applause: :applause: :applause: :applause:
                            سلام دوست عزیز.
                            من کتابخانه سنسور DHT22 رو برای این سنسور (DHT11) تغییر دادم. :nerd: میزارم که شما هم استفاده کنید.
                            فقط در مورد راه اندازی یادتون نره که معرفی پایه و فرکانس مثل DHT22 هستش.
                            اینم کتابخونش.
                            لطفاً اگه جواب گرفتین نظر بدین که بقیه بچه ها هم مطمئن بشن که کتابخونه سالمه. :job:
                            هرچند، من با این کتابخونه کار کردم و جواب هم گرفتم! :nice:
                            کد:
                            #define DHT22_PIN     PIND.5
                            #define DHT22_DDR     DDRD.5
                            #define DHT22_PORT     PORTD.5
                            
                            #define DHT22_INPUT_MODE  DHT22_DDR=0;
                            #define DHT22_OUTPUT_MODE DHT22_DDR=1;
                            #define DHT22_LOW     DHT22_PORT=0;
                            #define DHT22_HIGH     DHT22_PORT=1;
                            #define DHT22_READ     DHT22_PIN
                            //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                            
                            #define DHT_BUS_HUNG 0
                            
                            //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                            int dht22_read(float *temperature, float *humidity);
                            //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
                            // This should be 40, but the sensor is adding an extra bit at the start
                            #define DHT22_DATA_BIT_COUNT 41
                            //
                            // Read the 40 bit data stream from the DHT 22
                            // Store the results in private member data to be read by public member functions
                            //
                            int dht22_read(float *temperature, float *humidity)
                            {
                            // uint8_t bitmask = _bitmask;
                            //volatile uint8_t *reg asm("r30") = _baseReg;
                            int Count, i;
                            unsigned char bitTimes[DHT22_DATA_BIT_COUNT];
                            int Humidity;
                            int Temperature;
                            unsigned char checkSum, csPart1, csPart2, csPart3, csPart4;
                            
                            Humidity = 0;
                            Temperature = 0;
                            checkSum = 0;
                              
                            //return currentTime;
                            for(i = 0; i < DHT22_DATA_BIT_COUNT; i++)
                              {
                              bitTimes[i] = 0;
                              }
                            
                            // Pin needs to start HIGH, wait until it is HIGH with a timeout
                            //cli();
                            DHT22_INPUT_MODE
                            //sei();
                            Count = 0;
                            
                            do
                             {
                             if(Count > 125)
                              {
                              return DHT_BUS_HUNG;
                              }
                             Count++;
                             delay_us(2);
                             }while(!DHT22_READ);
                              
                            // Send the activate pulse
                            //cli();
                            DHT22_LOW
                            DHT22_OUTPUT_MODE // Output Low
                            //sei();
                            delay_us(1100); // 1.1 ms
                            //cli();
                            DHT22_INPUT_MODE  // Switch back to input so pin can float
                            //sei();
                            // Find the start of the ACK Pulse
                            Count = 0;
                            
                            do
                             {
                             if(Count > 25) //(Spec is 20 to 40 us, 25*2 == 50 us)
                              {
                              return DHT_BUS_HUNG;
                              }
                              Count++;
                              delay_us(2);
                             } while(!DHT22_READ);
                             
                            // Find the end of the ACK Pulse
                              
                            Count = 0;
                            do
                             {
                             if(Count > 50) //(Spec is 80 us, 50*2 == 100 us)
                              {
                              return DHT_BUS_HUNG;
                              }
                              Count++;
                              delay_us(2);
                             }while(DHT22_READ);
                             
                            // Read the 40 bit data stream
                            for(i = 0; i < DHT22_DATA_BIT_COUNT; i++)
                              {
                              // Find the start of the sync pulse
                              Count = 0;
                              do
                              {
                              if(Count > 35) //(Spec is 50 us, 35*2 == 70 us)
                               {
                               return DHT_BUS_HUNG;
                               }
                              Count++;
                              delay_us(2);
                              } while(!DHT22_READ);
                            
                              // Measure the width of the data pulse
                              Count = 0;
                              do
                               {
                               if(Count > 50) //(Spec is 80 us, 50*2 == 100 us)
                                {
                                return DHT_BUS_HUNG;
                                }
                                Count++;
                                delay_us(2);
                               }while(DHT22_READ);
                              bitTimes[i] = Count;
                              }
                            
                            // Now bitTimes have the number of retries (us *2)
                            // that were needed to find the end of each data bit
                            // Spec: 0 is 26 to 28 us
                            // Spec: 1 is 70 us
                            // bitTimes[x] <= 11 is a 0
                            // bitTimes[x] > 11 is a 1
                            // Note: the bits are offset by one from the data sheet, not sure why
                            for(i = 0; i < 16; i++)
                              {
                              if(bitTimes[i + 1] > 11)
                               {
                               Humidity |= (1 << (15 - i));
                               }
                              }
                            
                            for(i = 0; i < 16; i++)
                              {
                              if(bitTimes[i + 17] > 11)
                               {
                               Temperature |= (1 << (15 - i));
                               }
                              }
                              
                            for(i = 0; i < 8; i++)
                              {
                              if(bitTimes[i + 33] > 11)
                               {
                               checkSum |= (1 << (7 - i));
                               }
                              }
                            
                            *humidity = ((float)(Humidity & 0x7FFF)) / 10.0;
                              
                            if(Temperature & 0x8000)
                             {
                             // Below zero, non standard way of encoding negative numbers!
                             Temperature &= 0x7FFF;
                             *temperature = ((float)Temperature / 10.0) * -1.0;
                             }
                             else
                             {
                             *temperature = (float)Temperature / 10.0;
                             }
                            
                            csPart1 = Humidity >> 8;
                            csPart2 = Humidity & 0xFF;
                            csPart3 = Temperature >> 8;
                            csPart4 = Temperature & 0xFF;
                              
                            if(checkSum == ((csPart1 + csPart2 + csPart3 + csPart4) & 0xFF))
                             {
                             //*humidity = 10;
                             //return DHT_ERROR_NONE;
                             return 1;
                             }
                            
                            //*humidity = 20;
                            //return DHT_ERROR_CHECKSUM;
                            
                            //*temperature = -100;
                            //*humidity  = -100;
                            return 0;
                            }
                            دوباره یاد آوری میکنم که راه اندازیش دقیقا مثل DHT22 هست.
                            تو را دانش و دين نمايد درست در رستگاري ببايدت جست
                            وگر دل نخواهي كه باشي نژند نخواهي كه دائم بوي مستمند
                            به گفتار پيغمبرت راه جوي دل از تيرگي ها بدين آب شوي

                            دیدگاه


                              #29
                              پاسخ : راه اندازی سنسور رطوبت DHT 11/22

                              نوشته اصلی توسط ma.eca91
                              سلام دوست عزیز.
                              من کتابخانه سنسور DHT22 رو برای این سنسور (DHT11) تغییر دادم. :nerd: میزارم که شما هم استفاده کنید.
                              فقط در مورد راه اندازی یادتون نره که معرفی پایه و فرکانس مثل DHT22 هستش.
                              اینم کتابخونش.
                              لطفاً اگه جواب گرفتین نظر بدین که بقیه بچه ها هم مطمئن بشن که کتابخونه سالمه. :job:
                              هرچند، من با این کتابخونه کار کردم و جواب هم گرفتم! :nice:
                              کد:
                              #define DHT22_PIN     PIND.5
                              #define DHT22_DDR     DDRD.5
                              #define DHT22_PORT     PORTD.5
                              
                              #define DHT22_INPUT_MODE  DHT22_DDR=0;
                              #define DHT22_OUTPUT_MODE DHT22_DDR=1;
                              #define DHT22_LOW     DHT22_PORT=0;
                              #define DHT22_HIGH     DHT22_PORT=1;
                              #define DHT22_READ     DHT22_PIN
                              //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                              
                              #define DHT_BUS_HUNG 0
                              
                              //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                              int dht22_read(float *temperature, float *humidity);
                              //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
                              // This should be 40, but the sensor is adding an extra bit at the start
                              #define DHT22_DATA_BIT_COUNT 41
                              //
                              // Read the 40 bit data stream from the DHT 22
                              // Store the results in private member data to be read by public member functions
                              //
                              int dht22_read(float *temperature, float *humidity)
                              {
                              // uint8_t bitmask = _bitmask;
                              //volatile uint8_t *reg asm("r30") = _baseReg;
                              int Count, i;
                              unsigned char bitTimes[DHT22_DATA_BIT_COUNT];
                              int Humidity;
                              int Temperature;
                              unsigned char checkSum, csPart1, csPart2, csPart3, csPart4;
                              
                              Humidity = 0;
                              Temperature = 0;
                              checkSum = 0;
                                
                              //return currentTime;
                              for(i = 0; i < DHT22_DATA_BIT_COUNT; i++)
                                {
                                bitTimes[i] = 0;
                                }
                              
                              // Pin needs to start HIGH, wait until it is HIGH with a timeout
                              //cli();
                              DHT22_INPUT_MODE
                              //sei();
                              Count = 0;
                              
                              do
                               {
                               if(Count > 125)
                                {
                                return DHT_BUS_HUNG;
                                }
                               Count++;
                               delay_us(2);
                               }while(!DHT22_READ);
                                
                              // Send the activate pulse
                              //cli();
                              DHT22_LOW
                              DHT22_OUTPUT_MODE // Output Low
                              //sei();
                              delay_us(1100); // 1.1 ms
                              //cli();
                              DHT22_INPUT_MODE  // Switch back to input so pin can float
                              //sei();
                              // Find the start of the ACK Pulse
                              Count = 0;
                              
                              do
                               {
                               if(Count > 25) //(Spec is 20 to 40 us, 25*2 == 50 us)
                                {
                                return DHT_BUS_HUNG;
                                }
                                Count++;
                                delay_us(2);
                               } while(!DHT22_READ);
                               
                              // Find the end of the ACK Pulse
                                
                              Count = 0;
                              do
                               {
                               if(Count > 50) //(Spec is 80 us, 50*2 == 100 us)
                                {
                                return DHT_BUS_HUNG;
                                }
                                Count++;
                                delay_us(2);
                               }while(DHT22_READ);
                               
                              // Read the 40 bit data stream
                              for(i = 0; i < DHT22_DATA_BIT_COUNT; i++)
                                {
                                // Find the start of the sync pulse
                                Count = 0;
                                do
                                {
                                if(Count > 35) //(Spec is 50 us, 35*2 == 70 us)
                                 {
                                 return DHT_BUS_HUNG;
                                 }
                                Count++;
                                delay_us(2);
                                } while(!DHT22_READ);
                              
                                // Measure the width of the data pulse
                                Count = 0;
                                do
                                 {
                                 if(Count > 50) //(Spec is 80 us, 50*2 == 100 us)
                                  {
                                  return DHT_BUS_HUNG;
                                  }
                                  Count++;
                                  delay_us(2);
                                 }while(DHT22_READ);
                                bitTimes[i] = Count;
                                }
                              
                              // Now bitTimes have the number of retries (us *2)
                              // that were needed to find the end of each data bit
                              // Spec: 0 is 26 to 28 us
                              // Spec: 1 is 70 us
                              // bitTimes[x] <= 11 is a 0
                              // bitTimes[x] > 11 is a 1
                              // Note: the bits are offset by one from the data sheet, not sure why
                              for(i = 0; i < 16; i++)
                                {
                                if(bitTimes[i + 1] > 11)
                                 {
                                 Humidity |= (1 << (15 - i));
                                 }
                                }
                              
                              for(i = 0; i < 16; i++)
                                {
                                if(bitTimes[i + 17] > 11)
                                 {
                                 Temperature |= (1 << (15 - i));
                                 }
                                }
                                
                              for(i = 0; i < 8; i++)
                                {
                                if(bitTimes[i + 33] > 11)
                                 {
                                 checkSum |= (1 << (7 - i));
                                 }
                                }
                              
                              *humidity = ((float)(Humidity & 0x7FFF)) / 10.0;
                                
                              if(Temperature & 0x8000)
                               {
                               // Below zero, non standard way of encoding negative numbers!
                               Temperature &= 0x7FFF;
                               *temperature = ((float)Temperature / 10.0) * -1.0;
                               }
                               else
                               {
                               *temperature = (float)Temperature / 10.0;
                               }
                              
                              csPart1 = Humidity >> 8;
                              csPart2 = Humidity & 0xFF;
                              csPart3 = Temperature >> 8;
                              csPart4 = Temperature & 0xFF;
                                
                              if(checkSum == ((csPart1 + csPart2 + csPart3 + csPart4) & 0xFF))
                               {
                               //*humidity = 10;
                               //return DHT_ERROR_NONE;
                               return 1;
                               }
                              
                              //*humidity = 20;
                              //return DHT_ERROR_CHECKSUM;
                              
                              //*temperature = -100;
                              //*humidity  = -100;
                              return 0;
                              }
                              دوباره یاد آوری میکنم که راه اندازیش دقیقا مثل DHT22 هست.
                              سلام داداش خسته نباشی
                              من کدو تست کردم واسه dht11 جواب نمیده
                              سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

                              دیدگاه


                                #30
                                پاسخ : راه اندازی سنسور رطوبت DHT 11/22

                                نوشته اصلی توسط ma.eca91
                                سلام دوستان. من سورس کد این سنسور رو از لینک زیر دانلود کردم و یه مقداری دستکاریش کردم.
                                http://www.pocketmagic.net/wp-conten...HT-22_8Mhz.zip
                                تبدیلش کردم به یه فایل هدر برای کدویژن. :nerd: محتویات این هدر فایل به صورت زیره. کاملا تست شده و سالمه. :nice:
                                دقت کنین که فرکانس کاریتون روی 8Meg یا بیشتر تنظیم باشه.
                                کد:
                                #define DHT22_PIN     PIND.5
                                #define DHT22_DDR     DDRD.5
                                #define DHT22_PORT     PORTD.5
                                
                                #define DHT22_INPUT_MODE  DHT22_DDR=0;
                                #define DHT22_OUTPUT_MODE DHT22_DDR=1;
                                #define DHT22_LOW     DHT22_PORT=0;
                                #define DHT22_HIGH     DHT22_PORT=1;
                                #define DHT22_READ     DHT22_PIN
                                //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                                
                                #define DHT_BUS_HUNG 0
                                
                                //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                                int dht22_read(float *temperature, float *humidity);
                                //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
                                // This should be 40, but the sensor is adding an extra bit at the start
                                #define DHT22_DATA_BIT_COUNT 41
                                //
                                // Read the 40 bit data stream from the DHT 22
                                // Store the results in private member data to be read by public member functions
                                //
                                int dht22_read(float *temperature, float *humidity)
                                {
                                // uint8_t bitmask = _bitmask;
                                //volatile uint8_t *reg asm("r30") = _baseReg;
                                int Count, i;
                                unsigned char bitTimes[DHT22_DATA_BIT_COUNT];
                                int Humidity;
                                int Temperature;
                                unsigned char checkSum, csPart1, csPart2, csPart3, csPart4;
                                
                                Humidity = 0;
                                Temperature = 0;
                                checkSum = 0;
                                  
                                //return currentTime;
                                for(i = 0; i < DHT22_DATA_BIT_COUNT; i++)
                                  {
                                  bitTimes[i] = 0;
                                  }
                                
                                // Pin needs to start HIGH, wait until it is HIGH with a timeout
                                //cli();
                                DHT22_INPUT_MODE
                                //sei();
                                Count = 0;
                                
                                do
                                 {
                                 if(Count > 125)
                                  {
                                  return DHT_BUS_HUNG;
                                  }
                                 Count++;
                                 delay_us(2);
                                 }while(!DHT22_READ);
                                  
                                // Send the activate pulse
                                //cli();
                                DHT22_LOW
                                DHT22_OUTPUT_MODE // Output Low
                                //sei();
                                delay_us(1100); // 1.1 ms
                                //cli();
                                DHT22_INPUT_MODE  // Switch back to input so pin can float
                                //sei();
                                // Find the start of the ACK Pulse
                                Count = 0;
                                
                                do
                                 {
                                 if(Count > 25) //(Spec is 20 to 40 us, 25*2 == 50 us)
                                  {
                                  return DHT_BUS_HUNG;
                                  }
                                  Count++;
                                  delay_us(2);
                                 } while(!DHT22_READ);
                                 
                                // Find the end of the ACK Pulse
                                  
                                Count = 0;
                                do
                                 {
                                 if(Count > 50) //(Spec is 80 us, 50*2 == 100 us)
                                  {
                                  return DHT_BUS_HUNG;
                                  }
                                  Count++;
                                  delay_us(2);
                                 }while(DHT22_READ);
                                 
                                // Read the 40 bit data stream
                                for(i = 0; i < DHT22_DATA_BIT_COUNT; i++)
                                  {
                                  // Find the start of the sync pulse
                                  Count = 0;
                                  do
                                  {
                                  if(Count > 35) //(Spec is 50 us, 35*2 == 70 us)
                                   {
                                   return DHT_BUS_HUNG;
                                   }
                                  Count++;
                                  delay_us(2);
                                  } while(!DHT22_READ);
                                
                                  // Measure the width of the data pulse
                                  Count = 0;
                                  do
                                   {
                                   if(Count > 50) //(Spec is 80 us, 50*2 == 100 us)
                                    {
                                    return DHT_BUS_HUNG;
                                    }
                                    Count++;
                                    delay_us(2);
                                   }while(DHT22_READ);
                                  bitTimes[i] = Count;
                                  }
                                
                                // Now bitTimes have the number of retries (us *2)
                                // that were needed to find the end of each data bit
                                // Spec: 0 is 26 to 28 us
                                // Spec: 1 is 70 us
                                // bitTimes[x] <= 11 is a 0
                                // bitTimes[x] > 11 is a 1
                                // Note: the bits are offset by one from the data sheet, not sure why
                                for(i = 0; i < 16; i++)
                                  {
                                  if(bitTimes[i + 1] > 11)
                                   {
                                   Humidity |= (1 << (15 - i));
                                   }
                                  }
                                
                                for(i = 0; i < 16; i++)
                                  {
                                  if(bitTimes[i + 17] > 11)
                                   {
                                   Temperature |= (1 << (15 - i));
                                   }
                                  }
                                  
                                for(i = 0; i < 8; i++)
                                  {
                                  if(bitTimes[i + 33] > 11)
                                   {
                                   checkSum |= (1 << (7 - i));
                                   }
                                  }
                                
                                *humidity = ((float)(Humidity & 0x7FFF)) / 10.0;
                                  
                                if(Temperature & 0x8000)
                                 {
                                 // Below zero, non standard way of encoding negative numbers!
                                 Temperature &= 0x7FFF;
                                 *temperature = ((float)Temperature / 10.0) * -1.0;
                                 }
                                 else
                                 {
                                 *temperature = (float)Temperature / 10.0;
                                 }
                                
                                csPart1 = Humidity >> 8;
                                csPart2 = Humidity & 0xFF;
                                csPart3 = Temperature >> 8;
                                csPart4 = Temperature & 0xFF;
                                  
                                if(checkSum == ((csPart1 + csPart2 + csPart3 + csPart4) & 0xFF) && status.humi>0)
                                 {
                                 //*humidity = 10;
                                 //return DHT_ERROR_NONE;
                                 return 1;
                                 }
                                
                                //*humidity = 20;
                                //return DHT_ERROR_CHECKSUM;
                                
                                //*temperature = -100;
                                //*humidity  = -100;
                                return 0;
                                }
                                سلام،
                                من این هدر رو تست کردم اما توی پروتئوس جواب نداد!
                                با اسیلوسکوپ پروتئوس هم که نگاه کردم، پالس از میکرو میره به سنسور، ولی سنسور پاسخی نمیده!
                                اما دوتا مدار توی مثالهای پروتئوس داره (یکی با آردینو و یکی هم با PIC) که با همون مدار جواب میده به خوبی! (با اسکوپم که چک میکنم سنسور جواب میده!)

                                کسی با پروتئوس تونسته راه اندازی کنه؟

                                با تشکر

                                «پشتکار» «پشتکار» «پشتکار»

                                دیدگاه

                                لطفا صبر کنید...
                                X