ฉันสามารถเชื่อมต่อกับ RPi เพื่อวัดอุณหภูมิได้อย่างไร ฉันคิดว่าอุปกรณ์ที่เชื่อมต่อกับI²CหรือSPIจะสมเหตุสมผลที่สุด
นี่คือคำถามเกี่ยวกับDHT-22และอุปกรณ์1 สายอื่น ๆ แต่ในขั้นตอนนี้ดูเหมือนว่า 1 สายจะยากสำหรับ RPi เนื่องจากการกำหนดเวลาที่สำคัญ
ฉันสามารถเชื่อมต่อกับ RPi เพื่อวัดอุณหภูมิได้อย่างไร ฉันคิดว่าอุปกรณ์ที่เชื่อมต่อกับI²CหรือSPIจะสมเหตุสมผลที่สุด
นี่คือคำถามเกี่ยวกับDHT-22และอุปกรณ์1 สายอื่น ๆ แต่ในขั้นตอนนี้ดูเหมือนว่า 1 สายจะยากสำหรับ RPi เนื่องจากการกำหนดเวลาที่สำคัญ
คำตอบ:
คุณสามารถใช้สิ่งนี้:
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()
คุณสามารถใช้ Raspberry Pi ที่สร้างขึ้นในพอร์ตอนุกรมและเชื่อมต่อกับ IC ปรอทวัดไข้แบบดิจิตอล (เช่นDS1620 )
คุณสามารถค้นหาการเชื่อมต่อพอร์ตอนุกรมของ Raspberry Pi ได้ที่นี่
สำคัญ : จำ RPi UART ทำงานที่ TTL 3.3V - ระวังอย่าใช้แรงดันสูง 5v / 12volt Uart ตรงไปยัง RPi มันจะทำให้เกิดความเสียหาย!
ฉันลองสองวิธีในการตรวจจับอุณหภูมิ สำหรับ I2C ฉันใช้โมดูล TMP102 ซึ่งคล้ายกับที่ gnibbler อธิบาย นี่คือโพสต์ของฉันในที่:
สำหรับสาย 1 สาย Adafruit เพิ่งเปิดตัวภาพของตัวเองและมีการสนับสนุน 1 สาย ฉันสามารถอ่านเซ็นเซอร์อุณหภูมิ 1 สาย DS18B20 ได้ รายละเอียดเพิ่มเติมในโพสต์นี้ :
ในที่สุดอีกวิธีหนึ่งคือการใช้เซ็นเซอร์อุณหภูมิแบบอะนาล็อกและ ADC ภายนอก Adafruit มีบทช่วยสอนที่ดีเกี่ยวกับเรื่องนี้
เครื่องวัดอุณหภูมิ "HID TEMPer" แบบเรียบง่ายราคาถูกใช้งานได้และยังง่ายต่อการเชื่อมต่อสำหรับผู้ที่ยังไม่คุ้นเคยกับ UART หรือ GPIO เช่นฉัน
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
ก่อนเปิด Pi และประเภท:
sudo leafpad /etc/apt/sources.list.d/raspi.list
แล้วเพิ่มคำว่าหลังจากที่untested
main
จากนั้นพิมพ์:
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" หรือบางอย่าง
ฉันกำลังอ่านหนังสือเล่มนี้และชอบมัน การไปตามเส้นทางวิสัยทัศน์ของฉันก็คือคุณจะต้องมีเซ็นเซอร์อุณหภูมิ, aarduino และวิทยุ xbee ติดกัน นั่นคือเซ็นเซอร์ระยะไกลของคุณซึ่งสามารถอยู่ได้ทุกที่ตราบเท่าที่อยู่ในระยะสถานีบ้าน จากนั้นสำหรับสถานีที่บ้านมีราสเบอร์รี่และ xbee อีก ฉันเดาว่ามันอาจจะง่ายกว่าที่จะมี home station xbee บน arduino จากนั้นให้ arduino และ rasberry คุยกัน เมื่อคุณมีเซ็นเซอร์ระยะไกลหลายตัวและเซ็นเซอร์ประเภทต่างๆ