본문 바로가기

라즈베리파이

온습도 센서 DHT11 실습 python 코드

반응형


온습도 센서 DHT11 실습 python 코드

sleep 없이 동기식 방식으로 구현한 python 예제 코드를 아래에 첨부한다. 아래 소스코드와는 다르게 라이브러리를 사용하여 구현해 볼 사람은 다음 링크를 참고한다.

 https://github.com/adafruit/adafruit_python_dht 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python
#-*- coding: utf-8 -*-
# original source from : https://github.com/netikras/r-pi_DHT11
 
import RPi.GPIO as GPIO
import time, sys
 
data = []
effectiveData = []
bits_min=999
bits_max=0
HumidityBit = ""
TemperatureBit = ""
crcBit = ""
crc_OK = False
Humidity = 0
Temperature = 0
crc = 0
pin=4
 
def bin2dec(string_num):
  return int(string_num, 2)
 
def pullData():
  global data, effectiveData, pin
 
  data = []
  effectiveData = []
 
  GPIO.setup(pin,GPIO.OUT)
  GPIO.output(pin,GPIO.HIGH)
  time.sleep(0.025)
  GPIO.output(pin,GPIO.LOW)
  time.sleep(0.14)
  GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
 
  start = time.time()
  for i in range(01500):  #1000 ->1500으로 늘림
    data.append(GPIO.input(pin))
  end = time.time()
  #print 'gap', (end - start) * 1000000 # 이 시간이 4000을 넘어야 한다.
 
 
def analyzeData():
  seek=0
  bits_min=9999
  bits_max=0
 
  global HumidityBit, TemperatureBit, crcBit, crc, Humidity, Temperature
 
  HumidityBit = ""
  TemperatureBit = ""
  crcBit = ""
  index = 0
 
  # 데이터를 보내기전의 첫번째 펄스는 넘어간다.
  while(seek < len(data) and data[seek] == 0):
    seek+=1
  while(seek < len(data) and data[seek] == 1):
    seek+=1
 
  #High 비트 40개를 모두 저장한다.
  for i in range(040):
    index = 0
    buffer = ""
 
    while(seek < len(data) and data[seek] == 0):
      seek+=1
      index += 1
 
    while(seek < len(data) and data[seek] == 1):
      seek+=1
      buffer += "1"
 
    #40개의 값 중에서 가장 긴 것과 가장 짧은 것을 계산한다.
    if (len(buffer) < bits_min):
      bits_min = len(buffer)
 
    if (len(buffer) > bits_max):
      bits_max = len(buffer)
 
    effectiveData.append(buffer)
    #print "%s " % buffer
 
  # ((bits_max + bits_min)/2)을 기준으로 LOW, HIGH 를 정한다.
  for i in range(0len(effectiveData)):
    if (len(effectiveData[i]) < ((bits_max + bits_min)/2)):
      effectiveData[i] = "0"
    else:
      effectiveData[i] = "1"
 
  for i in range(08):
    HumidityBit += str(effectiveData[i])
 
  for i in range(1624):
    TemperatureBit += str(effectiveData[i])
 
  for i in range(3240):
    crcBit += str(effectiveData[i])
 
  Humidity = bin2dec(HumidityBit)
  Temperature = bin2dec(TemperatureBit)
  crc = bin2dec(crcBit)
  #print "HumidityBit=%s, TemperatureBit=%s, crc=%s" % (HumidityBit, TemperatureBit, crc)
 
def isDataValid():
  global Humidity, Temperature, crc
  if ((Humidity + Temperature) == crc):
      return True
  else:
      return False
 
def printData():
  f = Temperature * 9. / 5. + 32
  print "Humidity = %d.%d %% Temperature = %d.%d *C (%.1f *F)"%( Humidity, 0, Temperature, 0, f)
 
GPIO.setmode(GPIO.BCM)
try:
  while (True):
    pullData()
    analyzeData()
    if (isDataValid()):
      printData()
    else:
      print 'CRC Error'
    time.sleep(4)
except:
  print 'Now Exit'
 
 
 
 
 

회로 연결도는 아래 게시물과 같다. 링크를 참고한다. 

2019/04/01 - [라즈베리파이] - 온습도 센서 DHT11 - 비동기 방식으로 값을 얻는 C코드


보통 라즈베리파이를 처음으로 배울 때 필요한 준비물들


반응형