Come misurare la temperatura?


Risposte:


40

Ecco come collegare un MCP9804 .

inserisci qui la descrizione dell'immagine

Puoi usarlo in questo modo:

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

La conversione di 0x67c1 in una temperatura è un po 'contorta. MSB è 0xc1 e LSB è 0x67

I primi 4 bit dell'MSB vengono lasciati cadere e ciò lascia la temperatura in 16 ° di grado

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

Esempio di Python
Oltre a caricare i moduli i2c sopra, è necessario installare il pacchetto python-smbus. È possibile ridurre l'autoriscaldamento spegnendo l'MCP9804 tra le letture.

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

Quale versione di questo IC hai usato? Ho un IC simile (MCP9808T) ma il negozio di elettronica locale ha solo la versione del pacchetto DFN. Non ho idea di come saldarlo su qualcosa senza renderlo un grande corto.
ikku,

@ikku, avevo l'MSOP a 8 pin
John La Rooy il

13

È possibile utilizzare la porta seriale integrata Raspberry Pi e collegarla a un IC termometro digitale (ad esempio DS1620 )

Puoi trovare l'interfaccia della porta seriale di Raspberry Pi qui

inserisci qui la descrizione dell'immagine

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

Importante : Ricorda che RPi UART funziona a TTL 3.3V - Fai attenzione a non usare Uart ad alta tensione 5v / 12volt direttamente su RPi. Causerà danni!


Sembra usare un'interfaccia a 3 fili, quindi non è solo una questione di usare la porta seriale nel solito modo, ma sembra compatibile con i GPIO
John La Rooy,

AFAIK, è normale che la porta seriale abbia Tx, Rx e CLK. Penso che SPI abbia bisogno di 3 fili anche SDO, SDO e SCLK. Fare riferimento a questo per la variante SPI - collegamento DS1722 .
JeeShen Lee,

Ma il DS1620 utilizza! RST, CLK e DQ. Il! RST è alto per l'intero trasferimento, CLK è l'orologio e DQ sono dati bidirezionali, quindi è diverso da un UART
John La Rooy,

3
Mi piace la tua risposta alterativa e l'ho migliorata un po 'per te, JeeSehn. Inoltre ho aggiunto l'avvertimento per gli utenti non tecnici di fare attenzione che UART su RPi è 3.3 v TTL e che altri USB a seriale potrebbero usare 5 v / 12 v! Danneggia l'RPI!
Piotr Kula,

3

Ho provato due approcci al rilevamento della temperatura. Per I2C, ho usato un modulo TMP102 che è simile a quello che descrive Gnibbler. Ecco il mio post su questo:

Per 1 filo, Adafruit ha recentemente rilasciato una propria immagine e contiene un supporto a 1 filo. Sono stato in grado di leggere un sensore di temperatura a 1 filo DS18B20 con esso. Maggiori dettagli in questo post :

Infine, un altro approccio consiste nell'utilizzare un sensore di temperatura analogico e un ADC esterno. Adafruit ha un bel tutorial su questo.


3

Funziona anche un semplice termometro USB "HID TEMPer" economico ed è molto più facile da collegare per coloro che devono ancora giocherellare con UART o GPIO, come me.

TEMPERATURA NASCOSTA Termometro USB

Il mio RPi fornisce energia sufficiente per guidarlo direttamente dalla porta USB senza un hub.

Per configurarlo con Raspbian Wheezy, ho seguito queste istruzioni scritte per Ubuntu (dichiarazione di non responsabilità: il link è per un post sul mio blog). Per il Raspberry Pi, ho dovuto fare solo una piccola modifica da impostare LIBUSB_LIBDIRdurante l'installazione del Device::USBmodulo perl in modo che potesse trovarsi libusbnella posizione del braccio non standard. Seguono le istruzioni complete.

Per ottenere una lettura semplice senza alcuna roba di munin , installa le dipendenze come segue (come root):

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

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

Ed eseguilo come root per vedere l'output. Nel mio caso, stasera fa un po 'freddo in garage:

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

2

Quello che sto attualmente usando è il DS18B20 .

Per prima cosa apri il Pi e digita:

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

Quindi aggiungere la parola untesteddopo main.

Quindi digitare:

sudo apt-get update
sudo apt-get upgrade

Nel mio caso ci è voluto molto tempo, anche se dipende dalla tua velocità wifi / ethernet. Successivamente, riavvii:

sudo reboot now

Collega il filo bianco a GPIO4, il filo rosso a 3V3 e il nero a GND. È inoltre possibile collegare un resistore da 4,7 K tra i fili bianco e rosso.

Puoi leggerlo eseguendo i seguenti comandi:

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

Quindi è necessario elencare il numero seriale del sensore di temperatura, seguito da w1_bus_master1

Allora vai:

cd serial-number-here
cat w1_slave

E quindi dovrebbe mostrare 2 righe di codice, in cui le 5 cifre alla fine della seconda riga sono la temperatura.

Questo utilizza qualcosa chiamato "Dallas One-Wire Temperature Sensor Protocol", o qualcosa del genere.


1

Attualmente sto leggendo questo libro e mi piace. Seguendo questa strada la mia visione è che avresti incollato un sensore di temperatura, un arduino e una radio xbee. Questo è il tuo sensore remoto che potrebbe essere ovunque fintanto che si trova nel raggio della stazione di casa. Quindi per la stazione di casa hanno un lampone e un altro xbee. Immagino che potrebbe essere più facile avere anche l'homebase xbee su un arduino e quindi far parlare l'arduino e il rasberry. Con ciò potresti avere più sensori remoti e diversi tipi di sensori.


Interessante. Vorrei maggiori dettagli su questo. Vedi la mia domanda: raspberrypi.stackexchange.com/questions/38711/… e rispondi lì :-)
Davide,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.