LM75A – pomiar temperatury za pomocą Raspberry Pi
Artykuł prezentuje moduł z czujnikiem temperatury LM75A – KAmodLM75A. 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
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