HOME → 1 Raspberry Pi → 03 作品集 → 

Raspberry Pi 複数の温度センサーで 複数箇所の温度測定

Raspberry Pi 作品集
複数の温度センサーを接続し
複数箇所の温度を同時に測定
 
窓からの冷気対策として内窓を自作したので、その効果を測るべくRaspberry Pi で「屋外・窓の内側・内窓の内側」の3か所の温度を同時に測定し、「差異」を分析してみた。
 
DHT22 の配線
 
以下、Raspberry Pi に複数の温度センサーを接続した「複数箇所同時-温度記録機」の作成ログ。
 
 

 

スポンサー リンク

 

 
 
 
 
 
1. I2Cデバイスでの問題点
 
I2Cは、各種デバイスを制御するマスター(Raspberry Pi)と、マスターからの命令によって制御されるスレーブ(I2Cデバイス)に分かれる。
I2Cは、各種デバイスを制御するマスター(Raspberry Pi)と、マスターからの命令によって制御されるスレーブ(I2Cデバイス)に分かれる
 

 I2C(Inter-Integrated Circuit) 
 フィリップス社が提唱した周辺デバイス とのシリアル通信の方式で、主にEEPROMメモリICなどとの高速通信を実現 する方式です。
 I2Cは同じ基板内などのように近距離で直結したデバイスと、100kbpsまたは400kbpsの速度でシリアル通信を行うように使われるのが主で、離れた装置間の通信には向いていません

 
 
複数の温度センサーを接続する目的と要件。
1台の Raspberry Pi で複数箇所の温度を測定し、その「差異」を明らかにするのが目的で、その要件は、
①.同じ型番の温度センサーを複数使用して、
  デバイス毎の誤差を最小限に抑える。
②.測定箇所が離れているので、センサーまでの距離が伸ばせること。
 
問題点①.
I2Cでは、同一デバイスで幾つものスレーブアドレスを設定するのが難しい。
 
問題点②.
I2Cでは、デバイスまでの距離に制約がある。
 
参考:I2Cデバイスでの温度測定。
 
 
 
2. 1-Wireデバイス
 

 1-Wire
 マキシム・インテグレーテッドの登録商標であり、接地線と一本の信号線だけで低速なデータ転送を行うバス規格である。マキシムに吸収されたダラス・セミコンダクタが開発した。
 I²C に似ているが、データ転送レートがより低く、より長い距離で通信可能である。小さい安価なデバイスの通信に使われる。

 
1-Wireデバイス
 
1-Wireにも、「1-Wireマスタ(ホスト)」と「1-Wireデバイス(スレーブ)」の2種類が存在する。
 
1-Wire のメリット
 
使用する端子数を削減することが可能。
 
長距離通信が可能。(最大で約500mの通信が可能)
 
多数のスレーブデバイスが接続可能。
 
 
 
3. DHT22 温度湿度センサモジュール
 
DHT22 温度湿度センサモジュール:AM2302チップ付き。
DHT22 温度湿度センサモジュール:AM2302
 
「AM2302チップ」は、シリアル単線1-wireライク)通信と言うデバイスで、3線になっている。
・ピン: VCC,GND,DAT;
・動作電圧: DC 3~5.5V
・温度測定範囲:-40 ℃ ~ 80 ℃
・湿度測定範囲:0~100%RH
・温度測定精度:±0.5℃
・湿度測定精度:±2%RH
 
DHT22 の特徴。
・解像度は、温度0.1℃/湿度0.1%RHで、小数点以下1桁まで測定できる。
・センサーとの通信は1線式で、データ線「DATA」のみの非同期式。
・1-Wire規格に似ているが、通信のフォーマットが違うので混在できない
・仕様上は、センサーとの距離を20mまで伸ばすことができる。
・センサーがケースに内蔵されているので、取扱や設置が簡単。
・サンプリング周期は2秒で、温度と湿度が同時に測定出来る。
 
Raspberry Piとの接続。
Raspberry Piとの接続
 
DHT22 の配線。
「GPIOポート:17 = ピン番号:11 」と「GPIOポート:27 = ピン番号:13」を使用した。(ポートは、任意に選択できる。)
DHT22 の配線
 
「4.7KΩ」の抵抗でプルアップ。
「4.7KΩ」の抵抗で、プルアップした
 
プルアップの必要性。

 信号線がどこにも繋がっていない不安定な状態は「浮いた状態」「オープン」などと表現される。 (正確にはハイインピーダンス状態と呼ぶ)
 この「浮いた」状態の信号線はどの電位にも接続していないため、ちょっとしたきっかけ(指で触れる、風が吹くなど)で、電圧が大きく変動してしまう。 つまり、ノイズの影響を極めて受けやすい状態であると言えます。
 デジタル回路の各信号では、常に電圧が高い状態(H:High)もしくは電圧が低い状態(L:Low)のいずれかでなくてはなりません。 「浮いた」状態を回避し、電圧を安定化させるためにプルアップ、プルダウン抵抗が用いられます。

・距離が長い(20m)場合は4.7KΩでプルアップし、且つ、シールド線を使用する。
・電源ラインが数十cmより長くなる場合は、VDD-GND間に0.1μFのコンデンサーを入れる。

 
 
 
4. Python プログラム
 
10分間隔で測定し、結果を「csv」に記録する。
 
DHT22 温度湿度センサモジュールの使用準備。
sudo pip3 install Adafruit_DHT
 → 
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の値まで待機する
##---------------------------------------------------------------------------------------
 
小数点以下の桁数指定について。
小数点以下の桁数指定について
 
「DHT22」は、小数点以下1桁までの測定。
 
 
 
5. 測定結果
 
内窓を自作したので「Raspberry Pi + 温度センサー」で、その効果を測定。
 
O:屋外の温度
A:室内の窓の内側
B:内窓の内側
の、3か所の温度を同時に測定し、その差異を分析する。
測定環境
 
屋外(O):Raspberry Pi + 温度センサー x 1個 Wi-Fi接続。
室内(A&B):Raspberry Pi + 温度センサー x 2個 Wi-Fi接続。
で、同時刻に測定。
 
測定結果の「csv」ファイルを、エクセルでグラフにして差異を見る。
 
測定結果の「csv」ファイルを、エクセルでグラフにして差異を見る
 
測定結果:「csv」ファイルをエクセルでグラフにする
 
 
 
6. Python を cron で実行する
 
Python の「sleep関数」でのデータロギング。
interval = 600 # ・・・60秒 x 10分
while True:
・・・
sleep(interval) # ・・・intervalの値まで待機する
 
問題点。
ループで長時間動かすと、Pythonの実行が途中で止まる事がある
 
 
対策。
cron で python を 10分間隔 で実行する
 
Cronの設定。
crontab –e
 
*/10 * * * * python3 /home/yaopi/dht22/dht22-cron_333.py
 
 
 
以上。
(2023.02.27)
 

 

スポンサー リンク

 

             

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください