今天想把温度传感器DTH11接到树莓派上,一开始我很相信那个树莓派实验室上的帖子说的话,什么不需要上拉电阻、还有接led灯会干扰。。感觉是屁话!一开始真的很相信,结果直接套用他写的python程序没有任何改动,结果读不出来、读不出来、读不出来、让我把板子焊得面目全非。又是拆测温元件、又是想把led灯焊下来,听了姨父的话又是加了个1F的电容来屏蔽电源干扰,结果还是读不出来。
濒临崩溃绝望的我只能直连元器然后换了个python脚本,结果开始读出了数据,原本以为元器件坏掉的我终于开心的笑出了声,虽然数据有时还是出错,但是起码它读出来了,不像以前的255、255、255、255那样绝望了,这件事给了我一个教训,先从自己可以找的地方来找错误,不要把错误都推到自己不了解或者没有涉足的领域,(python也是自己不太了解的领域但是我为什么对它有一种莫名其妙的自信,自信它不会发生错误?。。。)
数据是读出来了,但是数据还是不对劲。。。。时好时坏,姨父说上拉电阻越大读取数据越稳定,然后我就把板子上的1k的贴片电阻给搞下来了。换了一个5.1k的电阻结果数据还是读错,然后姨父说找到了毛病所在,结果又换了个3.9k的电阻,数据依然不是100{d4daabd1ba368d9860c36387ddb72bbda14f8f9559d69d60a952800885260c03}正确,然后姨父建议我从程序方面着手,写一个纠错的数值比较循环,我当然做不到啊,所以我就想用for做一个条件循环,然后栽在range上,根本搞不懂在一个数集中选数什么什么的,最后选用了while的无限循环和if、elif、else做进一步的判断和决定break的时机,最后我成功了!为了保险和传感器预热(不知道预热是什么鬼。。自己瞎编的),我在循环前面先执行一遍程序。
从ue上直接粘贴到word上的格式可能会鬼畜大家见谅
下载链接:真正的自编DTH11带纠错
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
channel =12
data = []
j = 0
GPIO.setmode(GPIO.BOARD)
time.sleep(2)
GPIO.setup(channel, GPIO.OUT)
GPIO.output(channel, GPIO.LOW)
time.sleep(0.02)
GPIO.output(channel, GPIO.HIGH)
GPIO.setup(channel, GPIO.IN)
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
continue
while j < 40:
k = 0
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
k += 1
if k > 100:
break
if k < 8:
data.append(0)
else:
data.append(1)
j += 1
print “传感器工作中”
humidity_bit = data[0:8]
humidity_point_bit = data[8:16]
temperature_bit = data[16:24]
temperature_point_bit = data[24:32]
check_bit = data[32:40]
humidity = 0
humidity_point = 0
temperature = 0
temperature_point = 0
check = 0
for i in range(8):
humidity += humidity_bit[i] * 2 ** (7-i)
humidity_point += humidity_point_bit[i] * 2 ** (7-i)
temperature += temperature_bit[i] * 2 ** (7-i)
temperature_point += temperature_point_bit[i] * 2 ** (7-i)
check += check_bit[i] * 2 ** (7-i)
tmp = humidity + humidity_point + temperature + temperature_point
var = 1
while var == 1:
GPIO.setmode(GPIO.BOARD)
channel =12
data = []
j = 0
time.sleep(2)
GPIO.setup(channel, GPIO.OUT)
GPIO.output(channel, GPIO.LOW)
time.sleep(0.025)
GPIO.output(channel, GPIO.HIGH)
GPIO.setup(channel, GPIO.IN)
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
continue
while j < 40:
k = 0
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
k += 1
if k > 100:
break
if k < 8:
data.append(0)
else:
data.append(1)
j += 1
print” ”
humidity_bit = data[0:8]
humidity_point_bit = data[8:16]
temperature_bit = data[16:24]
temperature_point_bit = data[24:32]
check_bit = data[32:40]
humidity = 0
humidity_point = 0
temperature = 0
temperature_point = 0
check = 0
for i in range(8):
humidity += humidity_bit[i] * 2 ** (7 – i)
humidity_point += humidity_point_bit[i] * 2 ** (7 – i)
temperature += temperature_bit[i] * 2 ** (7 – i)
temperature_point += temperature_point_bit[i] * 2 ** (7 – i)
check += check_bit[i] * 2 ** (7 – i)
tmp = humidity + humidity_point + temperature + temperature_point
if temperature < 100:
print”温度正确”
#elif humidity < 150:
print”湿度正确”
print “温度 :”, temperature, “*C, 湿度 :”, humidity, “{d4daabd1ba368d9860c36387ddb72bbda14f8f9559d69d60a952800885260c03}”
break
else:
print”数据错误!重新读取”
GPIO.cleanup()