LM75A + i2c + Raspberry Pi czyli mierzymy temperaturę

Szerszy obraz czyli tzw. przydługi wstęp

Zainteresowanie szyną i2c spowodowane było moim lenistwem. Piec w domu nie ma termostatu a rozpalając go warto wiedzieć jaka jest temperatura żeby wiedzieć kiedy go zamknąć. Rozwiązanie? Czujnik temperatury w piwnicy – na piecu, najlepiej taki który będę mógł sprawdzać za pomocą telefonu. Dodatkowo dlaczego by nie mieć czujnika temperatury w każdym pokoju i w dodatku zapisywać je aby moc później oglądać jak te temperatury się zmieniają. Dostępne na rynku rozwiązania albo nie spełniają wszystkich założeń albo są mega drogie. Pod telewizorem leży malinka wiec dlaczego jej nie zaprzęgnąć do dodatkowej pracy. Idealny materiał na pet project. Wstępne założenia są takie czujnik temperatury w piwnicy, w sypialni i salonie oraz na zewnątrz – być może temperatura przy ziemi oraz na wysokości 2 metrów czyli tak jak to mierzą meteorolodzy (btw. nie ma czegoś takiego jak temperatura w/na słońcu. Prawidłowo mierzona temperatura powietrza jest dokonywana na wysokości 2m w klatce meteorologicznej zapewniającej cień. Nie mierzymy temperatury w/na „słońcu”). Wyszło 5, być może jeszcze w pokoju dzieci i może kuchni to daje 7. Po szybkiej analizie dostępnych możliwości okazało sie ze Lm75a nadaje sie najlepiej. Na jednej szynie i2c (to ważne bo dzięki temu cześć elektroniczna jest uproszczona do minimum) można podpisać 8 termometrów. Zakres mierzonej temperatury to -50 do 150 stopni. Dla mnie idealnie. Dokładność 2stopnie. Z jednej strony masakra a z drugiej – co mnie to obchodzi, to nie jest aparatura medyczna. Się skalibruje i odpowiednie poprawki w kodzie się zrobi. W zakresie domowym i zewnętrznym czujnik jest liniowy wiec nie ma stresu a pomiar temperatury w piecu wystarczy z dokładnością 5 stopni, aktualny bimetalowy wskaźnik i tak jest mocno orientacyjny.

Zatem na warsztat idzie kostka do odczytywania temperatury czyli LM75A. Idiotycznie prosta w użyciu i obsłudze kość pozwoli łatwo uzyskać zadowalające efekty i nie powinna stanowić większego problemu nawet dla początkujących elektroników. Dokumentacja techniczna znajduje się tutaj.

lm75-elememnty

Do zmontowania będą potrzebne LM75, dostępne na allegro i w przyzwoitych sklepach elektronicznych (na powyższej rycinie to te pajączki w woreczku antystatycznym) garść kondensatoró 10nF ceramicznych oraz płytki drukowane. Te ostatnie nie są obowiązkowe bo można zmontować wszystko na pająka albo jak to teraz modniej w 3D ale na allegro można dostać gotowe płytki SO8 która ułatwi pracę. Przydatny może być również kynar jeśli chcemy mieć więcej niż 1 czujnik. Przyda się również lutownica (lepiej oporowa niż transformatorowa) oraz podstawowe umiejętności z zakresu lutowania i wąchania kalafonii.

Technikalia

Kostka ma 8 wyjść. VCC to zasilanie. Malinka może zapewnić nam 3.3 lub 5V, kość wymaga zasilania w zakresie 2.8-5.5 więc 3.3 będzie ok (później będziemy się zajmować barometrem, który jest bardziej wybredny i dlatego skorzystam z 3.3). GND to masa – lub  minus zasilania. To załatwia zasilanie. SDA i SCL to szyna danych w I2C. Ponieważ całość podpinamy do Raspberry Pi, która ma rezystory podciągające to poza połączeniem VCC GND SDA i SCL mamy w pełni funkcjonalną szynę, która nić ponad to nie potrzebuje.

image

Teraz najciekawsza część. LM75 ma ustawiany adres a ustawiamy go za pomocą zwierania A0 A1 i A2 do VCC lub do GND. I2C pozwala podpiąć równolegle do 120 urządzeń więc żeby je rozróżnić od siebie –  z którym w danej chwili chcemy rozmawiać – należy je zaadresować. Adres jest ustalany przez producenta na etapie projektowania. W przypadku LM75 adres wygląda tak:

MSB LSB
1 0 0 1 A2 A1 A0

Co ważne, A0-A2 MUSZĄ być połączone albo z VCC albo z GND. Jeśli pozostawimy je wiszące to kość będzie się dziwnie zachowywać tzn. czasem będzie odpowiadać a czasem nie. Ustawiając adresy cudeńko możemy znaleźć pod adresami od 72 (0x48) do 79 (0x4F) – sprawdzimy to za pomocą komendy i2cdetect.

Zmontowana kość u mnie wygląda tak:

photo

Jak widać mistrzostwo we władaniu lutownicą nie jest jakoś specjalnie potrzebne, ważne żeby nie poparzyć się, nie ugotować kostki i nie pozwierać za dużo…. aha i nie oblizujemy grota lutownicy.

Temperatura

Kość jest samowystarczalna w tym sensie, że po ustawieniu adresu i dostarczeniu zasilania można czytać temperaturę bez jakiejś specjalnej kalibracji czy innych magicznych obrządków. Wystarczy odczytać odpowiedni rejestr (o tym jak, będzie w następnym wpisie), który zbudowany jest tak:

M S B y t e L S B y t e
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 X X X X X

D10 to znak czyli 0 temperatura dodatnia, 1 temperatura ujemna. D9 do D0 to nasza temperatura zapisana jako wartość całkowita – ofc zapisana binarnie. XXXXX są nie używane.

Dla fanów tdd trochę mięsa czyli przypadki testowe – ot wprost z dokumentacji:

11-bit binary

szenastkowo dziesiętnie wartość temperatury
01111111000 0x3F8 1016 +127.000 °C
01111110111 0x3F7 1015 +126.875 °C
01111110001 0x3F1 1009 +126.125 °C
01111101000 0x3E8 1000 +125.000 °C
00011001000 0x0C8 200 +25.000 °C
00000000001 0x001 1 +0.125 °C
00000000000 0x000 0 0.000 °C
11111111111 0x7FF -1 −0.125 °C
11100111000 0x738 -200 −25.000 °C
11001001001 0x649 -439 −54.875 °C
11001001000 0x648 -440 −55.000 °C

z wartości dziesiętnej na prawdziwą temperaturę przechodzimy tak:

dla wartości dodatniej czyli D10 = 0

(°C) = +(Temp) × 0.125 °C.

dla wartości ujemnych czyli D10 = 1

(°C) = −(pozostała część Temp) × 0.125 °C.

Wstępnie mamy omówiony pierwszy klocek układanki. Wiadomo dlaczego i czym chcę mierzyć temperaturę. W następnej części pokażę jak to to podpiąć do malinki oraz zaglądniemy do kodu który pozwoli na odczyt temperatury.

Raspberry Pi i szyna I2C

Jedną z wielkich zalet Rasbperry Pi jest to, że została wyposażona w ciekawy zestaw portów a jeden z nich to i2c. Jest to szyna, która pozwala na bardzo łatwą (potrzebuje 4 przewody) komunikację z innymi układami scalonymi, czujnikami czy wręcz całymi urządzeniami. Na rynku jest od lat i dlatego nie ma problemu znaleźć masę zabawek, które możemy wykorzystać.

Aby rozpocząć przygodę z i2c należy uruchomić i2c na malince.

sudo nano /etc/modules i dodajemy moduł i2c-dev

image

a następnie

sudo apt-get install i2c-tools
sudo apt-get install python-smbus

To doda nam narzędzia do i2c oraz bibliotekę smbus dla pythona, która przyda się do komunikacji.

Na koniec:

sudo adduser pi i2c

Po restarcie można już cieszyć się tym, że i2c działa. Szybka kontrola:

i2cdetect –y 1 i mamy:

image

i2cdetect pozwala odczytać adresy urządzeń podpiętych do szyny (w przypadku malinki rev2 –y 1, w przypadku rev1 –y 0). Na powyższej rycinie widać, że są podpięte 3 urządzenia o adresach 0x48, 0x4F u 0x77. Jeśli nic nie podepniemy, będzie pusto. Jednak jest to pierwszy krok, który pozwoli sprawdzić czy to to w ogóle u nas działa.

Szyna i2c pozwala podpiąć ponad setkę urządzeń. Każde z nich ma swój adres (niektóre mają konfigurowalny adres) który warto znać, żeby się z danym urządzeniem komunikować. Jak wcześniej pisałem, rycina pokazuje 3 takie urządzenia:

0x48 i 0x4F to termometry LM75A, w których 3 ostatnie bity adresu można ustawić, możemy zatem podpiąć 8 różnych termometrów. Szczegółowe dane techniczne znajdują się tutaj

0x77 to  BMP085 czyli czujnik temeratury i cisnienia atmosferycznego. Szczegółowe dane techniczne znajdują się tutaj.

W kolejnych postach pokażę jak podpiąć powyższe czujniki do malinki  i jak cokolwiek z nich odczytać a później pokażę prosty sposób na wypchnięcie danych na zewnątrz do google docs lub do własnej aplikacji webowej.

 

Aktualizacja:

Jeden z czytelników napisał, że potrzebował dopisać w pliku /etc/modules  linijkę i2c-bcm2708. Więc jeśli to co napisałem w Twoim przypadku to za mało  to może tego brakuje. W mojej malince wystarczyło wpisać i2c-dev ale może to wynika z faktu, że używam raspbmc a nie raspbiana. Dzięki Marek za uwagę.