Yanıtlar:
İşte bir MCP9804'ü nasıl bağlayacağınız .
Bu şekilde kullanabilirsiniz:
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'in bir sıcaklığa dönüştürülmesi biraz sarmaldır. MSB 0xc1 ve LSB 0x67'dir
MSB'nin ilk 4 biti düşürülür ve sıcaklık bir derecenin 16'sında bırakılır.
(0xc1&0xf)*16+0x67/16.0 = 22.4375 degrees
Python Örneği
Yukarıdaki i2c modüllerini yüklemeye ek olarak, python-smbus paketini de kurmanız gerekir. MCP9804'ü okumalar arasında kapatarak kendinden ısıtmayı azaltabilirsiniz.
#!/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()
Seri portta yerleşik olan Raspberry Pi'yi kullanabilir ve bunu bir dijital termometre IC'sine bağlayabilirsiniz (örn. DS1620 )
Raspberry Pi'nin seri port arabirimini burada bulabilirsiniz
Önemli : RPi UART'in TTL 3.3V'da çalıştığını unutmayın - Yüksek Voltaj 5v / 12volt Uart'ı doğrudan RPi'ye kullanmamaya dikkat edin. Zarar verir!
Sıcaklık algılamaya iki yaklaşım denedim. I2C için, gnibbler'in anlattıklarına benzer bir TMP102 modülü kullandım. İşte bu benim yazı :
1 telli için Adafruit kısa süre önce orada kendi imajını yayınladı ve 1 telli destek içeriyor. Onunla bir DS18B20 1 kablolu sıcaklık sensörü okuyamadım. Bu yazıda daha fazla detay :
Son olarak, başka bir yaklaşım analog sıcaklık sensörü ve harici bir ADC kullanmaktır. Adafruit'un bu konuda iyi bir rehberi var.
Basit, ucuz bir USB "HID TEMPer" termometresi de çalışır ve benim gibi UART'larla veya GPIO'larla oynamayı sevenler için bağlantı kurmak çok daha kolaydır.
RPi'm, hub olmadan doğrudan USB portundan sürmek için yeterli güç sağlar.
Bunu Raspbian Wheezy ile kurmak için Ubuntu için yazılmış olan talimatları izledim (sorumluluk reddi: bağlantı kendi blogumdaki bir yazı için). Ahududu Pi için, perl modülünü LIBUSB_LIBDIR
kurarken standart dışı kol konumunda Device::USB
bulabilmek için sadece küçük bir ayar yapmak zorunda kaldım libusb
. Talimatların tamamı takip edilir.
Munin hiçbir şey olmadan basit bir okuma almak için, bağımlılıkları aşağıdaki gibi kurun (root olarak):
apt-get install libusb-dev
export LIBUSB_LIBDIR=/usr/lib/arm-linux-gnueabihf
cpan Inline::MakeMaker
cpan Device::USB::PCSensor::HidTEMPer
Yarat 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();
}
Ve çıktıyı görmek için bunu root olarak çalıştırın. Benim durumumda, bu akşam garajda biraz serin:
day@pi:~$ sudo ./readtemp.pl
16.5
Şu anda kullanıyorum biri DS18B20 .
Önce Pi'yi açın ve şunu yazın:
sudo leafpad /etc/apt/sources.list.d/raspi.list
Sonra sözcüğü untested
sonra ekleyin main
.
Sonra şunu yazın:
sudo apt-get update
sudo apt-get upgrade
Benim durumumda wifi / ethernet hızına bağlı olmasına rağmen, uzun zaman aldı. Ondan sonra, yeniden başlatıyorsun:
sudo reboot now
Beyaz kabloyu GPIO4'e, Kırmızı kabloyu 3V3'e ve siyahı GND'ye bağlayın. Ayrıca beyaz ve kırmızı kablolar arasına 4,7K'lık bir direnç bağlayın.
Aşağıdaki komutları kullanarak okuyabilirsiniz:
sudo modprobe w1-gpio
sudo modprobe w1-therm
cd /sys/bus/w1/devices/
ls
Sonra sıcaklık sensörünün seri numarasını listelemeli, ardından w1_bus_master1
Sonra gidin:
cd serial-number-here
cat w1_slave
Ve sonra 2 satır kod göstermelidir, burada ikinci satırın sonundaki 5 hane sıcaklıktır.
Bu, "Dallas Tek Telli Sıcaklık Sensörü Protokolü" denilen bir şey veya başka bir şey kullanır.
Şu anda bu kitabı okuyorum ve beğendim. Bu rotaya gitmek, benim görüşüme göre, bir sıcaklık sensörü, bir arduino ve bir yapıştırılmış xbee radyoya sahip olmanız. Bu, ev istasyonunun menzili içinde olduğu sürece herhangi bir yerde olabilecek uzaktan kumanda sensörünüzdür. Sonra ev istasyonunda bir ahududu ve başka bir xbee var. Arduino'da ana istasyonun xbee'sini almanın ve arduino ile rasberry'nin birbiriyle konuşmasının daha kolay olacağını tahmin ediyorum. Bununla, birden fazla uzak sensöre ve farklı sensör türlerine sahip olabilirsiniz.