温度の測定方法は?


44

温度を測定するためにRPiに何を接続できますか?I²CまたはSPIに接続されたデバイスが最も理にかなっていると思います。

ここで質問ですについてDHT-22と他の1-Wireデバイスが。しかし、この段階では、重要なタイミングのために、RPiで1線は難しいようです。


回答:


40

MCP9804を接続する方法は次のとおりです。

ここに画像の説明を入力してください

次のように使用できます。

root@raspberrypi:~# modprobe i2c-dev
root@raspberrypi:~# modprobe i2c-bcm2708 
root@raspberrypi:~# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1f 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
root@raspberrypi:~# i2cget -y 0 0x1f 0x5 w
0x67c1

0x67c1を温度に変換するのは少し複雑です。MSBは0xc1で、LSBは0x67です

MSBの最初の4ビットがドロップされ、温度が16分の1度になります

(0xc1&0xf)*16+0x67/16.0 = 22.4375 degrees 

Pythonの例
上記のi2cモジュールをロードすることに加えて、python-smbusパッケージをインストールする必要があります。読み取りと読み取りの間にMCP9804をシャットダウンすることにより、自己発熱を減らすことができます。

#!/usr/bin/env python
import time
from smbus import SMBus

class MCP9804(object):
    def __init__(self, bus, addr):
        self.bus = bus
        self.addr = addr

    def wakeup(self):
        self.bus.write_word_data(self.addr, 1, 0x0000)

    def shutdown(self):
        self.bus.write_word_data(self.addr, 1, 0x0001)

    def get_temperature(self, shutdown=False):
        if shutdown:
            self.wakeup()
            time.sleep(0.26) # Wait for conversion

        msb, lsb =  self.bus.read_i2c_block_data(self.addr, 5, 2)

        if shutdown:
            self.shutdown()

        tcrit = msb>>7&1
        tupper = msb>>6&1
        tlower = msb>>5&1

        temperature = (msb&0xf)*16+lsb/16.0
        if msb>>4&1:
            temperature = 256 - temperature
        return temperature



def main():
    sensor = MCP9804(SMBus(0), 0x1f)
    while True:
        print sensor.get_temperature()
        time.sleep(1)


if __name__ == "__main__":
    main()

このICのどのバージョンを使用しましたか?同様のIC(MCP9808T)を持っていますが、地元の電器店にはDFNパッケージバージョンしかありません。それを1つの大きなショートにすることなく、何かにはんだ付けする方法はわかりません。
ikku

@ikku、私は8ピンMSOPを持っていた
ジョン・ラRooy

13

シリアルポートに組み込まれたRaspberry Piを使用して、デジタル温度計IC(DS1620など)に接続できます。

Raspberry Piのシリアルポートインターフェイスについては、こちらをご覧ください。

ここに画像の説明を入力してください

  • P1(左下)-3.3V
  • P6-GND
  • P8 GPIO14-TX
  • P10 GPIO15-RX

重要:RPi UARTはTTL 3.3Vで動作することに注意してください-RPiに直接高電圧5v / 12volt Uartを使用しないように注意してください。破損の原因になります!


3線式インターフェースを使用しているように見えるため、シリアルポートを通常の方法で使用するだけでなく、GPIOと互換性があるようです
ジョンラルーイ

私の知る限り、シリアルポートがTx、Rx、CLKを持っているのは普通です。SPIにはSDO、SDO、SCLKの3線も必要だと思います。SPIバリアント-DS1722 リンクについては、これを参照してください。
JeeShenリー

ただし、DS1620は!RST、CLK、およびDQを使用します。!RSTは、UARTに違うので、CLKはクロックであり、DQが双方向データであり、全体の転送のために高いです
ジョン・ラRooy

3
私はあなたの代替的な答えが好きで、あなたのためにそれを少し改善しました。また、RPiのUARTが3.3v TTLであり、シリアルから他のUSBが5v / 12vを使用する可能性があることに注意するために、非技術ユーザー向けの警告を追加しました。RPIを損なう!
ピョートルクラ

3

温度検知には2つのアプローチを試しました。I2Cについては、ニブラーが説明するものと同様のTMP102モジュールを使用しました。 これに関する私の投稿は次のとおりです。

1線式の場合、Adafruitは最近そこに独自のイメージをリリースし、1線式のサポートが含まれています。DS18B20 1線温度センサーをそれで読み取ることができました。この投稿の詳細:

最後に、別のアプローチは、アナログ温度センサーと外部ADCを使用することです。Adafruitにはこれに関する素晴らしいチュートリアルがあります。


3

シンプルで安価なUSB "HID TEMPer"温度計も機能し、私のようなUARTやGPIOにまだ慣れていない人でも簡単に接続できます。

HID TEMPer USB温度計

RPiは、ハブなしでUSBポートから直接駆動するのに十分な電力を提供します。

Raspbian Wheezyでこれを設定するために、Ubuntu用に書かれたこれらの指示に従いました(免責事項:リンクは自分のブログの投稿用です)。Raspberry PiのLIBUSB_LIBDIR場合、Device::USBperlモジュールをインストールするときに設定する小さな調整を1つ行うだけlibusbで、非標準のアームの位置で見つけることができました。完全な手順が続きます。

muninを使用せずに単純な読み取り値を取得するには、次のように依存関係をインストールします(rootとして):

apt-get install libusb-dev
export LIBUSB_LIBDIR=/usr/lib/arm-linux-gnueabihf
cpan Inline::MakeMaker
cpan Device::USB::PCSensor::HidTEMPer

作成readtemp.pl

#!/usr/bin/perl
use strict;
use Device::USB::PCSensor::HidTEMPer;

my $pcsensor = Device::USB::PCSensor::HidTEMPer->new();
my @devices = $pcsensor->list_devices();
foreach my $device (@devices) {
    print $device->internal()->celsius()."\n" if defined $device->internal();
}

そして、それをルートとして実行して出力を確認します。私の場合、今夜のガレージは少し肌寒いです。

day@pi:~$ sudo ./readtemp.pl 
16.5

2

私が現在使用しているのはDS18B20です。

最初にPiを開き、次を入力します。

sudo leafpad /etc/apt/sources.list.d/raspi.list

次に、のuntested後に単語を追加しmainます。

次に入力します:

sudo apt-get update
sudo apt-get upgrade

私の場合、Wi-Fi /イーサネットの速度に依存しますが、長い時間がかかりました。その後、再起動します。

sudo reboot now

白いワイヤをGPIO4に、赤いワイヤを3V3に、黒いワイヤをGNDに接続します。また、白と赤の線の間に4.7Kの抵抗を接続します。

次のコマンドを実行して読むことができます。

sudo modprobe w1-gpio
sudo modprobe w1-therm
cd /sys/bus/w1/devices/
ls

次に、温度センサーのシリアル番号をリストし、その後に w1_bus_master1

次に行きます:

cd serial-number-here
cat w1_slave

次に、2行のコードが表示されます。2行目の最後の5桁は温度です。

これは、「Dallas One-Wire Temperature Sensor Protocol」または何かと呼ばれるものを利用します。


1

私は現在この本を読んでいて気に入っています。その道を行く私のビジョンは、温度センサー、arduino、xbeeラジオを一緒に接着することです。リモートセンサーは、ホームステーションの範囲内であればどこでも使用できます。次に、ホームステーションには、ラズベリーと別のxbeeがあります。arduinoでホームステーションxbeeを使用してから、arduinoとrasberryを相互に通信させる方が簡単かもしれません。これにより、複数のリモートセンサーとさまざまな種類のセンサーを使用できます。


面白い。これについてもっと詳しく教えてください。私の質問を参照してください:raspberrypi.stackexchange.com/questions/38711/…そしてそこに返信してください:
Davide
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.