複数の温度センサーを接続し
複数箇所の温度を同時に測定
I2C(Inter-Integrated Circuit)
フィリップス社が提唱した周辺デバイス とのシリアル通信の方式で、主にEEPROMメモリICなどとの高速通信を実現 する方式です。
I2Cは同じ基板内などのように近距離で直結したデバイスと、100kbpsまたは400kbpsの速度でシリアル通信を行うように使われるのが主で、離れた装置間の通信には向いていません。
①.同じ型番の温度センサーを複数使用して、
デバイス毎の誤差を最小限に抑える。
②.測定箇所が離れているので、センサーまでの距離が伸ばせること。
I2Cでは、同一デバイスで幾つものスレーブアドレスを設定するのが難しい。
I2Cでは、デバイスまでの距離に制約がある。
1-Wire
マキシム・インテグレーテッドの登録商標であり、接地線と一本の信号線だけで低速なデータ転送を行うバス規格である。マキシムに吸収されたダラス・セミコンダクタが開発した。
I²C に似ているが、データ転送レートがより低く、より長い距離で通信可能である。小さい安価なデバイスの通信に使われる。
・ピン: VCC,GND,DAT;
・動作電圧: DC 3~5.5V
・温度測定範囲:-40 ℃ ~ 80 ℃
・湿度測定範囲:0~100%RH
・温度測定精度:±0.5℃
・湿度測定精度:±2%RH
・解像度は、温度0.1℃/湿度0.1%RHで、小数点以下1桁まで測定できる。
・センサーとの通信は1線式で、データ線「DATA」のみの非同期式。
・1-Wire規格に似ているが、通信のフォーマットが違うので混在できない。
・仕様上は、センサーとの距離を20mまで伸ばすことができる。
・センサーがケースに内蔵されているので、取扱や設置が簡単。
・サンプリング周期は2秒で、温度と湿度が同時に測定出来る。
信号線がどこにも繋がっていない不安定な状態は「浮いた状態」「オープン」などと表現される。 (正確にはハイインピーダンス状態と呼ぶ)
この「浮いた」状態の信号線はどの電位にも接続していないため、ちょっとしたきっかけ(指で触れる、風が吹くなど)で、電圧が大きく変動してしまう。 つまり、ノイズの影響を極めて受けやすい状態であると言えます。
デジタル回路の各信号では、常に電圧が高い状態(H:High)もしくは電圧が低い状態(L:Low)のいずれかでなくてはなりません。 「浮いた」状態を回避し、電圧を安定化させるためにプルアップ、プルダウン抵抗が用いられます。
・距離が長い(20m)場合は4.7KΩでプルアップし、且つ、シールド線を使用する。
・電源ラインが数十cmより長くなる場合は、VDD-GND間に0.1μFのコンデンサーを入れる。
→ Successfully installed Adafruit-DHT-1.4.0
#!/usr/bin/python
# -*- coding: utf-8 -*
from time import sleep
import datetime #日付ライブラリ読み込み
import Adafruit_DHT #温度センサーライブラリ読み込み
import csv #CSVライブラリの読み込み
# DHT22センサーから温度と湿度を読み取る関数
def read_dht22(pin):
sensor = Adafruit_DHT.DHT22 # センサーの種類
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
return humidity, temperature
# GPIOピン番号
pin1 = 17 # GPIOポート番号 = 接続するピン番号 11
pin2 = 27 # GPIOポート番号 = 接続するピン番号 13
##---------------------------------------------------------------------------------------
interval = 600 # 60秒 x 10分
while True:
#●日付時刻情報の取得--------------------------------------------------------------------
dtime = datetime.datetime.now() #日付、日時の取得
date = dtime.strftime('%Y-%m-%d') #日付の整形 yyyy-mm-dd
jikok = dtime.strftime('%H:%M') #時間の整形 hh:mm
#●2つのセンサーから温度と湿度を読み取る--------------------------------------------------------------
humidity1, temperature1 = read_dht22(pin1)
humidity2, temperature2 = read_dht22(pin2)
#humidityに湿度を代入
humidity1 = "{:.2f}" . format(humidity1) #湿度(小数点第2位まで)
humidity2 = "{:.2f}" . format(humidity2) #湿度(小数点第2位まで)
#temperatureに気温を代入
temperature1 = "{:.2f}" . format(temperature1) #気温(小数点第2位まで)
temperature2 = "{:.2f}" . format(temperature2) #気温(小数点第2位まで)
#●CSVに追記する-------------------------------------------------------------------------
#CSVファイルを末尾追記モード(a)で開く。ファイルが無ければ新規作成してくれる。
#fにファイルを代入 as f:
with open('/home/yaopi/data/dht22-21.csv','a') as f:
writer = csv.writer(f) #ファイルfに書き込み
writer.writerow([date,jikok,temperature1,humidity1,temperature2,humidity2]) #書き込む内容 日時,時間,温度,湿度
#●追記内容の表示--------------------------------------------------------------------------
print (date,jikok,temperature1,humidity1,temperature2,humidity2)
sleep(interval) # intervalの値まで待機する
##---------------------------------------------------------------------------------------
室内(A&B):Raspberry Pi + 温度センサー x 2個 Wi-Fi接続。
で、同時刻に測定。
while True:
(2023.02.27)