import log
from machine import Pin
import utime
log.basicConfig(level=log.INFO)
uart_log = log.getLogger("UART")
class dht11():
def __init__(self, dataline):
self.dataline = dataline
# 复位DHT11
def DHT11_Rst(self):
self.dataline.set_dir(1) # 1 - (Pin.OUT)设置为输出模式
self.dataline.write(0) # 设置输出,拉低电平
utime.sleep_ms(20) # 延时18ms以上
self.dataline.write(1) # 拉高电平
utime.sleep_us(30) # //延时20~40us
# 等待DHT11的回应
# 返回1: 未检测到DHT11的存在
# 返回0: 存在
def DHT11_Check(self): # 检查应答信号
self.dataline.set_dir(0) # 0 - (Pin.IN)设置为输入模式;
retry = 0
while self.dataline.read() and retry < 100: # DHT11应返回83US的低电平
retry = retry + 1
utime.sleep_us(1)
if retry >= 100:
return 1
else:
retry = 0
while (not self.dataline.read()) and retry < 100:
retry = retry + 1
utime.sleep_us(1)
if retry >= 100:
return 1
else:
return 0
# 从DHT11读取一个位
# 返回值:1 / 0
def DHT11_Read_Bit(self): # 读取单个位的数据
retry = 0
while self.dataline.read() and retry < 100: # DHT11应返回54us的低电平
retry = retry + 1
utime.sleep_us(1)
retry = 0
while (not self.dataline.read()) and retry < 100:
retry = retry + 1
utime.sleep_us(1)
utime.sleep_us(40)
if self.dataline.read():
return 1
else:
return 0
#第二种方法
# while ( self.dataline.read()) :
# uart_log.info('高电平')
#while (not self.dataline.read() ):
# uart_log.info('低电平')
# utime.sleep_us(40)
# if self.dataline.read():
# return 1
#else:
# return 0
def DHT11_Read_Byte(self):
dat = 0
for i in range(0, 8):
dat <<= 1
dat |= self.DHT11_Read_Bit()
return dat
def DHT11_Read_Data(self, buf):
self.DHT11_Rst()
if self.DHT11_Check() == 0:
uart_log.info("检测到DHT11")
for i in range(0, 5):
buf[i] = self.DHT11_Read_Byte()
uart_log.info("接收到一字节数据")
if (buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]:
humi = buf[0]
temper = buf[2]
uart_log.info("湿度 {}".format(humi))
uart_log.info("温度 {}".format(temper))
else:
uart_log.info("data :{}".format(buf))
else:
uart_log.info("未检测到DHT11")
dataline = Pin(Pin.GPIO2, Pin.OUT, Pin.PULL_DISABLE, 1)
dht11 = dht11(dataline)
if __name__ == "__main__":
buf = ['','','','','']
# utime.sleep(1)
# dht11.DHT11_Rst()
# uart_log.info("dht11的情况为( # 返回1: 未检测到DHT11的存在,返回0: 存在) {}".format(dht11.DHT11_Check()))
dht11.DHT11_Read_Data(buf)
DHT11:python 的DHT11程序,quecpython,micropython
于 2022-07-29 21:15:51 首次发布