LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
SoM / SBC

LM75A – pomiar temperatury za pomocą Raspberry Pi

Artykuł prezentuje moduł z czujnikiem temperatury LM75AKAmodLM75A. Opisuje także sposób odczytu danych za pomocą komputera Raspberry Pi oraz wysyłania do chmury Adafruit IO.

Układ LM75A to prosty czujnik temperatury produkowany przez firmę NXP. Pozwala na mierzenie temperatury w zakresie od -55°C do +125°C. Co prawda dokładność układu LM75A nie jest zbyt imponująca, bo wynosi:

  • ±2°C dla zakresu −25…100°C
  • ±3°C dla zakresu −55…+125°C

Jednak dla wielu zastosowań (np. sterowanie ogrzewaniem w szklarni) taka dokładność jest w zupełności wystarczająca.

Układ LM75A jest dostępny w obudowie SO8 lub TSSOP8 i do prawidłowej pracy nie wymaga zbyt wielu elementów zewnętrznych, więc bez zbytniego wysiłku można samodzielnie przygotować moduły pomiarowe zbudowane na płytce uniwersalnej. Innym rozwiązaniem jest użycie gotowego modułu, np. KAmodLM75A produkowanego przez Kamami.

Rys. 1. Moduł KAmodLM75A firmy Kamami

Komunikacja modułu z otoczeniem odbywa się za pomocą interfejsu I2C. Adres czujnika temperatury LM75A jest 7-bitowy. Cztery bardziej znaczące bity są predefiniowane przez producenta i wynoszą 1001. Kolejne trzy bity to wartości ustawione na pinach A2, A1, a także A0 układu LM75A. W module KAmodLM75A wartości te ustawia się jumperami o oznaczeniach A2, A1, A0 – pozycja L oznacza 0, a pozycja H oznacza 1. Tak więc układ LM75A może znajdować się pod adresem z zakresu 0x48…0x4F, a na wspólnej magistrali można umieścić do 8 czujników.

Rys. 2. Adres czujnika jest ustawiany przez wartość bitów A2…A0

 Kompletna dokumentacja techniczna układu LM75A jest dostępna na stronie producenta:  https://www.nxp.com/docs/en/data-sheet/LM75A.pdf.

Przygotowanie Raspberry Pi do pracy z I2C

Wszystkie sterowniki i biblioteki niezbędne do pracy z I2C są domyślnie zainstalowane w Raspbianie. Aby się upewnić, że obsługa I2C jest włączona, musimy uruchomić konfiguratora raspi-config:

sudo raspi-config

Nawigacja po opcjach konfiguratora odbywa się za pomocą strzałek, a także entera. Strzałki góra-dół pozwalają na poruszanie się po liście, strzałki prawo-lewo pozwalają na wybranie opcji w stopce (np. Select czy Finish).

Włączenie I2C w Raspberry Pi wymaga przejścia przez kilka opcji. Na początku trzeba wejść w Interfacing Options.

Rys. 3. Konfigurator raspi-config – Interfacing Options

Teraz wybieramy I2C.

Rys. 4. Konfigurator raspi-config – I2C

Włączenie interfejsu I2C nastąpi po wybraniu Yes.

Rys. 5. Konfigurator raspi-config – włączenie I2C

Aby wyjść z konfiguratora, należy wybrać Finish. Po zmianie ustawień w raspi-config nie jest konieczne ponowne uruchomienie Raspberry Pi.

Oczywiście w świecie linuksowym jest wiele bibliotek umożliwiających korzystanie z I2C. My skorzystamy z biblioteki smbus, która domyślnie znajduje się w systemie Raspbian.

Podłączenie sensora

W Raspberry Pi mamy do dyspozycji 1 kanał interfejsu I2C wbudowanego w procesor komputera. Komunikacja pomiędzy komputerem i układami peryferyjnymi odbywa się na liniach SDA (Data) i SCL (Clock), które są wyprowadzone na złącze szpilkowe malinki.

Rys. 6. Dołączenie modułu KAmodLM75A do Raspberry Pi

Moduł KAmodLM75A ma 6-pinowe męskie złącze w standardzie Pmod I2C. Moduł można połączyć bezpośrednio ze złączem szpilkowym Raspberry Pi za pomocą przewodów z końcówkami żeńskimi.

Rys. 7. Dołączenie modułu KAmodLM75A do Raspberry Pi za pomocą przewodów

Do wygodnego stosowania modułów zgodnych ze standardem Pmod można też użyć adaptera KAmodRPi-Pmod-HAT.

Rys. 8. Dołączenie modułu KAmodLM75A do Raspberry Pi z wykorzystaniem adaptera KAmodRPi-Pmod-HAT

Poprawność wykonanych połączeń, a także zainstalowanych bibliotek można sprawdzić wywołując polecenie:

i2cdetect -y 1

Polecenie to powoduje wyświetlenie adresów urządzeń dołączonych do kanału 1 I2C procesora Raspberry Pi. Jeżeli w KAmodLM75A zwory A0, A1, A2 są ustawione na 0, to zostanie wykryte urządzenie o adresie 0x48.

Rys. 9. Wynik działania polecenia i2cdetect

Odczyt temperatury

Temperatura zmierzona przez układ LM75A jest wpisywana do rejestru Temp. Rejestr ten jest 16-bitowy, jednak wartość zmierzonej temperatury znajduje się na 11 najbardziej znaczących bitach. Pozostałych 5 bitów ma wartość nieistotną.

MSB LSB
D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 X X X X X

Temperatura w rejestrze Temp jest zapisana w systemie U2 (kod uzupełnień do dwóch). Najbardziej znaczący bit (D10) określa znak, kolejne 8 bitów opisuje część całkowitą, a pozostałe 3 bity opisują część ułamkową.

D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
-128 64 32 16 8 4 2 1 0,5 0,25 0,125

Wartość zapisana w rejestrze Temp jest przeliczana na temperaturę w następujący sposób:

Przykładowy program w języku Python odczytujący temperaturę z układu LM75A:

import smbus
# 1001000
# Kiedy A0, A1, A2 są ustawione na 0

address = 0x48

def read_temperature():

# Rozpoczęcie komunikacji
bus = smbus.SMBus(1)

# Odczyt dwóch bajtów
data = bus.read_word_data(address, 0)

# Zamiana bajtów miejscami
data = ((data << 8) & 0xFF00) | (data >>8)

# Pominięcie ostatnich pięciu bajtów
data = data >> 5

# Konwersja na temperaturę
# Pierwszy składnik to ustawienie D10 na ujemną liczbę
# Drugi składnik to pominięcie D10

temperature = ((data&0x400) * -128 + data & (~0x4000))*0.125

# Zwrócenie temperatury
return temperature

print(read_temperature())

 

Rys. 10. Pojedyncze odczytanie temperatury z czujnika LM75A

Wykorzystując przedstawioną powyżej funkcję pomiaru temperatury bardzo łatwo można wykonać rejestrator temperatury.

Rejestracja danych w chmurze

Temperaturę odczytaną w powyżej opisany sposób można łatwo zapisać w chmurze (np. do późniejszej analizy). W przykładzie skorzystamy z darmowej usługi Adafruit IO. Po zarejestrowaniu się na stronie https://io.adafruit.com, konieczne jest utworzenie zestawu danych (feed), w którym będą przechowywane przesyłane przez nas dane.

Aby zainstalować na Raspberry Pi bibliotekę do obsługi Adafruit IO, wpisz:

sudo pip3 install adafruit-io

Rys. 11. Widok ekranu po zainstalowaniu biblioteki Adafruit IO

Poniżej znajduje się program wysyłający do chmury dane z pojedynczego pomiaru temperatury. Pamiętaj, aby w kodzie zmienić nazwę użytkownika, klucz, a także nazwę naszego zestawu danych.

import smbus
from Adafruit_IO import Client

# 1001000
# Kiedy A0, A1, A2 są ustawione na 0

address = 0x48

def read_temperature():

# Rozpoczęcie komunikacji
bus = smbus.SMBus(1)

# Odczyt dwóch bajtów
data = bus.read_word_data(address, 0)

# Zamiana bajtów miejscami
data = ((data << 8) & 0xFF00) | (data >>8)

# Pominięcie ostatnich pięciu bajtów
data = data >> 5

# Konwersja na temperaturę
# Pierwszy składnik to ustawienie D10 na ujemną liczbę
# Drugi składnik to pominięcie D10

temperature = ((data&0x400) * -128 + data & (~0x4000))*0.125

# Zwrócenie temperatury
return temperature

aio = Client('NAZWA_UŻYTKOWNIKA', 'KLUCZ_ADAFRUIT_IO')

aio.send('TWOJA_NAZWA_ZESTAWU_DANYCH', read_temperature())

Warto byłoby jeszcze regularnie mierzyć temperaturę. Aby wywoływać program o określonej godzinie, często używana jest tabela cron.

W celu edytowania tabeli cron, wywołaj

crontab -e

Następnie wybierz swój ulubiony edytor tekstu (np. nano). Teraz edytujesz tabelę cron. Dopisz na koniec.

*/5 * * * * python3 /ścieżka/do/twojego/programu

Od tego momentu Raspberry Pi samodzielnie zadba o uruchomienie co 5 minut programu:

python3 /ścieżka/do/twojego/programu

Rys. 12. Wykres wygenerowany przez Adafruit IO na podstawie danych z sensora temperatury LM75A