宜蘭聰仔
2016年3月23日 星期三
raspberry pi 用 python 取得dht11之溫濕度資料以php呼叫並顯示於網頁中
感謝開發者
dht11.py
import time import RPi.GPIO as GPIO class DHT11Result: 'DHT11 sensor result returned by DHT11.read() method' ERR_NO_ERROR = 0 ERR_MISSING_DATA = 1 ERR_CRC = 2 error_code = ERR_NO_ERROR temperature = -1 humidity = -1 def __init__(self, error_code, temperature, humidity): self.error_code = error_code self.temperature = temperature self.humidity = humidity def is_valid(self): return self.error_code == DHT11Result.ERR_NO_ERROR class DHT11: 'DHT11 sensor reader class for Raspberry' __pin = 0 def __init__(self, pin): self.__pin = pin def read(self): GPIO.setup(self.__pin, GPIO.OUT) # send initial high self.__send_and_sleep(GPIO.HIGH, 0.05) # pull down to low self.__send_and_sleep(GPIO.LOW, 0.02) # change to input using pull up GPIO.setup(self.__pin, GPIO.IN, GPIO.PUD_UP) # collect data into an array data = self.__collect_input() # parse lengths of all data pull up periods pull_up_lengths = self.__parse_data_pull_up_lengths(data) # if bit count mismatch, return error (4 byte data + 1 byte checksum) if len(pull_up_lengths) != 40: return DHT11Result(DHT11Result.ERR_MISSING_DATA, 0, 0) # calculate bits from lengths of the pull up periods bits = self.__calculate_bits(pull_up_lengths) # we have the bits, calculate bytes the_bytes = self.__bits_to_bytes(bits) # calculate checksum and check checksum = self.__calculate_checksum(the_bytes) if the_bytes[4] != checksum: return DHT11Result(DHT11Result.ERR_CRC, 0, 0) # ok, we have valid data, return it return DHT11Result(DHT11Result.ERR_NO_ERROR, the_bytes[2], the_bytes[0]) def __send_and_sleep(self, output, sleep): GPIO.output(self.__pin, output) time.sleep(sleep) def __collect_input(self): # collect the data while unchanged found unchanged_count = 0 # this is used to determine where is the end of the data max_unchanged_count = 100 last = -1 data = [] while True: current = GPIO.input(self.__pin) data.append(current) if last != current: unchanged_count = 0 last = current else: unchanged_count += 1 if unchanged_count > max_unchanged_count: break return data def __parse_data_pull_up_lengths(self, data): STATE_INIT_PULL_DOWN = 1 STATE_INIT_PULL_UP = 2 STATE_DATA_FIRST_PULL_DOWN = 3 STATE_DATA_PULL_UP = 4 STATE_DATA_PULL_DOWN = 5 state = STATE_INIT_PULL_DOWN lengths = [] # will contain the lengths of data pull up periods current_length = 0 # will contain the length of the previous period for i in range(len(data)): current = data[i] current_length += 1 if state == STATE_INIT_PULL_DOWN: if current == GPIO.LOW: # ok, we got the initial pull down state = STATE_INIT_PULL_UP continue else: continue if state == STATE_INIT_PULL_UP: if current == GPIO.HIGH: # ok, we got the initial pull up state = STATE_DATA_FIRST_PULL_DOWN continue else: continue if state == STATE_DATA_FIRST_PULL_DOWN: if current == GPIO.LOW: # we have the initial pull down, the next will be the data pull up state = STATE_DATA_PULL_UP continue else: continue if state == STATE_DATA_PULL_UP: if current == GPIO.HIGH: # data pulled up, the length of this pull up will determine whether it is 0 or 1 current_length = 0 state = STATE_DATA_PULL_DOWN continue else: continue if state == STATE_DATA_PULL_DOWN: if current == GPIO.LOW: # pulled down, we store the length of the previous pull up period lengths.append(current_length) state = STATE_DATA_PULL_UP continue else: continue return lengths def __calculate_bits(self, pull_up_lengths): # find shortest and longest period shortest_pull_up = 1000 longest_pull_up = 0 for i in range(0, len(pull_up_lengths)): length = pull_up_lengths[i] if length < shortest_pull_up: shortest_pull_up = length if length > longest_pull_up: longest_pull_up = length # use the halfway to determine whether the period it is long or short halfway = shortest_pull_up + (longest_pull_up - shortest_pull_up) / 2 bits = [] for i in range(0, len(pull_up_lengths)): bit = False if pull_up_lengths[i] > halfway: bit = True bits.append(bit) return bits def __bits_to_bytes(self, bits): the_bytes = [] byte = 0 for i in range(0, len(bits)): byte = byte << 1 if (bits[i]): byte = byte | 1 else: byte = byte | 0 if ((i + 1) % 8 == 0): the_bytes.append(byte) byte = 0 return the_bytes def __calculate_checksum(self, the_bytes): return the_bytes[0] + the_bytes[1] + the_bytes[2] + the_bytes[3] & 255
gettc.py (取得溫度濕度)
import RPi.GPIO as GPIO import dht11 import time import datetime import os # initialize GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.cleanup() def gettc(): # read data using pin gpio4 instance = dht11.DHT11(pin = 4) i=0 while i<1000: result = instance.read() if result.is_valid(): print datetime.datetime.now() print("%d" % result.temperature) print("%d" % result.humidity) #return result.temperature + "C" res=os.popen('vcgencmd measure_temp').readline() print res.replace("temp=","").replace("'C\n","") i=1005 time.sleep(1) i += 1 gettc()
php
K REMOTE SCREEN
Raspberry pi 2 python control GPIO via Web Server
192.168.1.252
取得DHT11溫度濕度時間:
°
%
°
Turn Relay on
Status
Turn Relay off
Printer ON
Printer Off
TV On
TV Off
MOD On
MOD Off
ATUR On
ATUR Off
Router On
Router Off
沒有留言:
張貼留言
較新的文章
較舊的文章
首頁
訂閱:
張貼留言 (Atom)
網誌
▼
2016
(11)
►
10/02 - 10/09
(1)
►
04/17 - 04/24
(1)
►
04/03 - 04/10
(2)
▼
03/20 - 03/27
(3)
raspberry pi 用 python 取得dht11之溫濕度資料以php呼叫並顯示於網頁中
Raspberry pi 用php and python 控制GPIO 並取得GPIO狀態
Raspberry pi 用 python 控制GPIO
►
01/24 - 01/31
(1)
►
01/17 - 01/24
(1)
►
01/10 - 01/17
(1)
►
01/03 - 01/10
(1)
►
2015
(1)
►
05/03 - 05/10
(1)
►
2012
(2)
►
12/09 - 12/16
(1)
►
08/12 - 08/19
(1)
►
2011
(12)
►
10/16 - 10/23
(1)
►
10/02 - 10/09
(2)
►
09/25 - 10/02
(1)
►
09/18 - 09/25
(3)
►
08/28 - 09/04
(1)
►
06/05 - 06/12
(2)
►
02/06 - 02/13
(1)
►
01/16 - 01/23
(1)
►
2010
(25)
►
11/28 - 12/05
(4)
►
09/12 - 09/19
(4)
►
08/22 - 08/29
(1)
►
05/23 - 05/30
(4)
►
03/21 - 03/28
(5)
►
03/14 - 03/21
(2)
►
03/07 - 03/14
(5)
►
2009
(3)
►
06/21 - 06/28
(2)
►
04/19 - 04/26
(1)
►
2008
(10)
►
04/06 - 04/13
(1)
►
03/02 - 03/09
(3)
►
02/24 - 03/02
(1)
►
02/17 - 02/24
(5)
►
2007
(11)
►
04/08 - 04/15
(1)
►
03/18 - 03/25
(5)
►
03/11 - 03/18
(5)
我的最愛
試飛員
往山裡去的小孩
Histats.com
Open Flash Chart
訪客計數器
追蹤者
沒有留言:
張貼留言