Jak mierzyć temperaturę?

Odpowiedzi:

40

Oto jak podłączyć MCP9804 .

wprowadź opis zdjęcia tutaj

Możesz użyć tego w następujący sposób:

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

Konwersja 0x67c1 na temperaturę jest nieco skomplikowana. MSB to 0xc1, a LSB to 0x67

Pierwsze 4 bity MSB są upuszczane, co pozostawia temperaturę w 16 stopniach

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

Przykład Pythona
Oprócz ładowania powyższych modułów i2c, musisz zainstalować pakiet python-smbus. Możesz ograniczyć samonagrzewanie, wyłączając MCP9804 między odczytami.

#!/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()
John La Rooy
źródło
Jakiej wersji tego układu scalonego używałeś? Mam podobny układ scalony (MCP9808T), ale lokalny sklep z elektroniką ma tylko wersję pakietu DFN. Nie mam pojęcia, jak to przylutować na czymkolwiek, nie czyniąc tego jednym wielkim zwarciem.
ikku
@ikku, miałem 8-pinowy MSOP
John La Rooy,
13

Możesz użyć wbudowanego portu szeregowego Raspberry Pi i podłączyć go do termometru cyfrowego IC (np. DS1620 )

Możesz znaleźć interfejs Raspberry Pi do portu szeregowego tutaj

wprowadź opis zdjęcia tutaj

  • P1 (LEWY DOLNY) - 3,3 V.
  • P6 - GND
  • P8 GPIO14 - TX
  • P10 GPIO15 - RX

Ważne : Pamiętaj, że RPi UART działa przy TTL 3,3 V - Uważaj, aby nie używać wysokiego napięcia 5 V / 12 V Uart bezpośrednio do RPi. Spowoduje to uszkodzenie!

JeeShen Lee
źródło
Wygląda na to, że używa 3-przewodowego interfejsu, więc nie chodzi tylko o zwykłe korzystanie z portu szeregowego, ale wydaje się kompatybilny z GPIO
John La Rooy,
AFAIK, to normalne, że port szeregowy ma Tx, Rx i CLK. Myślę, że SPI potrzebuje również 3 przewodów SDO, SDO i SCLK. Odwołaj się do wariantu SPI - łącze DS1722 .
JeeShen Lee,
Ale DS1620 używa! RST, CLK i DQ. ! RST jest wysoki dla całego transferu, CLK jest zegarem, a DQ to dane dwukierunkowe, więc różni się od UART
John La Rooy
3
Podoba mi się twoja alternatywna odpowiedź i podniosłem ją nieco dla ciebie JeeSehn. Dodałem także ostrzeżenie dla użytkowników nietechnicznych, aby uważali, że UART na RPi wynosi 3,3 V TTL i że inne USB do Szeregowego może używać 5 V / 12 V! Damage RPI!
Piotr Kula,
3

Próbowałem dwóch podejść do wykrywania temperatury. Do I2C użyłem modułu TMP102, który jest podobny do tego, co opisuje gnibbler. Oto mój post na ten temat:

W przypadku 1-wire Adafruit opublikował niedawno swój własny obraz i zawiera obsługę 1-wire. Byłem w stanie odczytać z nim 1-przewodowy czujnik temperatury DS18B20. Więcej szczegółów w tym poście :

Wreszcie, innym podejściem jest użycie analogowego czujnika temperatury i zewnętrznego ADC. Adafruit ma fajny samouczek na ten temat.

pdp7
źródło
3

Działa również prosty, tani termometr USB „HID TEMPer” i jest znacznie łatwiejszy do podłączenia dla tych, którzy jeszcze nie majstrują przy UART lub GPIO, takich jak ja.

HID TEMPer USB termometr

Moje RPi zapewnia wystarczającą moc, aby prowadzić go bezpośrednio z portu USB bez koncentratora.

Aby skonfigurować to w Raspbian Wheezy, postępowałem zgodnie z instrukcjami napisanymi dla Ubuntu (zastrzeżenie: link dotyczy posta na moim blogu). W przypadku Raspberry Pi musiałem dokonać tylko jednego drobnego ulepszenia LIBUSB_LIBDIRpodczas instalacji Device::USBmodułu perla, aby mógł znaleźć się libusbw niestandardowej lokalizacji ramienia. Poniżej znajdują się pełne instrukcje.

Aby uzyskać prosty odczyt bez żadnych Munin , zainstaluj zależności w następujący sposób (jako root):

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

Utwórz 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();
}

I uruchom to jako root, aby zobaczyć wynik. W moim przypadku wieczorem w garażu jest trochę chłodno:

day@pi:~$ sudo ./readtemp.pl 
16.5
Dzień
źródło
2

Obecnie używam DS18B20 .

Najpierw otwórz Pi i wpisz:

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

Następnie dodaj słowo untestedpo main.

Następnie wpisz:

sudo apt-get update
sudo apt-get upgrade

W moim przypadku zajęło to dużo czasu, choć zależy to od prędkości twojego Wi-Fi / Ethernet. Następnie uruchom ponownie:

sudo reboot now

Podłącz biały przewód do GPIO4, czerwony przewód do 3V3, a czarny do GND. Podłączysz również rezystor 4,7 K między białymi i czerwonymi przewodami.

Możesz go przeczytać, wykonując następujące polecenia:

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

Następnie należy podać numer seryjny czujnika temperatury, a następnie w1_bus_master1

Więc idź:

cd serial-number-here
cat w1_slave

A potem powinien pokazać 2 wiersze kodu, gdzie 5 cyfr na końcu drugiego wiersza to temperatura.

Wykorzystuje to coś zwanego „protokołem jednoprzewodowego czujnika temperatury Dallas” lub coś takiego.

Kachamenus
źródło
1

Obecnie czytam tę książkę i podoba mi się. Idąc tą drogą, widzę, że sklejono ze sobą czujnik temperatury, arduino i radio xbee. To twój zdalny czujnik, który może znajdować się w dowolnym miejscu, o ile znajduje się w zasięgu stacji domowej. Następnie na stacji domowej mają rasberry i kolejny xbee. Zgaduję, że może być łatwiej mieć również XBee stacji domowej na arduino, a następnie rozmawiać ze sobą arduino i rasberry. Dzięki temu możesz mieć wiele zdalnych czujników i różne typy czujników.

lumpynose
źródło
Ciekawy. Chciałbym więcej szczegółów na ten temat. Zobacz moje pytanie: raspberrypi.stackexchange.com/questions/38711/... i proszę tam odpowiedzieć :-)
Davide