Làm thế nào để đo nhiệt độ?


44

Tôi có thể kết nối với RPi để đo nhiệt độ? Tôi nghĩ rằng các thiết bị được kết nối với I²C hoặc SPI sẽ có ý nghĩa nhất.

Dưới đây là câu hỏi về DHT-22 và các thiết bị 1 dây khác. Nhưng ở giai đoạn này, dường như 1 dây rất khó trên RPi do thời gian quan trọng


Tôi dự định làm theo hướng dẫn này từ Univ of Cambridge

Câu trả lời:


40

Đây là cách kết nối MCP9804 .

nhập mô tả hình ảnh ở đây

Bạn có thể sử dụng nó như thế này:

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

Chuyển đổi 0x67c1 sang nhiệt độ là một chút phức tạp. MSB là 0xc1 và LSB là 0x67

4 bit đầu tiên của MSB bị rơi và khiến nhiệt độ ở mức 16 độ

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

Ví dụ về Python
Ngoài việc tải các mô-đun i2c ở trên, bạn sẽ cần cài đặt gói python-smbus. Bạn có thể giảm khả năng tự làm nóng bằng cách tắt MCP9804 giữa các lần đọc.

#!/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()

Phiên bản của IC này bạn đã sử dụng? Tôi có một IC tương tự (MCP9808T) nhưng cửa hàng điện tử địa phương chỉ có phiên bản gói DFN. Tôi không biết làm thế nào để hàn nó trên bất cứ thứ gì mà không làm cho nó trở nên ngắn.
ikku

@ikku, tôi đã có MSOP 8 chân
John La Rooy

13

Bạn có thể sử dụng Raspberry Pi được tích hợp trong cổng nối tiếp và kết nối nó với IC nhiệt kế kỹ thuật số (ví dụ DS1620 )

Bạn có thể tìm hiểu giao tiếp cổng nối tiếp của Raspberry Pi tại đây

nhập mô tả hình ảnh ở đây

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

Quan trọng : Hãy nhớ UART RPi chạy ở TTL 3.3V - Cẩn thận không sử dụng Uart điện áp cao 5v / 12volt trực tiếp với RPi. Nó sẽ gây ra thiệt hại!


Nó dường như sử dụng giao diện 3 dây, do đó, không chỉ là vấn đề sử dụng cổng nối tiếp theo cách thông thường, mà dường như tương thích với GPIO
John La Rooy

AFAIK, việc cổng nối tiếp có Tx, Rx và CLK là bình thường. Tôi nghĩ SPI cần 3 dây quá SDO, SDO và SCLK. Tham khảo điều này cho biến thể SPI - liên kết DS1722 .
JeeShen Lee

Nhưng DS1620 sử dụng! RST, CLK và DQ. ! RST cao cho toàn bộ chuyển khoản, CLK là đồng hồ và DQ là dữ liệu hai chiều, do đó, nó khác với UART
John La Rooy

3
Tôi thích câu trả lời thay thế của bạn và đưa ra một chút cho bạn JeeSehn. Ngoài ra, tôi đã thêm cảnh báo cho những người dùng không có kỹ thuật hãy cẩn thận rằng UART trên RPi là 3,3v TTL và các USB khác nối tiếp có thể sử dụng 5v / 12 v! Làm hỏng RPI!
Piotr Kula

3

Tôi đã thử hai cách tiếp cận với cảm biến nhiệt độ. Đối với I2C, tôi đã sử dụng mô-đun TMP102 tương tự như mô tả của gnibbler. Đây là bài viết của tôi trên đó:

Đối với 1 dây, Adaf Berry gần đây đã phát hành có hình ảnh riêng và nó có hỗ trợ 1 dây. Tôi đã có thể đọc cảm biến nhiệt độ 1 dây DS18B20 với nó. Thêm chi tiết trong bài này :

Cuối cùng, một cách tiếp cận khác là sử dụng cảm biến nhiệt độ tương tự và ADC bên ngoài. Adaf Berry có một hướng dẫn tốt đẹp về điều này.


3

Một nhiệt kế "HID TEMPer" USB đơn giản, rẻ tiền cũng hoạt động và dễ dàng kết nối hơn với những người chưa sử dụng UARTs hoặc GPIO, như tôi.

Nhiệt kế USB TEMPer

RPi của tôi cung cấp đủ năng lượng để lái nó trực tiếp từ cổng USB mà không cần trung tâm.

Để thiết lập điều này với Raspbian Wheezy, tôi đã làm theo các hướng dẫn được viết cho Ubuntu (từ chối trách nhiệm: liên kết dành cho một bài đăng trên blog của riêng tôi). Đối với Raspberry Pi, tôi chỉ phải thực hiện một điều chỉnh nhỏ để cài đặt LIBUSB_LIBDIRkhi cài đặt Device::USBmô-đun perl để nó có thể tìm thấy libusbở vị trí cánh tay không chuẩn. Các hướng dẫn đầy đủ làm theo.

Để có được cách đọc đơn giản mà không cần bất kỳ nội dung munin nào , hãy cài đặt các phụ thuộc như sau (dưới dạng root):

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

Tạo 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();
}

Và chạy nó như root để xem đầu ra. Trong trường hợp của tôi, nó hơi lạnh trong nhà để xe tối nay:

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

2

Cái tôi đang sử dụng là DS18B20 .

Đầu tiên mở Pi và gõ:

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

Sau đó thêm từ untestedsau main.

Sau đó gõ:

sudo apt-get update
sudo apt-get upgrade

Trong trường hợp của tôi, nó mất nhiều thời gian, mặc dù nó phụ thuộc vào tốc độ wifi / ethernet của bạn. Sau đó, bạn khởi động lại:

sudo reboot now

Kết nối dây trắng với GPIO4, Dây đỏ đến 3V3 và đen với GND. Bạn cũng kết nối một điện trở 4,7K giữa các dây trắng và đỏ.

Bạn có thể đọc nó bằng cách thực hiện các lệnh sau:

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

Sau đó, nên liệt kê số sê-ri của cảm biến nhiệt độ, theo sau là w1_bus_master1

Rôi đi:

cd serial-number-here
cat w1_slave

Và sau đó nó sẽ hiển thị 2 dòng mã, trong đó 5 chữ số ở cuối dòng thứ hai là nhiệt độ.

Điều này sử dụng một cái gì đó gọi là "Giao thức cảm biến nhiệt độ một dây Dallas", hoặc một cái gì đó.


1

Tôi hiện đang đọc cuốn sách này và thích nó. Đi theo con đường đó, tầm nhìn của tôi là bạn sẽ có cảm biến nhiệt độ, arduino và radio xbee được dán lại với nhau. Đó là cảm biến từ xa của bạn có thể ở bất cứ đâu miễn là trong phạm vi của nhà ga. Sau đó cho các trạm nhà có một rasberry và một xbee khác. Tôi đoán rằng có thể dễ dàng hơn khi có xbee trạm nhà trên một arduino, và sau đó có arduino và rasberry nói chuyện với nhau. Cùng với đó, bạn có thể có nhiều cảm biến từ xa và các loại cảm biến khác nhau.


Hấp dẫn. Tôi muốn biết thêm chi tiết về điều này. Xem câu hỏi của tôi: raspberrypi.stackexchange.com/questions/38711/ và xin vui lòng trả lời tại đó :-)
Davide
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.