Raspberry Pi leest BMP085 temperatuur en druk
Nog een leuk klein i2c-apparaat dat je goedkoop via eBay hebt gekocht. Het leest barometrische druk en temperatuur. Er is wat relatief eenvoudige wiskunde om de uitvoer om te zetten in iets leesbaars.
Nogmaals, ADAFruit biedt een fantastische gids en bibliotheek voor het gebruik van het apparaat in hun Gebruik van de BMP085 met Raspberry Pi. Net als in eerdere berichten had ik de ADAFruit-bibliotheek gewoon uit de doos kunnen gebruiken. Hoewel ik niet de behoefte heb om het wiel opnieuw uit te vinden en helemaal opnieuw te coderen, wil ik wel graag weten hoe het werkt.
Ik heb de informatie uit een aantal andere bronnen gehaald:
- Maarten Damen's Bus Pirate leest de BMP085-temperatuur (site is niet beschikbaar op het moment van schrijven)
- Python-poort van John Burn's C-code bij het lezen van gegevens van een Bosch BMP085 met een Raspberry Pi.
Hieronder staat het zeer eenvoudige schema om het apparaat op de Pi aan te sluiten.
importeren
smbus
importeren
tijd
klasse
BMP085():
OSS
=
3
def
__init__(
zelf
, i2c, adres):
zelf
.i2c
=
i2c
zelf
.adres
=
adres
zelf
.ac1
=
zelf
.readSignedWord(
0xaa
)
zelf
.ac2
=
zelf
.readSignedWord(
0xac
)
zelf
.ac3
=
zelf
.readSignedWord(
0xae
)
zelf
.ac4
=
zelf
.readWord(
0xb0
)
zelf
.ac5
=
zelf
.readWord(
0xb2
)
zelf
.ac6
=
zelf
.readWord(
0xb4
)
zelf
.b1
=
zelf
.readSignedWord(
0xb6
)
zelf
.b2
=
zelf
.readSignedWord(
0xb8
)
zelf
.mb
=
zelf
.readSignedWord(
0xba
)
zelf
.mc
=
zelf
.readSignedWord(
0xbc
)
zelf
.md
=
zelf
.readSignedWord(
0xbe
)
def
readWord(
zelf
, reg):
msb
=
zelf
.i2c.read_byte_data(
zelf
.adres, reg)
lsb
=
zelf
.i2c.read_byte_data(
zelf
.adres, reg
+
1
)
waarde
=
(msb <<
8
)
+
lsb
retour
waarde
def
readSignedWord(
zelf
, reg): msb
=
zelf
.i2c.read_byte_data(
zelf
.address, reg) lsb
=
zelf
.i2c.read_byte_data(
zelf
.adres, reg
+
1
)
if
(msb>
127
):
msb
=
msb
-
256
waarde
=
(msb <<
8
)
+
lsb
retour
waarde
def
readUT(
zelf
):
zelf
.i2c.write_byte_data(
zelf
.adres,
0xf4
,
0x2e
) time.sleep(
0,0045
) ut
=
zelf
.readWord(
0xf6
)
retour
ut
def
readTemperature(
zelf
): ut
=
zelf
.readUT() x1
=
((ut
-
zelf
.ac6)
*
zelf
.ac5)>>
15
x2
=
(
zelf
.mc <<
11
)
/
(x1
+
zelf
.md)
zelf
.b5
=
x1
+
x2
retour
((
zelf
.b5
+
8
)>>
4
)
/
10.0
def
readUP(
zelf
):
zelf
.i2c.write_byte_data(
zelf
.adres,
0xf4
,
0x34
+
(
zelf
.OSS <<
6
))
vertraging
=
(
2
+
(
3
<<
zelf
.OSS))
/
1000,0
time.sleep(delay)
msb
=
zelf
.i2c.read_byte_data(
zelf
.adres,
0xf6
)
lsb
=
zelf
.i2c.read_byte_data(
zelf
.adres,
0xf7
)
xlsb
=
zelf
.i2c.read_byte_data(
zelf
.adres,
0xf8
)
omhoog
=
(msb <<
16
)
+
(lsb <<
8
)
+
xlsb omhoog
=
omhoog>> (
8
-
zelf
.OSS)
retour
omhoog
def
readPressure(
zelf
):
omhoog
=
zelf
.readUP()
b6
=
zelf
.b5
-
4000
x1
=
(
zelf
.b2
*
(b6
*
b6)>>
12
)>>
11
x2
=
(
zelf
.ac2
*
b6)>>
11
x3
=
x1
+
x2
b3
=
(((
zelf
.ac1
*
4
+
x3)<>
2
x1
=
(
zelf
.ac3
*
b6)>>
13
x2
=
(
zelf
.b1
*
((b6
*
b6)>>
12
))>>
16
x3
=
((x1
+
x2)
+
2
)>>
2
b4
=
(
zelf
.ac4
*
(x3
+
32768
))>>
15
b7
=
(omhoog
-
b3)
*
(
50000
>>
zelf
.OSS)
if
(b7 <
0x80000000
):
p
=
(b7<
1
)
/
b4
anders
:
p
=
(b7
/
b4)<>
8
)
*
(p>
>
8
)
x1
=
(x1
*
3038
)>>
16
x2
=
(
-
7357
*
p)>>
16
p
+
=
(x1
+
x2
+
3791
)>>
4
retour
p
i2c
=
smbus.SMBus(
0
)
bmp085
=
BMP085(i2c,
0x77
)
t
=
bmp085.readTemperature()
p
=
bmp085.readPressure()
afdrukken
"Temperatuur:%.2f C"
%
t
afdrukken
"Druk: %.2f hPa"
%
(p
/
100
)
Voor meer details:Raspberry Pi leest BMP085 Temperatuur &Druk Productieproces
- Raspberry Pi Temperature Logger
- Raspberry Pi-temperatuurprofiel met LabVIEW
- Meet temperaturen met een 1-draads DS18B20-sensor en Raspberry Pi
- Raspberry Pi temperatuur- en vochtigheidsnetwerkmonitor
- Temperatuur aflezen met DS18B20 | Raspberry Pi 2
- Temperatuurbewaking op de Raspberry Pi
- Temperatuur meten met RASPBERRY PI
- TMP006 Temperature Sensor Python Library met Raspberry pi,
- Python- en Raspberry Pi-temperatuursensor
- Eenvoudige temperatuur en vochtigheid op Raspberry Pi
- Temperatuur bewaken met Raspberry Pi