importación arreglo
importación Micropitón
importación Youtime
remitente máquina importación anclar
remitente Micropitón importación constante
…class Suma de comprobación no válida(excepción):
pasar
…class Recuento de pulsos no válido(excepción):
pasar
MAX_UNCHANGED = constante(100)
MIN_INTERVAL_US = constante(200000)
HIGH_LEVEL = constante(50)
EXPECTED_PULSES = constante(84)
…class DHT11:
_temperatura: flotar
_humedad: flotar
Def __Init__(propio, anclar):
propio._anclar = anclar
propio._last_measure = Youtime.ticks_us()
propio._temperatura = –1
propio._humedad = –1
Def medir(propio):
current_ticks = Youtime.ticks_us()
Si Youtime.ticks_diff(current_ticks, propio._last_measure) < MIN_INTERVAL_US Y (
propio._temperatura > –1 o propio._humedad > –1
):
#最後の読み取りから1秒未満, esto es demasiado pronto
# Ir a la hoja de datos
devolución
propio._send_init_signal()
pulso = propio._capture_pulses()
búfer = propio._convert_pulses_to_buffer(pulso)
propio._verify_checksum(búfer)
propio._humedad = búfer[0] + búfer[1] / 10
propio._temperatura = búfer[2] + búfer[3] / 10
propio._last_measure = Youtime.ticks_us()
@propiedad
Def humedad(propio):
propio.medir()
devolución propio._humedad
@propiedad
Def temperatura(propio):
propio.medir()
ret甕 propio._temperatura
Def _send_init_signal(propio):
propio._anclar.inicialización(anclar.fuera, anclar.PULL_DOWN)
propio._anclar.valor(1)
Youtime.sleep_ms(50)
propio._anclar.valor(0)
Youtime.sleep_ms(18)
@Micropitón.nativo
Def _capture_pulses(propio):
anclar = propio._anclar
anclar.inicialización(anclar.Y, anclar.PULL_UP)
Val = 1
Teletipo = 0
transición = Matriz de bytes(EXPECTED_PULSES)
cambio = 0
Timestamp = Youtime.ticks_us()
mientras cambio < MAX_UNCHANGED:
Si Val != anclar.valor():
Si Teletipo >= EXPECTED_PULSES:
levantar Recuento de pulsos no válido(
“Adquirido más de {} pulsos”.formato(EXPECTED_PULSES)
)
Ahora = Youtime.ticks_us()
transición[idx] = Ahora – Timestamp
Timestamp = Ahora
Teletipo += 1
Val = 1 – Val
cambio = 0
de otra manera:
cambio += 1
anclar.inicialización(anclar.fuera, anclar.PULL_DOWN)
Si Teletipo != EXPECTED_PULSES:
levantar Recuento de pulsos no válido(
“Estaba esperando {}, pero tuve un pulso {}”.formato(EXPECTED_PULSES, Teletipo)
)
devolución transición[4:]
Def _convert_pulses_to_buffer(propio, pulso):
“”“Convierte una lista de 80 pulsos en un búfer de 5 bytes
Los 5 bytes resultantes en el búfer se ven así:
0: Datos integrales de humedad relativa
1: Datos de humedad relativa decimal
2: Datos de temperatura integrales
3: Temperatura decimal D Ata
4: Suma de comprobación
““”
# Convertir pulsos a 40 bits
binario = 0
para Teletipo Y gama(0, Len(pulso), 2):
binario = binario << 1 | entero(pulso[idx] > HIGH_LEVEL)
# Dividido en 5 bytes
búfer = arreglo.arreglo(“B”)
para mover Y gama(4, –1, –1):
búfer.adición(binario >> Mover* 8 & 0xFF)
devolución búfer
Def _verify_checksum(propio, búfer):
# Calcular suma de comprobación
checksum = 0
para Bouffe Y búfer[0:4]:
checksum += Bouffe
Si checksum & 0xFF != búfer[4]:
levantar Suma de comprobación no válida()