Wie misst man die Temperatur?


44

Was kann ich mit dem RPi verbinden, um die Temperatur zu messen? Ich denke, Geräte, die an den I²C oder SPI angeschlossen sind, wären am sinnvollsten.

Hier ist eine Frage zu DHT-22 und anderen 1-Draht- Geräten. In diesem Stadium scheint es jedoch schwierig zu sein, das RPi mit 1-Draht zu beschalten, da die Timings kritisch sind


Antworten:


40

So schließen Sie einen MCP9804 an .

Bildbeschreibung hier eingeben

Du kannst es so benutzen:

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

Das Umwandeln von 0x67c1 in eine Temperatur ist etwas kompliziert. Das MSB ist 0xc1 und das LSB ist 0x67

Die ersten 4 Bits des MSB werden verworfen und verlassen die Temperatur in 16stel Grad

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

Python-Beispiel
Zusätzlich zum Laden der oben genannten i2c-Module müssen Sie das Paket python-smbus installieren. Sie können die Selbsterwärmung verringern, indem Sie den MCP9804 zwischen den Messungen ausschalten.

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

Welche Version dieses ICs haben Sie verwendet? Ich habe einen ähnlichen IC (den MCP9808T), aber der lokale Elektronikladen hat nur die DFN-Paketversion. Ich habe keine Ahnung, wie ich das auf irgendetwas löten kann, ohne es zu einem großen Kurzschluss zu machen.
Ikku

@ikku, ich hatte die 8-polige MSOP
John La Rooy

13

Sie können den integrierten seriellen Anschluss des Raspberry Pi verwenden und ihn an einen digitalen Thermometer-IC (z. B. DS1620 ) anschließen.

Sie können eine Schnittstelle von Raspberry Pi serielle Schnittstelle finden Sie heraus , hier

Bildbeschreibung hier eingeben

  • P1 (UNTEN LINKS) - 3,3 V
  • P6 - GND
  • P8 GPIO14 - TX
  • P10 GPIO15 - RX

Wichtig : Denken Sie daran, dass der RPi-UART mit einer TTL von 3,3 V betrieben wird. Achten Sie darauf, dass Sie keine Hochspannungs-Uarts mit 5 V / 12 V direkt an den RPi anschließen. Es wird Schaden anrichten!


Es scheint eine 3-Draht-Schnittstelle zu verwenden, es geht also nicht nur darum, die serielle Schnittstelle auf die übliche Weise zu verwenden, sondern es scheint auch mit den GPIOs kompatibel zu sein
John La Rooy,

AFAIK, es ist normal, dass die serielle Schnittstelle Tx, Rx und CLK hat. Ich denke, dass SPI 3 Drähte zu SDO, SDO und SCLK benötigt. Hier finden Sie die SPI-Variante - DS1722- Link .
JeeShen Lee

Der DS1620 verwendet jedoch! RST, CLK und DQ. Das! RST ist für die gesamte Übertragung hoch, CLK ist die Uhr und DQ sind bidirektionale Daten, daher unterscheidet es sich von einem UART
John La Rooy

3
Ich mag deine alternative Antwort und habe sie für dich ein bisschen verbessert, JeeSehn. Außerdem habe ich eine Warnung für nicht-technische Benutzer hinzugefügt, um darauf zu achten, dass der UART auf RPi 3,3 V TTL ist und dass andere USB-zu-Seriell-Geräte möglicherweise 5 V / 12 V verwenden! Zerstöre das RPI!
Piotr Kula

3

Ich habe zwei Ansätze zur Temperaturmessung ausprobiert. Für I2C habe ich ein TMP102-Modul verwendet, das dem ähnelt, was der Gnibbler beschreibt. Hier ist mein Beitrag dazu :

Für 1-Wire hat Adafruit kürzlich ein eigenes Image veröffentlicht, das 1-Wire-Unterstützung enthält. Ich konnte damit einen DS18B20 1-Draht-Temperatursensor auslesen. Weitere Details in diesem Beitrag :

Schließlich besteht ein anderer Ansatz darin, einen analogen Temperatursensor und einen externen ADC zu verwenden. Adafruit hat ein nettes Tutorial dazu.


3

Ein einfaches, billiges USB "HID TEMPer" -Thermometer funktioniert auch und ist viel einfacher anzuschließen für diejenigen, die noch nicht mit UARTs oder GPIOs experimentiert haben, wie ich.

HID TEMPer USB-Thermometer

Mein RPi bietet genügend Strom, um es ohne Hub direkt über den USB-Anschluss zu betreiben.

Um dies mit Raspbian Wheezy einzurichten, folgte ich diesen Anweisungen, die für Ubuntu geschrieben wurden (Haftungsausschluss: Link ist für einen Beitrag in meinem eigenen Blog). Für den Raspberry Pi musste ich nur eine kleine Änderung vornehmen, um LIBUSB_LIBDIRdas Device::USBPerl-Modul so zu installieren, dass es sich libusban der nicht standardmäßigen Armposition befindet. Die vollständigen Anweisungen folgen.

Installieren Sie die Abhängigkeiten wie folgt (als root), um eine einfache Lesung ohne Munin-Inhalte zu erhalten :

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

Erstellen 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();
}

Führen Sie das als root aus, um die Ausgabe zu sehen. In meinem Fall ist es heute Abend ein bisschen kühl in der Garage:

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

2

Das, was ich gerade benutze, ist das DS18B20 .

Öffne zuerst den Pi und tippe:

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

Dann fügen Sie das Wort untesteddanach hinzu main.

Dann tippe:

sudo apt-get update
sudo apt-get upgrade

In meinem Fall hat es lange gedauert, obwohl es von Ihrer WLAN / Ethernet-Geschwindigkeit abhängt. Danach starten Sie neu:

sudo reboot now

Verbinden Sie das weiße Kabel mit GPIO4, das rote Kabel mit 3V3 und das schwarze Kabel mit GND. Sie schließen auch einen 4,7-K-Widerstand zwischen dem weißen und dem roten Draht an.

Sie können es lesen, indem Sie die folgenden Befehle ausführen:

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

Dann sollte die Seriennummer des Temperatursensors angegeben werden, gefolgt von w1_bus_master1

Dann geh:

cd serial-number-here
cat w1_slave

Und dann sollte es 2 Codezeilen anzeigen, wobei die 5 Ziffern am Ende der zweiten Zeile die Temperatur sind.

Hierfür wird das sogenannte "Dallas One-Wire Temperature Sensor Protocol" verwendet.


1

Ich lese gerade dieses Buch und mag es. Wenn Sie diesen Weg gehen, ist meine Vision, dass Sie einen Temperatursensor, einen Arduino und ein Xbee-Radio haben, die zusammengeklebt sind. Das ist Ihr Fernbedienungssensor, der überall sein kann, solange er sich in Reichweite der Wohnungsstation befindet. Dann für die Wohnungsstation eine Himbeere und ein anderes xbee haben. Ich vermute, dass es vielleicht einfacher ist, die Heimstation xbee auf einem Arduino zu haben und dann Arduino und Rasberry miteinander zu sprechen. Damit könnten Sie mehrere Fernsensoren und verschiedene Arten von Sensoren haben.


Interessant. Ich hätte gerne mehr Details dazu. Siehe meine Frage: raspberrypi.stackexchange.com/questions/38711/… und antworten Sie dort :-)
Davide
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.