Como medir a temperatura?

Respostas:

40

Veja como conectar um MCP9804 .

insira a descrição da imagem aqui

Você pode usá-lo assim:

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

Converter 0x67c1 em uma temperatura é um pouco complicado. O MSB é 0xc1 e o LSB é 0x67

Os primeiros 4 bits do MSB são descartados e deixam a temperatura em 16º de grau

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

Exemplo de Python
Além de carregar os módulos i2c acima, você precisará instalar o pacote python-smbus. Você pode reduzir o auto-aquecimento desligando o MCP9804 entre as leituras.

#!/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
fonte
Qual versão deste IC você usou? Eu tenho um IC semelhante (o MCP9808T), mas a loja de eletrônicos local possui apenas a versão do pacote DFN. Não tenho idéia de como soldar isso em qualquer coisa sem torná-lo um grande short.
Ikku
@ikku, eu tinha o MSOP de 8 pinos
John La Rooy
13

Você pode usar a porta serial integrada do Raspberry Pi e conectá-lo a um termômetro digital IC (por exemplo, DS1620 )

Você pode descobrir a interface de porta serial do Raspberry Pi aqui

insira a descrição da imagem aqui

  • P1 (INFERIOR ESQUERDO) - 3.3V
  • P6 - GND
  • P8 GPIO14 - TX
  • P10 GPIO15 - RX

Importante : Lembre-se de que o RPi UART é executado em TTL 3.3V - Cuidado para não usar o Uart de alta tensão 5v / 12volt direto ao RPi. Isso causará danos!

JeeShen Lee
fonte
Ele parece usar uma interface de 3 fios, por isso não é apenas uma questão de usar a porta serial da maneira usual, mas parece compatível com os GPIOs
John La Rooy
AFAIK, é normal que a porta serial tenha Tx, Rx e CLK. Eu acho que o SPI também precisa de 3 fios SDO, SDO e SCLK. Consulte isso para o link da variante SPI - DS1722 .
JeeShen Lee
Mas o DS1620 usa! RST, CLK e DQ. ! A RST é alto para toda a transferência, CLK é o relógio e DQ é bidirecional de dados, por isso é diferente de um UART
John La Rooy
3
Gosto da sua resposta alteradora e a importei um pouco para você, JeeSehn. Também adicionei um aviso para usuários não técnicos, para ter cuidado para que o UART no RPi seja 3.3v TTL e que outro USB para serial possa usar 5v / 12v! Dane-se o RPI!
Piotr Kula
3

Eu tentei duas abordagens para detecção de temperatura. Para o I2C, usei um módulo TMP102 que é semelhante ao que o gnibbler descreve. Aqui está o meu post sobre isso:

Para um fio, a Adafruit lançou recentemente sua própria imagem e contém suporte para um fio. Consegui ler um sensor de temperatura DS18B20 de 1 fio com ele. Mais detalhes neste post :

Finalmente, outra abordagem é usar o sensor de temperatura analógico e um ADC externo. Adafruit tem um bom tutorial sobre isso.

pdp7
fonte
3

Um termômetro USB "HID TEMPer" simples e barato também funciona, e é muito mais fácil conectar-se àqueles que ainda precisam mexer em UARTs ou GPIO, como eu.

Termômetro HID TEMPer USB

O meu RPi fornece energia suficiente para conduzi-lo diretamente da porta USB sem um hub.

Para configurar isso com o Raspbian Wheezy, segui estas instruções que foram escritas para o Ubuntu (aviso: link é para uma postagem no meu próprio blog). Para o Raspberry Pi, eu só precisei fazer um pequeno ajuste ao LIBUSB_LIBDIRinstalar o Device::USBmódulo perl, para que ele pudesse ser encontrado libusbem um local fora do padrão. As instruções completas seguem.

Para obter uma leitura simples sem nenhum dos itens munin , instale as dependências da seguinte maneira (como root):

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

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

E execute isso como root para ver a saída. No meu caso, está um pouco frio na garagem esta noite:

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

O que estou usando atualmente é o DS18B20 .

Primeiro abra o Pi e digite:

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

Em seguida, adicione a palavra untesteddepois main.

Então digite:

sudo apt-get update
sudo apt-get upgrade

No meu caso, demorou muito tempo, apesar de depender da velocidade do seu wifi / ethernet. Depois disso, você reinicia:

sudo reboot now

Conecte o fio branco ao GPIO4, o fio vermelho a 3V3 e o preto ao GND. Você também conecta um resistor de 4,7 K entre os fios branco e vermelho.

Você pode lê-lo executando os seguintes comandos:

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

Em seguida, deve listar o número de série do sensor de temperatura, seguido de w1_bus_master1

Então vá:

cd serial-number-here
cat w1_slave

E então deve mostrar 2 linhas de código, onde os 5 dígitos no final da segunda linha são a temperatura.

Isso utiliza algo chamado "Protocolo de sensor de temperatura de um fio de Dallas" ou algo assim.

Kachamenus
fonte
1

Atualmente, estou lendo este livro e gostei. Seguindo esse caminho, minha visão é que você teria um sensor de temperatura, um arduino e um rádio xbee colados. Esse é o seu sensor remoto, que pode estar em qualquer lugar, desde que esteja ao alcance da estação doméstica. Em seguida, para a estação de casa tem um rasberry e outro xbee. Suponho que talvez seja mais fácil também ter a estação doméstica xbee em um arduino e depois fazer com que o arduino e o rasberry conversem entre si. Com isso, você pode ter vários sensores remotos e diferentes tipos de sensores.

grumoso
fonte
Interessante. Eu gostaria de mais detalhes sobre isso. Veja minha pergunta: raspberrypi.stackexchange.com/questions/38711/… e responda lá :-)
Davide