اطلاعیه

Collapse
No announcement yet.

راه اندازی سنسور دما و رطوبت SHT21 با استفاده از کدویژن

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

    راه اندازی سنسور دما و رطوبت SHT21 با استفاده از کدویژن

    با سلام خدمت دوستان و اساتید گرامی
    طی یک پروژه بنا هست تا سنسور دما و رطوبت SHT21 را که جدید ترین عضو خانواده سنسور های سری SHTxx هست که ساخت شرکت معظم Sensirionهستند. نمونه های قبلی این سنسور ها به شماره های SHT1x و SHT7x هستند که از پروتکلی مشابه به i2c استفاده میکردند ولی سری جدید سنسور هایی که توسط این شرکت ارائه شده (SHT2x) از پروتکل i2c استفاده میکنند.
    سنسوری که بنده تهیه کردم SHT21 هست
    اینم دیتاشیت سنسور مورد نظرم

    http://www.sensirion.com/fileadmin/u...tasheet_V4.pdf

    این سنسور فوق العاده کوچک و ظریفه، ما برای استفاده از اون مجبور به طراحی و سفارش یک بورد مدار چاپی شدیم و برای مونتاژ سنسور روی برد هم به دلیل وجود شکاف روی سنسور هم با سختی زیادی این کار صورت گرفت. چون برای این کار نه میشد حرارت رو از بالا بدیم و نه از بغل، بلکه باید از زیر بورد رو گرم میکردیم که منجر به تغییر رنگ فیبر شد.
    بگذریم
    پروتکل ارتباتی این سنسور i2c هست که از صفحه 8 دیتاشیت نحوه برقراری ارتباط بیان شده

    اما مشکل بنده
    این اولین پروژه ای هست که از این پروتکل بصورت خام استفاده میکنم چون قبلا با DS1307 و LM75 کار کردم و البته این چیپ ها دارای کتابخانه آماده هستند و کار باهاشون بسیار سادست ولی برای ارتباط گرفتن با SHT21 باید خودم استارت، آدرس و دستور رو صادر کنم
    بعد از مطالعه چند باره دیتا پیش و کتاب مهندس ره افروز و سمپل کد کدویژن یک برنامه نوشتم ولی متاسفانه جواب نگرفتم

    حالا از دوستان و اساتید عزیز درخواست دارم که کمک کنن تا این سنسور رو راه اندازی کنم

    این هم از برنامه ای که نوشتم


    #include <mega16.h>

    // I2C Bus functions
    #include <i2c.h>

    // Alphanumeric LCD functions
    #include <alcd.h>

    // TWI functions
    #include <twi.h>

    // Delay functions
    #include <delay.h>

    #include <stdio.h>
    #include <stdlib.h>

    unsigned int temp1;
    unsigned char Temp1,Temp2;
    unsigned char temperature[16],Temp15[16];
    float a,temp;
    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTA=0x00;
    DDRA=0x00;

    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0x00;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // TWI initialization
    // Mode: TWI Master
    // Bit Rate: 100 kHz
    twi_master_init(100);

    i2c_init();

    lcd_init(16);

    // Global enable interrupts
    #asm("sei&quot

    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf(" SHT21 Sensor "
    lcd_gotoxy(0,1);
    lcd_putsf("Temp & Humidity "
    delay_ms(1000);
    lcd_clear();

    while (1)
    {
    // Place your code here
    i2c_start();
    i2c_write(0b10000000);
    i2c_write(0b11100011);
    i2c_write(0b10000001);
    Temp1=i2c_read(0b10000001);
    Temp2=i2c_read(0b10000001);
    i2c_stop();
    lcd_clear();
    sprintf(Temp15,"%c",Temp1);
    temp1=Temp1<<8;
    temp1=temp1+Temp2;
    a=temp1/65536;
    a=a*175.72;
    temp=a-46.85;
    ftoa(temp,2,temperature);
    lcd_gotoxy(0,0);
    lcd_puts(temperature);
    lcd_putsf(" "
    lcd_gotoxy(0,1);
    lcd_puts(Temp15);
    delay_ms(1000);

    }
    }


    در نهایت فقط مقدار -46.85 روی ال سی دی نمایش داده میشه
    ممنون میشم کمک کنید
    بابت طولانی شده عذر میخوام



    #2
    پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

    این نکته رو هم عرض کنم که این سنسور 3 ولت هست و از میکرو سری L استفاده کردم

    دیدگاه


      #3
      پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

      یعنی تو این ماه رمضونی یه مهندس گل نیست دسته منه مسکین سائل رو رد نکنه و یه راه پیش پام بگذاره؟

      دیدگاه


        #4
        پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

        طول داده هایی سنسور میفرسته 16 بیتی هست و دستور دریافت I2C در AVR هشت بیتی.این موضوع می تواند باعث اشتباه در دریافت شود.به خصوص که بین این دوتا هشت بیت یک بیت ACK نیز داریم.من توی راه اندازی AD9833 که SPI 16 بیتی بود به این نتیجه رسیدم که باید کلاک و دیتا رو به صورت دستی و بیت به بیت ایجاد کرد
        در جهان رازهایی هست که جز به بهای ریختن خون فاش نمی شود . شهید مرتضی آوینی

        دیدگاه


          #5
          پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

          خب این مشکل توی i2c نیست. یعنی داده ها 16 بیتی ارسال میشن بعد از هر 8 بیت ارسال یک بیت start ایجاد میشه که به معنای دریافت یا ارسال دوباره است.
          ولی spi آره بیشتر از 8 بیت قادر به دریافت و ارسال نیست و مثلا برای 10 بیت باید خودتون برنامه اش رو بنویسید
          ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

          امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

          دیدگاه


            #6
            پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

            درسته 16 بیتی هست
            درای همین هم من بعد از دریافت MSB اون رو 8 بیت به چپ شیفت دادم و LSB رو باش جمع کردم
            ولی خوب مطمئنم برنامه ای که نوشتن کاملا نقص داره که هیچ دریافتی ندارم

            دیدگاه


              #7
              پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

              تمیز زدیش. فقط برای درایوش چیکار کردی؟؟؟
              چون ولتاژ کاریش 3.3 ولته سطوح منطقیش هم باید براش مدار بذاری تا بتونه با میکرو ارتباط برقرار کنه
              راستی صندوق پیامت رو هم خالی کن. پیام نمیگیره
              ... و (بدانيد) گرفتن تصميمهاى محكم (براى رسيدن به اهداف بزرگ) با خوش گذرانى و سفرهآ‌هاى رنگين سازگار نيست و چه بسيار كه خواب شبانه تصميمهاى محكم روز را از ميان برده و تاريكيآ‌ها، خاطره همتآ‌هاى بلند را از يادها محو كرده است. (نهجآ‌البلاغه، خطبه211)

              امام علي (ع):کسي که به وقت ياري رهبرش در خواب باشد، با لگد دشمنش بيدار مي شود (غررالحکم،ص 422)

              دیدگاه


                #8
                پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

                خالی کردم
                عرضم به حضور شما که برای اینکه مشکل با ولتاژ نداشته باشم و همچنین خودم رو درگیر مسئله جدید نکنم فعلا از میکرو کنترلر ATmega16L استفاده کردم تا بعد از اینکه جواب دلخواه گرفتم اون وقت اگر نیاز بود برای تغییر سطوح هم فکری میکنم ولی به نظرم تو کاری که میخوام انجام بدم نیاز نشه و از همون نوع L استفاده میکنم.
                نوع L رو با ولتاژ 3.3 که روشن کنی و به LCD بدین برای دریافت و ارسال اطلاعات دچار مشکل نمیشیم و فقط کافیه تغذیه LCD رو 5 ولت بدین چون اگر LCD رو هم با 3.3 روشن کنید هیچی روش معلوم نیست و فقط یه سایه خیلی محو ازز اطلاعات رو میبینید
                پس مدارم دو تغذیه ای هست

                دیدگاه


                  #9
                  پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

                  سلام.من یه مدتی دنبال این سری رطوبت سنج ها بودم.بحث رطوبت پیچیدگی های خاص خودش رو داره مثلا رطوبت نقطه ای و رطوبت محیطی که شیوه های اندازگیری متفاوتی داره.
                  من خودم دیگه فرصت نشد و بی خیال شدم.
                  من بسکامی هستم و کم سواد اما برای تغییر سطح ولتاژ روشی که انتخاب کردی اصلا خوب نیست!
                  از بافرها استفاده کن مثلا 74244 یا 74245 اینها یک کدومشون یا شاید هر دوشون این قابلیت رو دارن که ولتاژ دلخواهت رو به سطح قابل استفاده میکرو تبدیل می کنه.
                  اینم مرجع فارسی
                  http://robona.ir/?p=773
                  انا لله و انا اليه الراجعون

                  دیدگاه


                    #10
                    پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

                    دوست عزیز، من با این سنسور کار نکردم. ولی تجربیاتم رو در مورد مشکلت در میون میگذارم؛
                    اول، میکرو رو از سریِ A انتخاب کن. L مالِ 4-5 سالِ پیش بوده!! تغذیه میکرو رو 3.3 بده راحت.
                    دوم، خازن های دکوپلینگ برای تغذیه سنسور چسبیده بهش بگذار. یادمه یه سنسور مغناطیس بود که همین دردسرها رو برام درست کرد. مشکلش خازن تغذیه ش بود که باید مرغوب می بوده.
                    سوم، تغذیه LCDت رو 5 ببیند و میکرو و سنسور رو 3.3. هیچچ مشکلی پیش نمیاد.
                    چهارم، I2C یکم بدقلقه. من چندین تا کار باهاش انجام دادم و نتیجه برنامه نویسیش رو برات میذارم اینجا.

                    از کتابخونه های آماده کدویژن استفاده نمی کنیم و خودمون به صورت دستی پین رو صفر و یک می کنیم. لازمه دقت کنی که برای 1 کردنِ خروجی، نباید توش 1 بنویسی، فقط باید ولش کنی رو هوا. مقاومتِ Pull-up خارجی باعث میشه که خروجی 1 بشه.
                    این تعاریف برای Mega8:
                    کد:
                    #include <mega8.h>
                    #include <delay.h>
                    #include <stdio.h>
                    
                    #define EEPROM_W  0xA0 
                    #define EEPROM_R  0xA1
                    
                    #define LED  PORTD.7
                    
                    #define SCL_HIGH  DDRC &= ~(1<<5)
                    #define SCL_LOW  DDRC |= (1<<5)
                    #define SDA_HIGH  DDRC &= ~(1<<4)
                    #define SDA_LOW  DDRC |= (1<<4)
                    #define SDA    PORTC.4
                    #define SDA_PIN  PINC.4
                    
                    #define SCL_INPUT DDRC &= ~(1<<5)
                    #define SDA_INPUT DDRC &= ~(1<<4)
                    
                    #define SCL_OUTPUT DDRC |= (1<<5)
                    #define SDA_OUTPUT DDRC |= (1<<4)
                    
                    // Port for the I2C
                    #define I2C_DDR DDRC
                    #define I2C_PIN PINC
                    #define I2C_PORT PORTC
                    
                    // Pins to be used in the bit banging
                    #define I2C_CLK 5
                    #define I2C_DAT 4
                    
                    #define I2C_DATA_HI() I2C_DDR &= ~( 1 << I2C_DAT );
                    #define I2C_DATA_LO() I2C_DDR |= ( 1 << I2C_DAT );
                    
                    #define I2C_CLOCK_HI() I2C_DDR &= ~( 1 << I2C_CLK );
                    #define I2C_CLOCK_LO() I2C_DDR |= ( 1 << I2C_CLK );
                    اینم توابعِ کار با I2C:
                    کد:
                    void I2C_WriteBit( unsigned char c )
                    {
                    if ( c > 0 )
                    {
                    I2C_DATA_HI();
                    }
                    else
                    {
                    I2C_DATA_LO();
                    }
                    
                    I2C_CLOCK_HI();
                    delay_us(200);
                    
                    I2C_CLOCK_LO();
                    delay_us(200);
                    
                    if ( c > 0 )
                    {
                    I2C_DATA_LO();
                    }
                    
                    delay_us(200);
                    
                    }
                    
                    unsigned char I2C_ReadBit()
                    {
                    unsigned char c;
                    
                    I2C_DATA_HI();
                    
                    I2C_CLOCK_HI();
                    delay_us(200);
                    
                    c = I2C_PIN;
                    
                    I2C_CLOCK_LO();
                    delay_us(200);
                    
                    return ( c >> I2C_DAT ) & 1;
                    }
                    
                    // Inits bitbanging port, must be called before using the functions below
                    void I2C_Init()
                    {
                    I2C_PORT &= ~( ( 1 << I2C_DAT ) | ( 1 << I2C_CLK ) );
                    
                    I2C_CLOCK_HI();
                    I2C_DATA_HI();
                    
                    delay_us(200);
                    }
                    
                    // Send a START Condition
                    void I2C_Start()
                    {
                    // set both to high at the same time
                    I2C_DDR &= ~( ( 1 << I2C_DAT ) | ( 1 << I2C_CLK ) );
                    delay_us(200);
                    
                    I2C_DATA_LO();
                    delay_us(200);
                    
                    I2C_CLOCK_LO();
                    delay_us(200);
                    }
                    
                    // Send a STOP Condition
                    void I2C_Stop()
                    {
                    I2C_CLOCK_HI();
                    delay_us(200);
                    
                    I2C_DATA_HI();
                    delay_us(200);
                    }
                    و اینم نمونه تابع main برای کار با داده های 8 بیتی. شما باید به 16 بیت تغیییرش بدید:
                    کد:
                    I2C_Init();
                    .
                    .
                    .
                    I2C_Start();
                    res1 = I2C_Write(0xA0); // Write  
                    res1 = I2C_Write(adr); // Write Addr
                    
                    I2C_Start();
                    res1 = I2C_Write(0xA1); // Read  
                    res2 = I2C_Read(0);
                    I2C_Stop();
                    printf("\n\r-%3d -%d -%X ", adr, res1, res2);
                    بیایید با Google آشتی کنیم!

                    دیدگاه


                      #11
                      پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

                      با تشکر از توجه شما
                      نمونه L رو از سال ها پیش داشتم ببینم اگر A داشتم حتما تست میکنم
                      باید اعتراف کنم تواناییم در برنامه های پیچیده و خصوصا نوشتن کتابخانه صفره

                      اما در مود تغذیه من از 3.3 پاور کامپیوتر استفاده کردم که در واقع 3.41 بود

                      تغذیه LCD رو هم که همونجور که فرمودین 5 ولت جدا دادم و ارتباط میکرو با LCD بدون مشکل بوده

                      دیدگاه


                        #12
                        پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با کدویژن

                        همچنان چشم براه کمک دوستانم

                        دیدگاه


                          #13
                          پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

                          بابا این shtخیلی مذخرفه! :angry: :angry: :angry: :angry: :angry:
                          1 در دنیا 100 در آخرت (درس و مشق فعالیتمو تو انجمن کم کرده)
                          من آنچه شرط بلاغست با تو میآ‌گویم. تو خواه از سخنم پند گیر و خواه ملال. سعدی
                          !Electronic On! Programming On
                          هوشمندانه سوال بپرسیم!
                          http://ir02x6.persiangig.com/logo/eca/tanks_01.png

                          دیدگاه


                            #14
                            پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با کدویژن

                            نوشته اصلی توسط عزیز خورشیدزاده
                            همچنان چشم براه کمک دوستانم
                            عزیز، کمک کردم دیگه. نمونه کد هم گذاشتم. در مورد سخت افزارت هم حرف زدم. دیگه از این بیشتر میشه اینکه بشینم کلاً پروژه ت رو برات انجام بدم!!
                            اگه شما مشکلِ برنامه نویسی داری دیگه مربوط به بچه های فروم نمیشه. خودت باید بیشتر تلاش کنی تا بتونی از پسِ کارهات بربیای... بشین یکم مطالعه کن. یکم با Google آشتی باش. دقیق تر جستجو کن. انگلیسیت رو تقویت کن. چه می دونم، هر چی توان داری بذار تا کارت با موفقیت انجام بشه.
                            اگرم نمی تونی انجامش بدی، دیگه انقد ناله و فغان نکن! بسپار به یه نفرِ دیگه که می تونه برات انجام بده. واللا! مجبور نیستی که.
                            تمام.
                            بیایید با Google آشتی کنیم!

                            دیدگاه


                              #15
                              پاسخ : راه اندازی سنسور دما و رطوبت SHT21 با استفاده از &#

                              محمد عزیز، برنامه نویسیم ضعیفه، معترفم
                              ولی این سنسور SHT21 چه تو منابع فارسی و چه انگلیسی چیزی یافت نکردم
                              sht1x یا sht7x منابع مختلف به زبان های مختلف هست ولی این sht2x رو ندیدم

                              پس بهتره من سوالم رو یک جور دیگه مطرح کنم
                              این سنسور i2c هست و منم میخوام از کتابخانه i2c کدویژن استفاده کنم. توابع رو خودم (از تو help کدویژن که انگلیسی بود) و تقریباً میدونم هر کدوم چکار میکنند.
                              در مورد i2c هم مطالعه کردم و اطلاعاتی بدست آوردم
                              دیتاشیت سنسور رو هم خوندم و اگر مطالعه کرده باشید از صفحه 7 تا 10 مربوط به خواندن و نوشتن و محاسبه دما و رطوبت میشه

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

                              از بایت ناله و فغانی که میکنم ببخشید. اگر اصرار به انجام این پروژه دارم چون دوس ندارم تا به دیوار خوردم سر و ته کنم و برگردم و ضمنا همه که دور و بریاشون عالم و دانشمند نیستن

                              بازم از بذل توجوتون ممنونم

                              دیدگاه

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