วิธีวัดอุณหภูมิ


44

ฉันสามารถเชื่อมต่อกับ RPi เพื่อวัดอุณหภูมิได้อย่างไร ฉันคิดว่าอุปกรณ์ที่เชื่อมต่อกับI²CหรือSPIจะสมเหตุสมผลที่สุด

นี่คือคำถามเกี่ยวกับDHT-22และอุปกรณ์1 สายอื่น ๆ แต่ในขั้นตอนนี้ดูเหมือนว่า 1 สายจะยากสำหรับ RPi เนื่องจากการกำหนดเวลาที่สำคัญ


ฉันวางแผนที่จะติดตามบทช่วยสอนนี้จาก Univ of Cambridge

คำตอบ:


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 ฉันมี MSOP 8 พิน
John La 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 สายดังนั้นไม่ใช่แค่เรื่องของการใช้พอร์ตอนุกรมตามปกติ แต่ดูเหมือนว่าจะเข้ากันได้กับ GPIOs
John La Rooy

AFAIK เป็นเรื่องปกติที่พอร์ตอนุกรมจะมี Tx, Rx และ CLK ฉันคิดว่า SPI ต้องการสาย 3 เส้นเช่นกัน SDO, SDO และ SCLK อ้างถึงนี้สำหรับตัวแปร SPI - การ DS1722 ลิงค์
JeeShen Lee

แต่ DS1620 ใช้! RST, CLK และ DQ The! RST นั้นสูงสำหรับการถ่ายโอนทั้งหมด CLK เป็นนาฬิกาและ DQ เป็นข้อมูลสองทิศทางดังนั้นจึงแตกต่างจาก UART
John La Rooy

3
ฉันชอบคำตอบที่แปรเปลี่ยนของคุณและนำมาใส่คุณ JeeSehn นอกจากนี้ฉันได้เพิ่มคำเตือนสำหรับผู้ใช้ที่ไม่ใช่ด้านเทคนิคด้วยความระมัดระวังว่า UART บน RPi คือ 3.3v TTL และ USB อื่น ๆ ใน Serial อาจใช้ 5v / 12v! ทำลาย RPI!
Piotr Kula

3

ฉันลองสองวิธีในการตรวจจับอุณหภูมิ สำหรับ I2C ฉันใช้โมดูล TMP102 ซึ่งคล้ายกับที่ gnibbler อธิบาย นี่คือโพสต์ของฉันในที่:

สำหรับสาย 1 สาย Adafruit เพิ่งเปิดตัวภาพของตัวเองและมีการสนับสนุน 1 สาย ฉันสามารถอ่านเซ็นเซอร์อุณหภูมิ 1 สาย DS18B20 ได้ รายละเอียดเพิ่มเติมในโพสต์นี้ :

ในที่สุดอีกวิธีหนึ่งคือการใช้เซ็นเซอร์อุณหภูมิแบบอะนาล็อกและ ADC ภายนอก Adafruit มีบทช่วยสอนที่ดีเกี่ยวกับเรื่องนี้


3

เครื่องวัดอุณหภูมิ "HID TEMPer" แบบเรียบง่ายราคาถูกใช้งานได้และยังง่ายต่อการเชื่อมต่อสำหรับผู้ที่ยังไม่คุ้นเคยกับ UART หรือ GPIO เช่นฉัน

เครื่องวัดอุณหภูมิ HID TEMPer USB

My RPi ให้พลังงานเพียงพอที่จะขับโดยตรงจากพอร์ต USB โดยไม่ต้องใช้ฮับ

ในการตั้งค่านี้ด้วย Raspbian Wheezy ฉันทำตามคำแนะนำเหล่านี้ซึ่งเขียนขึ้นสำหรับ Ubuntu (ข้อจำกัดความรับผิดชอบ: ลิงก์มีไว้สำหรับโพสต์ในบล็อกของฉันเอง) สำหรับ Raspberry Pi ฉันต้องตั้งค่าเล็ก ๆ เพียงอันเดียวเพื่อLIBUSB_LIBDIRติดตั้งเมื่อติดตั้งDevice::USBโมดูล Perl เพื่อให้สามารถหาได้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

แล้วเพิ่มคำว่าหลังจากที่untestedmain

จากนั้นพิมพ์:

sudo apt-get update
sudo apt-get upgrade

ในกรณีของฉันมันใช้เวลานานแม้ว่ามันจะขึ้นอยู่กับความเร็ว wifi / อีเธอร์เน็ตของคุณ หลังจากนั้นคุณรีบูท:

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 บรรทัดโดยที่ 5 หลักที่ท้ายบรรทัดที่สองคืออุณหภูมิ

สิ่งนี้ใช้สิ่งที่เรียกว่า "Dallas One-Wire Temperature Sensor Protocol" หรือบางอย่าง


1

ฉันกำลังอ่านหนังสือเล่มนี้และชอบมัน การไปตามเส้นทางวิสัยทัศน์ของฉันก็คือคุณจะต้องมีเซ็นเซอร์อุณหภูมิ, aarduino และวิทยุ xbee ติดกัน นั่นคือเซ็นเซอร์ระยะไกลของคุณซึ่งสามารถอยู่ได้ทุกที่ตราบเท่าที่อยู่ในระยะสถานีบ้าน จากนั้นสำหรับสถานีที่บ้านมีราสเบอร์รี่และ xbee อีก ฉันเดาว่ามันอาจจะง่ายกว่าที่จะมี home station xbee บน arduino จากนั้นให้ arduino และ rasberry คุยกัน เมื่อคุณมีเซ็นเซอร์ระยะไกลหลายตัวและเซ็นเซอร์ประเภทต่างๆ


น่าสนใจ ฉันต้องการรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนี้ ดูคำถามของฉัน: raspberrypi.stackexchange.com/questions/38711/...และโปรดตอบกลับมี :-)
Davide
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.