LPS331AP na Raspberry pi w Python'ie, czyli temperatura i ciśnienie na malinie


Pomiar temperatury i ciśnienia z zastosowaniem Raspberry Pi? Można to wykonać wykorzystując czujnik LPS331AP.



Na powyższym zdjęciu można zobaczyć jak wygląda i jak mały jest LPS331AP. Jego dokumentację można pobrać tutaj.

Podłączenie do pinów VDD, GND, SDA i SCL, oraz odpowiadającym im pinom w malinie.

W poniższej tabeli zamieszczony jest mapa rejestrów czujnika, która dostępna jest w dokumentacji.



Można zauważyć że ciśnienie jest zawarte w trzech rejestrach o adresach 0x28, 0x29, 0x2A. Temperatura jest zawarta w dwóch bajtach 0x2B i 0x2C. Dodatkowo ważnym jest CTRL_REG1 i CTRL_REG2, które odpowidają za włączenie czujnika do pracy i odświeżanie zawartości rejestrów. Bardziej szczegółowy opis zawiera dokumentacja udostępniona powyżej. Poniżej kod programu w Pythonie do odczytu wartości zarejestrowanych czujnikiem.

import smbus	# importujemy biblioteki
import time

bus = smbus.SMBus(1) # odpalamy smbus
i=0

for i in range(30): # pętla 30 powtórzeń
    bus.write_byte_data(0x5d, 0x20, 0b10000000) # odpalamy czujnik
    bus.write_byte_data(0x5d, 0x21, 0b1)		# aktualizujemy zawartość rejestrów
    print'who am I ',bus.read_byte_data(0x5d,0x0F)    # wydruk zawartości rejestru "who I am"
    Temp_LSB = bus.read_byte_data(0x5d, 0x2b) # odczyt temperatury w dwóch kolejnych rejestrach
    Temp_MSB = bus.read_byte_data(0x5d, 0x2c)
        
    count = (Temp_MSB << 8) + Temp_LSB # zapisanie 16 bitowej wartości do jednej zmiennej
    if (count >= 0x8000): 		# najstarszy bit oznacza czy wartość jest + czy -
        count1 = -((65535-count) + 1)
    else:
        count1 = count
		
    Temp = 42.5 + (count1/480.0) # przeliczenie wartości zgodnie z dokumentacją
    #print"Temperatura = ",Temp

    ph=bus.read_byte_data(0x5d, 0x2a) # odczyt ciśnienia w trzech kolejnych rejestrach
    pl = bus.read_byte_data(0x5d, 0x29)
    pxl=bus.read_byte_data(0x5d, 0x28)
    print'PressOut_XL = ',pxl
    cis=float((((ph<<8)+pl)<<8)+pxl)/4096 # przeliczenie wartości ciśnienia zgodnie z dokumentacją
    print "cisnienie = ",cis
    time.sleep(0.5)

	
Mam nadzieję, że powyższe się przyda. :)

Pozdrawiam. :)

:)