온도를 측정하는 방법?


44

온도를 측정하기 위해 RPi에 무엇을 연결할 수 있습니까? I²C 또는 SPI에 연결된 장치 가 가장 적합 하다고 생각합니다 .

다음은 DHT-22 및 기타 1- 와이어 장치에 대한 질문 입니다. 그러나이 단계에서 중요한 타이밍으로 인해 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도 온도가 유지됩니다.

(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 패키지 버전 만 있습니다. 나는 그것을 짧게 만들지 않고 어떤 것에 납땜하는 방법을 모른다.
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에서 작동합니다.-고전압 5v / 12volt Uart를 RPi에 직접 사용하지 않도록주의하십시오. 손상의 원인이됩니다!


3 와이어 인터페이스를 사용하는 것 같습니다. 따라서 일반적인 방법으로 직렬 포트를 사용하는 것이 아니라 GPIO와 호환되는 것 같습니다
John La Rooy

AFAIK, 직렬 포트에 Tx, Rx 및 CLK가있는 것은 정상입니다. SPI에는 SDO, SDO 및 SCLK와 같은 3 선이 필요하다고 생각합니다. SPI 변형-DS1722 링크에 대해서는 이것을 참조하십시오 .
JeeShen Lee

그러나 DS1620은! RST, CLK 및 DQ를 사용합니다. 하세요 RST는 전체 전송을위한 높은, CLK 시계이며이 UART에 다른 그래서 DQ는 양방향 데이터입니다
존 라 Rooy

3
나는 당신의 대안적인 대답을 좋아하고 당신에게 약간의 인상을주었습니다. 또한 기술이 아닌 사용자에게 RPi의 UART가 3.3v TTL이고 다른 USB- 직렬이 5v / 12v를 사용할 수 있다는 경고를 추가했습니다! RPI를 막으십시오!
피오트르 쿨라

3

온도 감지에 두 가지 접근 방식을 시도했습니다. I2C의 경우 gnibbler가 설명하는 것과 유사한 TMP102 모듈을 사용했습니다. 여기에 내 게시물 이 있습니다.

1 와이어의 경우, Adafruit는 최근 자체 이미지를 출시했으며 1 와이어 지원을 포함합니다. DS18B20 1- 와이어 온도 센서를 읽을 수있었습니다. 이 게시물대한 자세한 내용 :

마지막으로, 또 다른 방법은 아날로그 온도 센서와 외부 ADC를 사용하는 것입니다. Adafruit는 이에 대한 훌륭한 자습서 를 제공합니다.


3

간단하고 저렴한 USB "HID TEMPer"온도계도 작동하며 아직 나와 같은 UART 또는 GPIO를 사용하지 않는 사람들을 위해 훨씬 쉽게 연결할 수 있습니다.

숨겨 지은 TEMPer USB 온도계

내 RPi는 허브없이 USB 포트에서 직접 구동 할 수있는 충분한 전원을 공급합니다.

Raspbian Wheezy와 함께 이것을 설정하기 위해, 나는 우분투를 위해 쓰여진 이 지침 을 따랐습니다 (면책 조항 : 링크는 내 블로그에 게시 된 글입니다). Raspberry Pi의 LIBUSB_LIBDIR경우 Device::USB펄 모듈을 설치할 때 작은 비틀기 만 설정 하면 libusb비표준 암 위치에서 찾을 수 있습니다. 전체 지침은 다음과 같습니다.

munin 자료 없이 간단한 판독 값을 얻으려면 다음과 같이 종속성을 루트로 설치하십시오.

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

그런 다음 두 줄의 코드를 표시해야합니다. 두 번째 줄의 끝에서 5 자리는 온도입니다.

이것은 "Dallas 1-Wire 온도 센서 프로토콜"또는 무언가를 사용합니다.


1

나는 현재 읽고 있어요 이 책 과 같이합니다. 그 길을가는 것은 온도 센서, 아두 이노 및 xbee 라디오가 서로 붙어 있다는 것입니다. 그것이 홈 스테이션의 범위 안에있는 한 어디든있을 수있는 원격 센서입니다. 그런 다음 홈 스테이션에는 라스베리와 다른 xbee가 있습니다. 나는 arduino에 홈 스테이션 xbee를 가지고 있고 arduino와 rasberry가 서로 대화하는 것이 더 쉬울 수도 있다고 생각합니다. 이를 통해 여러 원격 센서와 다양한 유형의 센서를 사용할 수 있습니다.


흥미 롭군 이에 대한 자세한 내용을 원합니다. 내 질문을 참조하십시오 : raspberrypi.stackexchange.com/questions/38711/… 답장하십시오 :-)
Davide
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.