#著者: Paul Canaan 2016, Peter Dahlburg 2016
#
# Este módulo está tomado de la biblioteca Python BME280 de Adafruit. Traducido de
# El aviso de derechos de autor se reimprime a continuación.
#
#これらのライブラリはラズベリーパイ用に書かれました. Este cambio es
# Se dirige a placas MicroPython y esp8266.
#
# Derechos de autor (c) 2014 Industria de Adafruit
#著者: Tony DiCora
#
#によって提供されるBME280の変更を伴うBMP280ドライバーに基づく
#デビッドJテイラー, Edimburgo (www.satsignal.eu)
#
# Basado en Adafruit_I2C.py creado por Kevin Townsend.
#
#許可は otorga de forma gratuita a todos los que obtienen una copia
# de este software y archivos de documentación asociados (“Software”), dirección
#権利を含むがこれに限定されない con software sin límites
# Usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender
#ソフトウェアのコピー, y quién permite que el software sea
Amueblado para ello, #以下の条件に従って:
#
#上記の著作権表示とこの許可表示は,
#ソフトウェアのすべてのコピーまたは重要な部分.
#
#ソフトウェアは proporciona “tal cual” sin ningún tipo de garantía expresa o de ningún tipo.
#商品性の保証を含むがこれに限定されない黙示,
#特定の目的への適合性と非侵害. En ningún caso,
#著者または著作権者は, reclamación, daño u otro
#契約, responsabilidad, ya sea en agravio o cualquier otro acto, derivada de:
#ソフトウェアまたは使用またはその他の取引から o relacionados con
#ソフトウェア.
importación Hora
remitente Ustract importación descongelación, unpack_from
remitente arreglo importación arreglo
# Dirección predeterminada de BME280.
BME280_I2CADDR = 0x76
# Modo de operación
BME280_OSAMPLE_1 = 1
BME280_OSAMPLE_2 = 2
BME280_OSAMPLE_4 = 3
BME280_OSAMPLE_8 = 4
BME280_OSAMPLE_16 = 5
BME280_REGISTER_CONTROL_HUM = 0xF2
BME280_REGISTER_CONTROL = 0xF4
…class BME280:
Def __Init__(propio,
modo=BME280_OSAMPLE_1,
dirección=BME280_I2CADDR,
I2C=ninguno,
**Kwags):
# Asegúrese de que el modo esté habilitado.
Si modo No Y [BME280_OSAMPLE_1, BME280_OSAMPLE_2, BME280_OSAMPLE_4,
BME280_OSAMPLE_8, BME280_OSAMPLE_16]:
levantar Error de valor(
‘Valor de modo inesperado{0}. Establezca el modo en ‘
«BME280_ULTRALOWPOWER, BME280_STANDARD, BME280_HIGHRES o »
「BME280_ULTRAHIGHRES」.formato(modo))
propio._modo = modo
propio.dirección = dirección
Si I2C son ninguno:
levantar Error de valor(“Se requiere un objeto I2C”)
propio.I2C = I2C
# Carga de datos de calibración
dig_88_a1 = propio.I2C.readfrom_mem(propio.dirección, 0x88, 26)
dig_e1_e7 = propio.I2C.readfrom_mem(propio.dirección, 0xE1, 7)
propio.dig_T1, propio.dig_T2, propio.dig_T3, propio.dig_P1, \
propio.dig_P2, propio.dig_P3, propio.dig_P4, propio.dig_P5, \
propio.dig_P6, propio.dig_P7, propio.dig_P8, propio.dig_P9, \
_, propio.dig_H1 = descongelación(“<, dig_88_a1)
propio.dig_H2, propio.dig_H3 = descongelación(“<hB”, dig_e1_e7)
e4_sign = unpack_from(“<b”, dig_e1_e7, 3)[0]
propio.dig_H4 = (e4_sign << 4) | (dig_e1_e7[4] & 0xF)
e6_sign = unpack_from(“<b”, dig_e1_e7, 5)[0]
propio.dig_H5 = (e6_sign << 4) | (dig_e1_e7[4] >> 4)
propio.dig_H6 = unpack_from(“<b”, dig_e1_e7, 6)[0]
propio.I2C.writeto_mem(propio.dirección, BME280_REGISTER_CONTROL,
Matriz de bytes([0x3F]))
propio.t_fine = 0
# Titulares temporales de datos que permanecen asignados
propio._l1_barray = Matriz de bytes(1)
propio._l8_barray = Matriz de bytes(8)
propio._l3_resultarray = arreglo(“Lo soy”., [0, 0, 0])
Def read_raw_data(propio, resultado):
“”Lea datos sin procesar (no compensados) del sensor.
Argumento:
Resultado: una matriz de longitud 3 o similar al resultado tiene este aspecto
Almacenar en el orden de temperatura, presión y humedad
Ingresos:
ninguno
““”
propio._l1_barray[0] = propio._modo
propio.I2C.writeto_mem(propio.dirección, BME280_REGISTER_CONTROL_HUM,
propio._l1_barray)
propio._l1_barray[0] = propio._modo << 5 | propio._modo << 2 | 1
propio.I2C.writeto_mem(propio.dirección, BME280_REGISTER_CONTROL,
propio._l1_barray)
sleep_time = 1250 + 2300 * (1 << propio._modo)
sleep_time = sleep_time + 2300 * (1 << propio._modo) + 575
sleep_time = sleep_time + 2300 * (1 << propio._modo) + 575
Hora.sleep_us(sleep_time) # Espere la cantidad de tiempo requerida
# Lectura de ráfaga recomendada de la hoja de datos de 0xF7 a 0xFE
propio.I2C.readfrom_mem_into(propio.dirección, 0xF7, propio._l8_barray)
Lectura = propio._l8_barray
# Presión (0xF7): ((MSB << 16) |( LSB << 8) |XLSB) >> 4
raw_press = ((Lectura[0] << 16) | (Lectura[1] << 8) | Lectura[2]) >> 4
# Temperatura (0xFA): ((MSB << 16) |( LSB << 8) |XLSB) >> 4
raw_temp = ((Lectura[3] << 16) | (Lectura[4] << 8) | Lectura[5]) >> 4
# Humedad (0xFD): (MSB << 8) |
raw_hum = (Lectura[6] << 8) | Lectura[7]
resultado[0] = raw_temp
resultado[1] = raw_press
resultado[2] = raw_hum
Def read_compensated_data(propio, resultado=ninguno):
“”Lee los datos del sensor y devuelve los datos corregidos.
Argumento:
Resultado: una matriz de longitud 3 o similar al resultado tiene este aspecto
Almacenar d, en el orden de temperatura, presión y humedad. Puedes usar
Esto es para leer el sensor sin asignar memoria de montón
Ingresos:
Matriz de temperatura, presión y humedad. será de
Si el parámetro de resultado (ninguno)
““”
propio.read_raw_data(propio._l3_resultarray)
raw_temp, raw_press, raw_hum = propio._l3_resultarray
# Temperatura
var1 = ((raw_temp >> 3) – (propio.dig_T1 << 1)) * (propio.dig_T2 >> 11)
var2 = (((((raw_temp >> 4) – propio.dig_T1) *
((raw_temp >> 4) – propio.dig_T1)) >> 12) * propio.dig_T3) >> 14
propio.t_fine = var1 + var2
una vez = (propio.t_fine * 5 + 128) >> 8
# Presión
var1 = propio.t_fine – 128000
var2 = var1 * var1 * propio.dig_P6
var2 = var2 + ((var1 * propio.dig_P5) << 17)
var2 = var2 + (propio.dig_P4 << 35)
var1 = (((var1 * var1 * propio.dig_P3) >> 8) +
((var1 * propio.dig_P2) << 12))
var1 = (((1 << 47) + var1) * propio.dig_P1) >> 33
Si var1 == 0:
presión = 0
de otra manera:
p = 1048576 – raw_press
p = (((p << 31) – var2) * 3125) var1
var1 = (propio.dig_P9 * (p >> 13) * (p >> 13)) >> 25
var2 = (propio.dig_P8 * p) >> 19
presión = ((p + var1 + var2) >> 8) + (propio.dig_P7 << 4)
# Humedad
h = propio.t_fine – 76800
h = (((((raw_hum << 14) – (propio.dig_H4 << 20) –
(propio.dig_H5 * h)) + 16384)
>> 15) * (((((((h * propio.dig_H6) >> 10) *
(((h * propio.dig_H3) >> 11) + 32768)) >> 10) +
2097152) * propio.dig_H2 + 8192) >> 14))
h = h – (((((h >> 15) * (h >> 15)) >> 7) * propio.dig_H1) >> 4)
h = 0 Si h < 0 de otra manera h
h = 419430400 Si h > 419430400 de otra manera h
humedad = h >> 12
Si resultado:
resultado[0] = una vez
resultado[1] = presión
resultado[2] = humedad
devolución resultado
devolución arreglo(“Lo soy”., (una vez, presión, humedad))
@propiedad
Def valores(propio):
“”” Valor legible por humanos ““”
t, p, h = propio.read_compensated_data()
p = p 256
pi = p 100
Teletipo = p – Pi* 100
Hola = h 1024
disco duro = h * 100 1024 – Hola*100
devolución (“{}C”.formato(t / 100), “{}. {:02d}hPa”.formato(pi, Teletipo),
“{}. {:02d}%”.formato(Hola, disco duro))