اطلاعیه

Collapse
No announcement yet.

سنسور فشار هوای محیط BMP085 بیسیک

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

    سنسور فشار هوای محیط BMP085 بیسیک

    با سلام
    2 تا سنسور فشار BMP085 گرفتم با این دیتا شیت
    http://www.jahankitshop.com/Market/d5130.aspx
    میخوام هر یک در محیط جدا باشند و فشار نسبت به هم اندازه گیری بشه
    این سنسور از پروتکل i2c استفاده میشه
    مشکل اینه زیاد کار نکردم و سورسی که دارم برای یک سنسوره اگه بخوام 2 تاش روی خط قرار بگیرند کد دهی آنها به چه صورته
    اگه دوستان میتونن سورس برنامه رو اصلاح کنن تا خروجی برای 2 تا سنسور نمایش داده بشه
    اینم سورس برای یکیش
    کد:
    '--------------------------------------------------------------------------------
    
    '--------------------------------------------------------------------------------
    
    $regfile = "m8def.dat"
    $crystal = 1000000
    $baud = 1200
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    
    Config Scl = Portc.5
    Config Sda = Portc.4
    
    Dim Ac1 As Integer
    Dim Ac1a As Long
    Dim Ac2 As Integer
    Dim Ac3 As Integer
    Dim Ac4 As Word
    Dim Ac5 As Word
    Dim Ac5a As Single
    Dim Ac6 As Word
    Dim B1 As Integer
    Dim B2 As Integer
    Dim B3 As Long
    Dim B3a As Long
    Dim B4 As Long
    Dim B5 As Long
    Dim B6 As Integer
    Dim B6a As Long
    Dim B7 As Long
    Dim Mb As Integer
    Dim Mc As Integer
    Dim Mc2 As Long
    Dim Md As Integer
    Dim Adres As Byte
    Dim Wert As Byte
    Dim Ut As Long
    Dim X1 As Long
    Dim X1t As Single
    Dim X2 As Long
    Dim X3 As Long
    Dim T As Single
    Dim T2 As Long
    Dim Temperatur As String * 6
    Dim Luftdruck As String * 8
    Dim Druck As Single
    
    Dim P As Long
    Dim P2 As Long
    Dim 2potenz15 As Long
    Dim 2potenz11 As Integer
    Dim 2potenz13 As Integer
    Dim 2potenz8 As Integer
    Dim 2potenz4 As Integer
    Dim 2potenz2 As Integer
    Dim 2potenz16 As Long
    Dim 2potenz12 As Integer
    Dim Potenz5255 As Single
    Dim Altitude As Single
    Dim Altitudes As String * 8
    Dim Msb As Long
    Dim Lsb As Long
    Dim Up As Long
    Dim Druckvar As Byte
    Declare Sub Berechne_temp
    Declare Sub Berechne_druck
    Declare Sub Schreibe_bmp085(byval Adres As Byte , Byval Wert As Byte)
    Declare Sub Lese_bmp085(byval Adres As Byte , Wert As Byte)
    Declare Sub Lese_roh_daten
    Declare Sub Messen
    Declare Sub Lese_kalib_data
    
    Const Addr_schreiben = &B11101110
    Const Addr_lesen = &B11101111
    
    
    Call Lese_kalib_data
    
    Do
    
    Call Messen
    T = T / 10
    Temperatur = Fusing(t , "###.##")
    Potenz5255 = 1 / 5.255
    Altitude = P / 101325
    Altitude = Altitude ^ Potenz5255
    Altitude = 1 - Altitude
    Altitude = Altitude * 44330
    Druck = P
    Druck = Druck / 100
    Luftdruck = Fusing(druck , "####.##")
    Altitudes = Fusing(altitude , "#####.##")
    
    
    Print "Temp " ; Temperatur ; " C," ; " Pressure " ; Luftdruck ; " Pa," ; " Altitude " ; Altitudes ; " m."
    
    Wait 1
    
    Loop
    
    
    
    
    
    Sub Messen
    
    Call Schreibe_bmp085(&Hf4 , &H2E)
    Adres = &HF6
    Call Lese_roh_daten
    'Print "msb " ; Msb
    'Print "lsb " ; Lsb
    Shift Msb , Left , 8
    'Print "msb shift " ; Msb
    Ut = Msb + Lsb
    Call Berechne_temp
    
    
    
    Call Schreibe_bmp085(&Hf4 , &H74 )
    Adres = &HF6
    Call Lese_roh_daten
    Shift Msb , Left , 16
    Shift Lsb , Left , 8
    Up = Msb + Lsb
    Shift Up , Right , 6
    'Print "msb " ; Msb ; "lsb " ; Lsb ; "up " ; Up
    Call Berechne_druck
    End Sub
    
    
    Sub Berechne_temp
    'X1
    Ut = Ut - Ac6
    2potenz15 = 2 ^ 15
    Ac5a = Ac5 / 2potenz15
    X1t = Ut * Ac5a
    'Print "X1 " ; X1t
    
    'X2
    2potenz11 = 2 ^ 11
    Mc2 = Mc * 2potenz11
    X3 = X1t + Md
    X2 = Mc2 / X3
    'Print "X2 " ; X2
    'B5
    
    B5 = X1t + X2
    'Print "B5 " ; B5
    'T
    2potenz4 = 2 ^ 4
    T2 = B5 + 8
    T = T2 / 2potenz4
    
    
    
    End Sub
    
    
    Sub Berechne_druck
    'B6
    B6 = B5 - 4000
    'X1
    2potenz12 = 2 ^ 12
    B6a = B6 * B6
    B6a = B6a / 2potenz12
    X1 = B2 * B6a
    X1 = X1 / 2potenz11
    'X2
    X2 = Ac2 * B6
    X2 = X2 / 2potenz11
    'X3
    X3 = X1 + X2
    'B3
    Ac1a = Ac1 * 4
    Ac1a = Ac1a + X3
    Shift Ac1a , Left , 2
    Ac1a = Ac1a + 2
    B3 = Ac1a / 4
    'X1 die zweite
    2potenz13 = 2 ^ 13
    B6a = B6 / 2potenz13
    X1 = Ac3 * B6a
    'X2 die zweite
    B6a = B6 * B6
    B6a = B6a / 2potenz12
    X2 = B1 * B6a
    2potenz16 = 2 ^ 16
    X2 = X2 / 2potenz16
    'X3 die zweite
    X3 = X1 + X2
    X3 = X3 + 2
    2potenz2 = 2 ^ 2
    X3 = X3 / 2potenz2
    'B4
    B4 = X3 + 32768
    B4 = B4 * Ac4
    B4 = B4 / 2potenz15
    If B4 <= 0 Then B4 = B4 * -1
    
    'Print B4
    'B7
    B7 = Up - B3
    B3a = 50000
    Shift B3a , Right , 2                    '
    B7 = B7 * B3a
    If B7 <= 0 Then B7 = B7 * -1
    
    'Print B7
    If B7 < &H80000000 Then
    P = B7 * 2
    'Print "p1 " ; P
    P = P / B4
    'Print "p1 " ; P
    Else
    P = B7 / B4
    'Print "p2 " ; P
    P = P * 2
    'Print "p2 " ; P
    End If
    
    'Print P
    'nochmal X1
    2potenz8 = 2 ^ 8
    P2 = P / 2potenz8
    X1 = P2 * P2
    'Print X1
    
    X1 = X1 * 3038
    X1 = X1 / 2potenz16
    'Print X1
    
    ' nochmal X2
    X2 = -7357 * P
    X2 = X2 / 2potenz16
    
    'Print X2
    P2 = P
    P = X2 + 3791
    P = P + X1
    P = P / 2potenz4
    P = P + P2
    
    End Sub
    
    
    Sub Lese_kalib_data
    Adres = &HAA
    'Ac1 lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    Ac1 = Msb + Lsb
    
    Adres = Adres + 1
    'Ac2 lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    Ac2 = Msb + Lsb
    
    Adres = Adres + 1
    'Ac3 lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    Ac3 = Msb + Lsb
    
    Adres = Adres + 1
    'Ac4 lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    Ac4 = Msb + Lsb
    
    Adres = Adres + 1
    'Ac5 lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    Ac5 = Msb + Lsb
    
    Adres = Adres + 1
    'Ac6 lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    Ac6 = Msb + Lsb
    
    Adres = Adres + 1
    'B1 lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    B1 = Msb + Lsb
    
    Adres = Adres + 1
    'B2 lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    B2 = Msb + Lsb
    
    Adres = Adres + 1
    'MB lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    Mb = Msb + Lsb
    
    Adres = Adres + 1
    'MB lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    Mc = Msb + Lsb
    
    Adres = Adres + 1
    'Md lesen
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    Shift Msb , Left , 8
    Md = Msb + Lsb
    
    Adres = Adres + 1
    End Sub
    
    
    
    
    Sub Lese_roh_daten
    Call Lese_bmp085(adres , Wert)
    Msb = Wert
    Adres = Adres + 1
    Call Lese_bmp085(adres , Wert)
    Lsb = Wert
    End Sub
    
    Sub Schreibe_bmp085(byval Adres As Byte , Byval Wert As Byte)
    I2cstart
    I2cwbyte Addr_schreiben
    I2cwbyte Adres
    I2cwbyte Wert
    I2cstop
    Waitms 10
    End Sub
    
    
    Sub Lese_bmp085(byval Adres As Byte , Wert As Byte)
    I2cstart
    I2cwbyte Addr_schreiben
    I2cwbyte Adres
    I2cstart
    I2cwbyte Addr_lesen
    I2crbyte Wert , Nack
    I2cstop
    Waitms 10
    End Sub
    خدایا مرا آن ده که آن به

    #2
    پاسخ : سنسور فشار هوای محیط BMP085 بیسیک

    با سلام،

    توی صفحات 16 و 19 دیتاشیت نوشته که این سنسور یه پایه به نام ( XCLR ( master clear داره که مثل Chip-Select عمل میکنه و اگر یک بشه، چیپ به حالت Silent میره! پس با استفاده از این پین، میتونید تعداد زیادی از این سنسور رو روی یک خط I2C قرار بدید ....

    البته من تا حالا از این سنسور نداشتم و باهاش کار نکردم! شما این سنسور رو چند و از کجا خریدی اخوی؟ )

    پی نوشت :
    راستش من بیسک کار نکردم و بلد نیستم، ولی کد رو یه نگاهی کردم.
    روتین Schreibe_bmp085 برای نوشتن و روتین Lese_bmp085 هم برای خوندن از چیپ ( I2C ) هستند.
    فقط کافیه که شما در برنامه، برای هر چیپ یک پایه CS بصورت خروجی تعریف کنید و به این دو روتین یک متغیر دیگه اضافه کنید که مشخص کننده چیپ مورد نظر باشه و در ابتدای این روتین ها، این متغییر رو چک کرده و اول از هر کاری CS چیپ مورد نظر رو صفر و سایر CS ها رو یک کنید و ادامه ماجرا مطابق همین چیزی که هست!

    مثلا اینطوری :

    کد PHP:
    Sub Schreibe_bmp085(byval Adres As Byte Byval Wert As ByteByval XCLR As Byte)

    &
    #039;----- select correct bm085 here!

    I2cstart
    I2cwbyte Addr_schreiben
    I2cwbyte Adres
    I2cwbyte Wert
    I2cstop
    Waitms 10
    End Sub


    Sub Lese_bmp085
    (byval Adres As Byte Wert As ByteByval XCLR As Byte)

    &
    #039;----- select correct bm085 here!

    I2cstart
    I2cwbyte Addr_schreiben
    I2cwbyte Adres
    I2cstart
    I2cwbyte Addr_lesen
    I2crbyte Wert 
    Nack
    I2cstop
    Waitms 10
    End Sub 

    مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

    Sh_Nourbakhsh@Yahoo.com

    http://s2.picofile.com/file/7170362468/_Wall_e_.jp

    دیدگاه


      #3
      پاسخ : سنسور فشار هوای محیط BMP085 بیسیک

      سلام
      تونستی به نتیجه ای برسی ؟

      دیدگاه


        #4
        پاسخ : سنسور فشار هوای محیط BMP085 بیسیک

        سلام
        تونستی به نتیجه ای برسی ؟

        دیدگاه

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