树莓派接DTH11温度传感器

今天想把温度传感器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()

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注