Raspberry Pi, считывающий температуру и давление BMP085
Еще одно забавное маленькое устройство i2c, которое можно недорого приобрести на eBay. Он считывает атмосферное давление и температуру. Есть несколько относительно простых математических вычислений, позволяющих преобразовать выходные данные во что-то читаемое.
Еще раз, ADAFruit предоставляет фантастическое руководство и библиотеку для использования устройства в их Использование BMP085 с Raspberry Pi. Как и в предыдущих сообщениях, я мог просто использовать библиотеку ADAFruit из коробки. Хотя я не чувствую необходимости изобретать колесо и перекодировать его с нуля, мне все же хотелось бы понять, как оно работает.
Я взял информацию из нескольких других источников:
- Автобусный пират Маартена Дамена, считывающий температуру BMP085 (сайт недоступен на момент написания этой статьи).
- Порт Python кода C Джона Берна при чтении данных с Bosch BMP085 с помощью Raspberry Pi.
Ниже представлена очень простая схема подключения устройства к Pi.
импорт
smbus
импорт
время
класс
BMP085 ():
OSS
=
3
def
__ init __ (
сам
, i2c, адрес):
сам
. i2c
=
i2c
сам
. адрес
=
адрес
сам
. ac1
=
сам
. readSignedWord (
0xaa
)
сам
. ac2
=
сам
. readSignedWord (
0xac
)
сам
. ac3
=
сам
. readSignedWord (
0xae
)
сам
. ac4
=
сам
. readWord (
0xb0
)
сам
. ac5
=
сам
. readWord (
0xb2
)
сам
. ac6
=
сам
. readWord (
0xb4
)
сам
. b1
=
сам
. readSignedWord (
0xb6
)
сам
. b2
=
сам
. readSignedWord (
0xb8
)
сам
. mb
=
сам
. readSignedWord (
0xba
)
сам
. mc
=
сам
. readSignedWord (
0xbc
)
сам
. md
=
сам
. readSignedWord (
0xbe
)
def
readWord (
сам
, reg):
msb
=
сам
. i2c.read_byte_data (
сам
. адрес, рег)
lsb
=
сам
. i2c.read_byte_data (
сам
. адрес, регистр
+
1
)
значение
=
(msb <<
8
)
+
lsb
возврат
значение
def
readSignedWord (
сам
, reg):msb
=
сам
. i2c.read_byte_data (
сам
. адрес, reg) lsb
=
сам
. i2c.read_byte_data (
сам
. адрес, регистр
+
1
)
если
(msb>
127
):
msb
=
msb
-
256
значение
=
(msb <<
8
)
+
lsb
возврат
значение
def
readUT (
сам
):
сам
. i2c.write_byte_data (
сам
. адрес,
0xf4
,
0x2e
) time.sleep (
0,0045
) ut
=
сам
. readWord (
0xf6
)
возврат
ut
def
readTemperature (
сам
):ut
=
сам
. readUT () x1
=
((ut
-
сам
. ac6)
*
сам
. ac5)>>
15
x2
=
(
сам
. mc <<
11
)
/
(x1
+
сам
. md)
сам
. b5
=
x1
+
x2
возврат
((
сам
. b5
+
8
)>>
4
)
/
10.0
def
readUP (
сам
):
сам
. i2c.write_byte_data (
сам
. адрес,
0xf4
,
0x34
+
(
сам
. OSS <<
6
))
задержка
=
(
2
+
(
3
<<
сам
. OSS))
/
1000.0
time.sleep (задержка)
msb
=
сам
. i2c.read_byte_data (
сам
. адрес,
0xf6
)
lsb
=
сам
. i2c.read_byte_data (
сам
. адрес,
0xf7
)
xlsb
=
сам
. i2c.read_byte_data (
сам
. адрес,
0xf8
)
вверх
=
(msb <<
16
)
+
(lsb <<
8
)
+
xlsb вверх
=
вверх>> (
8
-
сам
. OSS)
возврат
вверх
def
readPressure (
сам
):
вверх
=
сам
. readUP ()
b6
=
сам
. b5
-
4000
x1
=
(
сам
. b2
*
(b6
*
b6)>>
12
)>>
11
x2
=
(
сам
. ac2
*
b6)>>
11
x3
=
x1
+
x2
b3
=
(((
сам
. ac1
*
4
+
x3) <>
2
x1
=
(
сам
. ac3
*
b6)>>
13
x2
=
(
сам
. b1
*
((b6
*
b6)>>
12
))>>
16
x3
=
((x1
+
x2)
+
2
)>>
2
b4
=
(
сам
. ac4
*
(x3
+
32768
))>>
15
b7
=
(вверх
-
b3)
*
(
50000
>>
сам
. OSS)
если
(b7 <
0x80000000
):
p
=
(b7 <<
1
)
/
b4
else
:
p
=
(b7
/
b4) <>
8
)
*
(p>
>
8
)
x1
=
(x1
*
3038
)>>
16
x2
=
(
-
7357
*
p)>>
16
p
+
=
(x1
+
x2
+
3791
)>>
4
возврат
p
i2c
=
smbus.SMBus (
0
)
bmp085
=
BMP085 (i2c,
0x77
)
t
=
bmp085.readTemperature ()
p
=
bmp085.readPressure ()
печать
"Температура:% .2f C"
%
t
печать
"Давление:% .2f гПа"
%
(p
/
100
)
Для более подробной информации:Raspberry Pi чтение BMP085 Температура и давление Производственный процесс
- Регистратор температуры Raspberry Pi
- Температурный профиль Raspberry Pi с использованием LabVIEW
- Измерение температуры с помощью однопроводного датчика DS18B20 и Raspberry Pi
- Сетевой монитор температуры и влажности Raspberry Pi
- Считать температуру с помощью DS18B20 | Raspberry Pi 2
- Мониторинг температуры на Raspberry Pi
- Измерение температуры с помощью RASPBERRY PI
- Библиотека Python датчика температуры TMP006 с использованием Raspberry pi,
- Датчик температуры Python и Raspberry Pi
- Простая температура и влажность на Raspberry Pi