نمایش نتایج: از 1 به 4 از 4

موضوع: ماژول فشار سنج بارومتريك bmp085 gy-65

  1. #1
    max
    max آنلاین نیست.
    Member
    تاریخ عضویت
    Jul 2013
    محل سکونت
    iran-shiraz
    نوشته ها
    70

    ماژول فشار سنج بارومتريك bmp085 gy-65

    BMP085 يك ماژول فشار بارومتريك با دقت بالا و جريان مصرفي پايين است. اين ماژول ميتواند فشار بين 300 تا 1100 هكتوپاسكال را با دقت مطلق 0.03 هكتوپاسكال اندازه گيري نمايد.همچنين قابليت اندازه گيري دماي محيط را دارا ميباشد. BMP085 بر اساس تكنولوژي مقاومت پيزوالكتريك ياPiezo-resistive طراحي و توليد شده. استفاده از اين تكنولوژي دقت بالا، خطي بودن و پايداري طولاني مدت را براي اين سنسور فراهم نموده است.


    مشخصات:
    رنج گسترده در اندازه گيري فشار بارومتريك (300 تا 1100 هكتوپاسكال)
    رنج اندازه گيري ارتفاع از 500 متر پايينتر از سطح دريا تا 9000 متر بالاتر از سطح دريا.
    ولتاژ تغذيه 1.8 تا 3.6 ولت
    جريان مصرفي 5 ميكرو آمپر در حالت استاندارد
    نويز پايين در اندازه گيري
    قابليت اندازه گيري دما با دقت 0.1 درجه سانتيگراد
    خروجي ديجيتال با رابط I2C
    كاملا كاليبره شده
    قابليت تحمل فشار تا 10000 هكتوپاسكال
    bmp085.jpg
    اين ماژول را ميتوان از طريق رابط I2C به برد آردوينو متصل كرد. برنامه زير اطلاعات مربوط به فشار و دما را در محيط serial monitor آردوينو نمايش ميدهد.
    کد:
     /*
     # 
     # Example code for GY-65 BMP085 PRESSURE MODULE
     # Company    : AftabRayaneh
     # Website    : http://shop.aftabrayaneh.com
     # Editor     : mohammad omidvar -max
     # Date       : 07.10.2013
     # Version    : 1.0
    */
    #include <Wire.h>
    #include <BMP085.h>
    
    BMP085 dps = BMP085();
    long Temperature = 0, Pressure = 0, Altitude = 0;
    
    void setup(void) {
      Serial.begin(9600);
      Wire.begin();
      delay(1000);
    	
      dps.init();   
      
      showall();
      
      Serial.println("Registers dump");
      Serial.println("==========================================================");
      dumpRegisters();
      Serial.println("Calibration data");
      Serial.println("==========================================================");
      dps.dumpCalData();
      
      delay(5000);
    }
     
    
    void loop(void) {
      dps.getTemperature(&Temperature); 
      dps.getPressure(&Pressure);
      dps.getAltitude(&Altitude);
      
      Serial.print("Temp(C):");
      Serial.print(Temperature);
      Serial.print("  Alt(cm):");
      Serial.print(Altitude);
      Serial.print("  Pressure(Pa):");
      Serial.println(Pressure);
    }
    
    void showall(void) { 
      Serial.println("Current BMP085 settings");
      Serial.println("==========================================================");
      Serial.print("device address                  = 0x");
      Serial.println(dps.getDevAddr(), HEX);
      Serial.print("Mode                            = ");
      switch (dps.getMode()) {
        case MODE_ULTRA_LOW_POWER: 
          Serial.println("MODE_ULTRA_LOW_POWER");
          break;
        case MODE_STANDARD: 
          Serial.println("MODE_STANDARD");
          break;    
        case MODE_HIGHRES: 
          Serial.println("MODE_HIGHRES");
          break;    
        case MODE_ULTRA_HIGHRES:     
          Serial.println("MODE_ULTRA_HIGHRES");
          break; 
      }  
    }
    
    void dumpRegisters() {
      byte ValidRegisterAddr[]={0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,0xF6,0xF7,0xF8,0xF9}; 
      byte _b, i, totregisters = sizeof(ValidRegisterAddr);
      Serial.println("---dump start---");
      Serial.println("Register address|Register data");
      Serial.println("Reg.address(hex,dec) Reg.data(bin,hex,dec)");
      for (i=0;i<totregisters;i++){    
        Serial.print("0x");
        Serial.print(ValidRegisterAddr[i], HEX);
        Serial.print(",");
        Serial.print(ValidRegisterAddr[i], DEC);
        Serial.print(",");
        dps.readmem(ValidRegisterAddr[i], 1, &_b);
        Serial.print("b");
        print_bits(_b);
        Serial.print(",0x");
        Serial.print(_b,HEX);
        Serial.print(",");
        Serial.println(_b,DEC);  
      }
      Serial.println("---dump end---");
    }
    
    void print_bits(byte val){
      int i;
      for(i=7; i>=0; i--) 
        Serial.print(val >> i & 1, BIN);
    }
    /* void print_unit16(uint16_t val){
      int i;
      for(i=15; i>=0; i--) 
        Serial.print(val >> i & 1, BIN);
    } 
    */

    جهت سفارش این کالا، به این بخش در فروشگاه آفتاب رایانه مراجعه نمایید.
    تصاویر کوچک شده (Thumbnails) پیوست شده تصاویر کوچک شده (Thumbnails) پیوست شده gy-65-bmp085_sch.jpg  
    فایل های پیوست شده فایل های پیوست شده
    ویرایش توسط max : 10-07-2013 در ساعت 02:10 PM

  2. #2
    Junior Member
    تاریخ عضویت
    Mar 2015
    نوشته ها
    2
    با سلام خدمت مهندسین عزیز من میخواهم این سنسور را راه اندازی کنم اما من چون با i2c فقط با ds1307
    کار کردم نمیدونم چطوری باید با این کار کنم کتابخونه رو دانلود کردم و در مسیر کدویژن کپی کردم اما نمیدونم با چه دستوراتی فرا خوانی و برنامه نویسی کنم
    C:\cvavr\INC
    بعد اگر این سنسوررا در هوای شهر مثل شهر کرج یا تهران قرار دهم میتواند پاسکال محیط را اندازه بگیرد؟


    اگر این بنده حقیر رت راهنمایی بفرمایید بسیار سپاسگزارم
    ویرایش توسط imannejaty : 03-11-2015 در ساعت 09:08 PM

  3. #3
    Senior Member
    تاریخ عضویت
    Jan 2015
    محل سکونت
    ایران
    نوشته ها
    238
    سلام

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

    شما الان پردازندتون چیه ؟

  4. #4
    Junior Member
    تاریخ عضویت
    Mar 2015
    نوشته ها
    2
    نقل قول نوشته اصلی توسط pi.siqma نمایش پست ها
    سلام

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

    شما الان پردازندتون چیه ؟
    atmega16

    کد:
    /****************************************************************************
    * BMP085.h - BMP085/I2C (Digital Pressure Sensor) library for Arduino       *
    * Copyright 2010-2012 Filipe Vieira & various contributors                  *
    *                                                                           *
    * This file is part of BMP085 Arduino library.                              *
    *                                                                           *
    * This library is free software: you can redistribute it and/or modify      *
    * it under the terms of the GNU Lesser General Public License as published  *
    * by the Free Software Foundation, either version 3 of the License, or      *
    * (at your option) any later version.                                       *
    *                                                                           *
    * This program is distributed in the hope that it will be useful,           *
    * but WITHOUT ANY WARRANTY; without even the implied warranty of            *
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
    * GNU Lesser General Public License for more details.                       *
    *                                                                           *
    * You should have received a copy of the GNU Lesser General Public License  *
    * along with this program.  If not, see <http://www.gnu.org/licenses/>.     *
    ****************************************************************************/
    /****************************************************************************
    * Tested on Arduino Mega with BMP085 Breakout                               *
    * SDA   -> pin 20   (no pull up resistors)                                  *
    * SCL   -> pin 21   (no pull up resistors)                                  *
    * XCLR  -> not connected                                                    *
    * EOC   -> not connected                                                    *
    * GND   -> pin GND                                                          *
    * VCC   -> pin 3.3V                                                         *
    * NOTE: SCL and SDA needs pull-up resistors for each I2C bus.               *
    *  2.2kOhm..10kOhm, typ. 4.7kOhm                                            *
    *****************************************************************************/
    #ifndef BMP085_h
    #define BMP085_h
    
    #if defined(ARDUINO) && ARDUINO >= 100
    #include "Arduino.h"
    #else
    #include "WProgram.h"
    #endif
    
    #define BMP085_ADDR                 0x77     //0x77 default I2C address
    #define BUFFER_SIZE                 3
    
    #define AUTO_UPDATE_TEMPERATURE     true    //default is true
            // when true, temperature is measured everytime pressure is measured (Auto).
            // when false, user chooses when to measure temperature (just call calcTrueTemperature()).
            // used for dynamic measurement to increase sample rate (see BMP085 modes below).
           
    /* ---- Registers ---- */
    #define CAL_AC1           0xAA  // R   Calibration data (16 bits)
    #define CAL_AC2           0xAC  // R   Calibration data (16 bits)
    #define CAL_AC3           0xAE  // R   Calibration data (16 bits)    
    #define CAL_AC4           0xB0  // R   Calibration data (16 bits)
    #define CAL_AC5           0xB2  // R   Calibration data (16 bits)
    #define CAL_AC6           0xB4  // R   Calibration data (16 bits)
    #define CAL_B1            0xB6  // R   Calibration data (16 bits)
    #define CAL_B2            0xB8  // R   Calibration data (16 bits)
    #define CAL_MB            0xBA  // R   Calibration data (16 bits)
    #define CAL_MC            0xBC  // R   Calibration data (16 bits)
    #define CAL_MD            0xBE  // R   Calibration data (16 bits)
    #define CONTROL           0xF4  // W   Control register 
    #define CONTROL_OUTPUT    0xF6  // R   Output registers 0xF6=MSB, 0xF7=LSB, 0xF8=XLSB
    
    // unused registers
    #define SOFTRESET         0xE0
    #define VERSION           0xD1  // ML_VERSION  pos=0 len=4 msk=0F  AL_VERSION pos=4 len=4 msk=f0
    #define CHIPID            0xD0  // pos=0 mask=FF len=8
                                    // BMP085_CHIP_ID=0x55
    
    /************************************/
    /*    REGISTERS PARAMETERS          */
    /************************************/
    // BMP085 Modes
    #define MODE_ULTRA_LOW_POWER    0 //oversampling=0, internalsamples=1, maxconvtimepressure=4.5ms, avgcurrent=3uA, RMSnoise_hPA=0.06, RMSnoise_m=0.5
    #define MODE_STANDARD           1 //oversampling=1, internalsamples=2, maxconvtimepressure=7.5ms, avgcurrent=5uA, RMSnoise_hPA=0.05, RMSnoise_m=0.4
    #define MODE_HIGHRES            2 //oversampling=2, internalsamples=4, maxconvtimepressure=13.5ms, avgcurrent=7uA, RMSnoise_hPA=0.04, RMSnoise_m=0.3
    #define MODE_ULTRA_HIGHRES      3 //oversampling=3, internalsamples=8, maxconvtimepressure=25.5ms, avgcurrent=12uA, RMSnoise_hPA=0.03, RMSnoise_m=0.25
                      // "Sampling rate can be increased to 128 samples per second (standard mode) for
                      // dynamic measurement.In this case it is sufficient to measure temperature only 
                      // once per second and to use this value for all pressure measurements during period."
                      // (from BMP085 datasheet Rev1.2 page 10).
                      // To use dynamic measurement set AUTO_UPDATE_TEMPERATURE to false and
                      // call calcTrueTemperature() from your code. 
    // Control register
    #define READ_TEMPERATURE        0x2E 
    #define READ_PRESSURE           0x34 
    //Other
    #define MSLP                    101325          // Mean Sea Level Pressure = 1013.25 hPA (1hPa = 100Pa = 1mbar)
    
    
    
    class BMP085 {
    public:  
      BMP085();
      
      // BMP initialization
      void init();                                              // sets current elevation above ground level to 0 meters
      void init(byte _BMPMode, int32_t _initVal, bool _centimeters);   // sets a reference datum
                                                                // if _centimeters=false _initVal is Pa
      // Who Am I
      byte getDevAddr();
      
      // BMP mode
      byte getMode();
      void setMode(byte _BMPMode);                   // BMP085 mode
      // initialization
      void setLocalPressure(int32_t _Pa);            // set known barometric pressure as reference Ex. QNH
      void setLocalAbsAlt(int32_t _centimeters);     // set known altitude as reference
      void setAltOffset(int32_t _centimeters);       // altitude offset
      void sethPaOffset(int32_t _Pa);                // pressure offset
      void zeroCal(int32_t _Pa, int32_t _centimeters);// zero Calibrate output to a specific Pa/altitude
      // BMP Sensors
      void getPressure(int32_t *_Pa);                // pressure in Pa + offset
      void getAltitude(int32_t *_centimeters);       // altitude in centimeters + offset
      void getTemperature(int32_t *_Temperature);    // temperature in C؛
      void calcTrueTemperature();                    // calc temperature data b5 (only needed if AUTO_UPDATE_TEMPERATURE is false)
      void calcTruePressure(long *_TruePressure);    // calc Pressure in Pa
      // dummy stuff
       void dumpCalData();                           // debug only
    
      void writemem(uint8_t _addr, uint8_t _val);
      void readmem(uint8_t _addr, uint8_t _nbytes, uint8_t __buff[]);
      
      private:
    
      int ac1,ac2,ac3,b1,b2,mb,mc,md;               // cal data  
      unsigned int ac4,ac5,ac6;                     // cal data
      long b5, oldEMA;                                      // temperature data
    
      uint8_t _dev_address;
      byte _buff[BUFFER_SIZE];                      // buffer  MSB LSB XLSB
      int _oss;                                     // OverSamplingSetting
      int _pressure_waittime[4];                    // Max. Conversion Time Pressure is ms for each mode
    
      int32_t _cm_Offset, _Pa_Offset;
      int32_t _param_datum, _param_centimeters;
    
      void getCalData();
    
    
    };
    
    #endif
    با عرض سلام وادب ممنونم که به سوالم پاسخ دادید
    کلش این دستوراته دیگه حالا من میخوام فشار محیط رو بر حسب پاسکال بسنجم
    باید تو کد ویژن
    void getPressure(&p);
    این دستور رو بزنم دیگه تا فشار رو در متغیر
    p
    که تعریف کردم قرار بده درسته دیگه چون من تا به حال
    i2c

    سنگین کار نکردم
    با تشکز

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO