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.
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.
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:
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.