Как измерить температуру?

44

Что я могу подключить к RPi для измерения температуры? Я думаю, что устройства, подключенные к I²C или SPI , имеют больше смысла.

Вот вопрос про DHT-22 и другие однопроводные устройства. Но на данном этапе кажется, что 1-проводной на RPi затруднен из-за критического времени

Джон Ла Рой
источник
Я планирую следовать этому

Ответы:

40

Вот как подключить MCP9804 .

введите описание изображения здесь

Вы можете использовать это так:

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 в температуру немного запутано. MSB - 0xc1, а LSB - 0x67.

Первые 4 бита MSB сбрасываются, и это оставляет температуру в 16-х градусах

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

Пример Python
В дополнение к загрузке модулей i2c, описанных выше, вам необходимо установить пакет python-smbus. Вы можете уменьшить самонагрев, выключая MCP9804 между показаниями.

#!/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()
Джон Ла Рой
источник
Какую версию этой микросхемы вы использовали? У меня есть аналогичная микросхема (MCP9808T), но в местном магазине электроники есть только версия пакета DFN. Я понятия не имею, как спаять это на чем-то, не делая это одним большим коротким замыслом
Икку
@ikku, у меня был 8-контактный MSOP
Джон Ла Рой
13

Вы можете использовать встроенный последовательный порт Raspberry Pi и подключить его к ИС цифрового термометра (например, DS1620 ).

Вы можете узнать интерфейс последовательного порта Raspberry Pi здесь

введите описание изображения здесь

  • P1 (левое дно) - 3,3 В
  • P6 - GND
  • P8 GPIO14 - TX
  • P10 GPIO15 - RX

Важно : помните, что RPI UART работает при TTL 3,3 В - будьте осторожны, не используйте высоковольтный 5 В / 12 вольт Uart прямо на RPi. Это приведет к повреждению!

JeeShen Lee
источник
Кажется, он использует 3-х проводный интерфейс, так что дело не только в использовании последовательного порта обычным способом, но и в совместимости с GPIO
John La Rooy
AFAIK, для последовательного порта нормально иметь Tx, Rx и CLK. Я думаю, что SPI нужно 3 провода тоже SDO, SDO и SCLK. См. Это для варианта SPI - ссылка DS1722 .
JeeShen Lee
Но DS1620 использует! RST, CLK и DQ. Величина! RST высока для всей передачи, CLK - это часы, а DQ - двунаправленные данные, поэтому он отличается от UART
Джон Ла Руи,
3
Мне нравится ваш альтернативный ответ, и я немного его обострил, Джизен. Также я добавил предупреждение для не технических пользователей, чтобы быть осторожным, что UART на RPi составляет 3.3 В TTL и что другие USB для последовательного порта могут использовать 5 В / 12 В! Черт возьми RPI!
Петр Кула
3

Я попробовал два подхода к измерению температуры. Для I2C я использовал модуль TMP102, который похож на то, что описывает gnibbler. Вот мой пост об этом:

Для 1-wire Adafruit недавно выпустил собственное изображение, которое содержит поддержку 1-wire. Я смог прочитать с него однопроводный датчик температуры DS18B20. Подробнее в этом посте :

Наконец, другой подход заключается в использовании аналогового датчика температуры и внешнего АЦП. У Adafruit есть хороший учебник по этому вопросу.

PDP7
источник
3

Также работает простой дешевый USB-термометр «HID TEMPer», и его гораздо проще подключить тем, кто еще не начал играть с UART или GPIO, как я.

HID TEMPer USB-термометр

Мой RPi обеспечивает достаточную мощность, чтобы управлять им напрямую с USB-порта без концентратора.

Чтобы настроить это с помощью Raspbian Wheezy, я следовал инструкциям, написанным для Ubuntu (заявление об отказе: ссылка на пост в моем собственном блоге). Для Raspberry Pi мне нужно было всего лишь сделать один небольшой твик для установки LIBUSB_LIBDIRпри установке Device::USBмодуля perl, чтобы он мог найти libusbв нестандартном расположении руки. Полные инструкции следуют.

Чтобы получить простое чтение без какого-либо материала munin , установите зависимости следующим образом (от имени пользователя root):

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

Создать 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();
}

И запустите это как root, чтобы увидеть вывод. В моем случае сегодня вечером в гараже немного холодно:

day@pi:~$ sudo ./readtemp.pl 
16.5
День
источник
2

В настоящее время я использую DS18B20 .

Сначала откройте Pi и введите:

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

Затем добавьте слово untestedпосле main.

Затем введите:

sudo apt-get update
sudo apt-get upgrade

В моем случае это заняло много времени, хотя это зависит от скорости вашего Wi-Fi / Ethernet. После этого вы перезагружаетесь:

sudo reboot now

Подключите белый провод к GPIO4, красный провод к 3V3, а черный к GND. Вы также подключаете резистор 4,7 кОм между белым и красным проводами.

Вы можете прочитать его, выполнив следующие команды:

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

Затем следует указать серийный номер датчика температуры, затем w1_bus_master1

Затем перейти:

cd serial-number-here
cat w1_slave

И тогда он должен показать 2 строки кода, где 5 цифр в конце второй строки - это температура.

Для этого используется то, что называется «Протокол однопроводного датчика температуры в Далласе», или что-то в этом роде.

Kachamenus
источник
1

Я сейчас читаю эту книгу и мне нравится. По этому пути я вижу, что у вас есть датчик температуры, arduino и радиоприемник xbee, склеенные вместе. Это ваш дистанционный датчик, который может находиться где угодно, если он находится в зоне действия домашней станции. Тогда для домашней станции есть малина и еще один xbee. Я предполагаю, что может быть проще также иметь домашнюю станцию ​​xbee на Arduino, а затем Arduino и Rasberry разговаривать друг с другом. При этом вы можете иметь несколько удаленных датчиков и различные типы датчиков.

lumpynose
источник
Интересный. Я хотел бы больше подробностей об этом. Смотрите мой вопрос: raspberrypi.stackexchange.com/questions/38711/… и, пожалуйста, отвечайте там :-)
Davide