【Python】Raspberry Piで室温、湿度を取得
pigpioを使い温度と湿度をPythonで取得してみたので、自分用に内容を記事にしときたいと思います。
前回の記事でDHT22を動かす為の配線を行いましたので、これを動かしていきます。
Pythonでpigpioを動かす場合、まずこっちの環境構築をしておきましょう。
プログラムはこちらのソースをほぼほぼ流用しており、3秒ごとに温度と湿度を示す数値を表示するものです。
# -*- coding: utf-8 -*-
import time
import pigpio
class DHT22:
'DHT22 sensor reader class for Raspberry'
pi = None
temp = 0
rhum = 0
bad_CS = 0 # Bad checksum count.
bad_SM = 0 # Short message count.
bad_MM = 0 # Missing message count.
bad_SR = 0 # Sensor reset count.
high_tick = 0
bit = 40
cb = None
no_response = 0
MAX_NO_RESPONSE = 2
def __init__(self, pin):
self.__pin = pin
self.pi = pigpio.pi()
self.pi.set_pull_up_down(pin,pigpio.PUD_UP)
self.pi.set_watchdog(pin, 0)
self.cb = self.pi.callback(pin, pigpio.EITHER_EDGE, self._cb)
def _cb(self, gpio, level, tick):
"""
Accumulate the 40 data bits. Format into 5 bytes, humidity high,
humidity low, temperature high, temperature low, checksum.
"""
diff = pigpio.tickDiff(self.high_tick, tick)
if level == 0:
# Edge length determines if bit is 1 or 0.
if diff >= 50:
val = 1
if diff >= 200: # Bad bit?
self.CS = 256 # Force bad checksum.
else:
val = 0
if self.bit >= 40: # Message complete.
self.bit = 40
elif self.bit >= 32: # In checksum byte.
self.CS = (self.CS << 1) + val
if self.bit == 39:
# 40th bit received.
self.pi.set_watchdog(gpio, 0)
self.no_response = 0
total = self.hH + self.hL + self.tH + self.tL
if (total & 255) == self.CS: # Is checksum ok?
self.rhum = round(((self.hH << 8) + self.hL) * 0.1,2)
if self.tH & 128: # Negative temperature.
mult = -0.1
self.tH = self.tH & 127
else:
mult = 0.1
self.temp = round(((self.tH << 8) + self.tL) * mult,2)
self.tov = time.time()
else:
self.bad_CS += 1
elif self.bit >= 24: # in temp low byte
self.tL = (self.tL << 1) + val
elif self.bit >= 16: # in temp high byte
self.tH = (self.tH << 1) + val
elif self.bit >= 8: # in humidity low byte
self.hL = (self.hL << 1) + val
elif self.bit >= 0: # in humidity high byte
self.hH = (self.hH << 1) + val
else: # header bits
pass
self.bit += 1
elif level == 1:
self.high_tick = tick
if diff > 250000:
self.bit = -2
self.hH = 0
self.hL = 0
self.tH = 0
self.tL = 0
self.CS = 0
else: # level == pigpio.TIMEOUT:
self.pi.set_watchdog(self.__pin, 0)
if self.bit < 8: # Too few data bits received.
self.bad_MM += 1 # Bump missing message count.
self.no_response += 1
if self.no_response > self.MAX_NO_RESPONSE:
self.no_response = 0
self.bad_SR += 1 # Bump sensor reset count.
elif self.bit < 39: # Short message receieved.
self.bad_SM += 1 # Bump short message count.
self.no_response = 0
else: # Full message received.
self.no_response = 0
def trigger(self):
self.pi.write(self.__pin, pigpio.LOW)
time.sleep(0.019)
self.pi.set_mode(self.__pin, pigpio.INPUT)
self.pi.set_pull_up_down(self.__pin,pigpio.PUD_UP)
self.pi.set_watchdog(self.__pin, 200)
def temperature(self):
"""Return current temperature."""
return self.temp
def humidity(self):
"""Return current relative humidity."""
return self.rhum
GPIO_PIN = 17
s = DHT22(pin=GPIO_PIN)
while True:
s.trigger()
time.sleep(3)
print("温度:"+str(s.temperature())+" 湿度:"+str(s.humidity()))
s.pi.stop()
実行結果
温度:19.2 湿度:55.0
温度:19.2 湿度:55.1
温度:19.2 湿度:53.8
温度:19.2 湿度:54.9
温度:19.2 湿度:53.8
温度:19.2 湿度:55.0
関連記事










ディスカッション
コメント一覧
まだ、コメントがありません