반응형
온습도 센서 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(0, 1500): #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(0, 40): 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(0, len(effectiveData)): if (len(effectiveData[i]) < ((bits_max + bits_min)/2)): effectiveData[i] = "0" else: effectiveData[i] = "1" for i in range(0, 8): HumidityBit += str(effectiveData[i]) for i in range(16, 24): TemperatureBit += str(effectiveData[i]) for i in range(32, 40): 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코드
보통 라즈베리파이를 처음으로 배울 때 필요한 준비물들
반응형
'라즈베리파이' 카테고리의 다른 글
HC-SR04 초음파 거리센서 인터럽트 처리로 구현한 C 코드 (0) | 2019.04.02 |
---|---|
HC-SR04 초음파 거리센서 실습 파이선 코드와 C코드 (0) | 2019.04.02 |
온습도 센서 DHT11 - 비동기 방식으로 값을 얻는 C코드 (0) | 2019.04.01 |
라즈베리파이 카메라 사용법 상세한 자료 파이선 코드 [링크] (0) | 2019.04.01 |
FSR402센서, FSR (Force Sensing Resistors) 힘 감지 센서 라즈베리파이 파이선 코드 (0) | 2019.03.27 |