Як виміряти температуру?


44

Що я можу підключити до RPi для вимірювання температури? Я думаю, що пристрої, підключені до I²C або SPI, мали б сенс.

Тут питання про DHT-22 та інші 1-провідні пристрої. Але на цьому етапі здається, що 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

@ikku, у мене був 8-контактний MSOP
Джон Ла Руй

13

Ви можете використовувати вбудований в послідовний порт Raspberry Pi і підключити його до цифрового ІС термометра (наприклад, DS1620 )

Ви можете дізнатись, що поєднує серійний порт Raspberry Pi тут

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

  • P1 (ЛІВНІ БОТИ) - 3.3V
  • Р6 - ВНД
  • P8 GPIO14 - TX
  • P10 GPIO15 - RX

Важливо : Пам’ятайте, що RPI UART працює при TTL 3.3V - будьте обережні, щоб не використовувати високу напругу 5V / 12volt Uart безпосередньо до RPI. Це спричинить шкоду!


Здається, використовується трижильний інтерфейс, тому не просто питання використання послідовного порту звичайним способом, але здається сумісним з GPIO
Джон Ла Рой

AFAIK, це нормально, щоб послідовний порт мав Tx, Rx та CLK. Я думаю, що SPI потрібні 3 дроти також SDO, SDO та SCLK. Перегляньте це для SPI-варіанту - посилання DS1722 .
JeeShen Lee

Але DS1620 використовує! RST, CLK і DQ. ! RST є високим для всієї передачі, CLK - це годинник, а DQ - двонаправлені дані, тому це відрізняється від UART
Джон Ла Руй,

3
Мені подобається ваша альтернативна відповідь і трохи спростувала її для вас JeeSehn. Крім того, я додав попередження для не технічних користувачів, щоб бути обережними, що UART на RPi становить 3,3 В TTL і що інші USB для послідовного використання можуть використовувати 5 В / 12 В! Збийте RPI!
Пьотр Кула

3

Я спробував два підходи до зондування температури. Для I2C я використав модуль TMP102, подібний до того, що описується гніблером. Ось мій пост про це:

Щодо 1-проводного, Adafruit нещодавно випустив там власне зображення, і воно містить 1-провідну підтримку. Мені вдалося прочитати з ним 1-провідний датчик темпу DS18B20. Більше деталей у цій публікації :

Нарешті, ще одним підходом є використання аналогового датчика температури та зовнішнього АЦП. Adafruit має хороший підручник з цього приводу.


3

Простий, дешевий USB-термометр "HID TEMPer" також працює, і його набагато простіше підключити для тих, хто ще не поспішає з UART або GPIO, як я.

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

Мій RPi забезпечує достатню потужність, щоб передати його безпосередньо через порт USB без концентратора.

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

Для отримання простого читання без будь- якого матеріалу, встановіть залежності так (як 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

У моєму випадку це зайняло багато часу, хоча це залежить від швидкості вашого wifi / 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 цифр в кінці другого рядка - це температура.

Для цього використовується щось, що називається "Протокол однопровідного датчика температури Далласа", або щось подібне.


1

Зараз я читаю цю книгу і мені подобається. Йдучи цією трасою, моє бачення полягає в тому, що у вас буде склеєний датчик температури, ардуїно та радіо xbee. Це ваш дистанційний датчик, який може бути де завгодно, якщо він знаходиться в межах домашньої станції. Тоді для домашньої станції мати малину та ще один ксі. Я здогадуюсь, що може бути простіше мати також домашню станцію xbee на ардуїно, а потім поговорити між собою ардуїно та малини. З цим ви могли б мати кілька віддалених датчиків та різні типи датчиків.


Цікаво. Мені хотілося б детальніше про це. Дивіться моє запитання: raspberrypi.stackexchange.com/questions/38711/… і будь ласка, відповідь там :-)
Девіде
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.