Słowem wstępu

Z punktu widzenia dzisiejszego dizajnu, czajnik nie jest niczym niezwykłym. Stawiamy go na palniku i po jakimś czasie znienacka zaczyna piszczeć, dokładnie wtedy, kiedy najmniej się tego spodziewamy. Zbyt długie gwizdanie często denerwuje współlokatorów i nas, szczególnie jak mamy zbyt daleko do kuchni, a robiliśmy właśnie coś ciekawszego.

Wg standardów dobrego projektanta, najlepszymi rozwiązaniami są produkty przewidywalne. Pozwala to łatwiej zagospodarować czas od początku do końca przedsięwzięcia, bez niespodzianek i zaskoczenia. Skoro dzisiejsze nowoczesne pralki mają takie właściwości to czemu nie czajnik?

Postanowiłem rozwiązać to tak, aby czajnik komunikował się z komputerem i podawał swoją aktualną temperaturę. W komputerze będzie działał program wyświetlający pasek postępu (ciągle jeszcze mnie to śmieszy, bo kojarzy mi się z download-em wody przez internet) i czas pozostały do zagotowania. Gdy temperatura osiągnie 100 °C, pasek dojdzie do końca i spokojnie będziesz mógł się udać zaparzyć kawę, herbatę czy (jak w moim przypadku) nową porcję kompotu (takiego owocowego oczywiście).

Jeśli jesteś bardziej "obrotny" takie urządzenie może ci pomóc zdalnie kontrolować proces destylacji alkoholowej, ważenia piwa czy lutowania w piecu.

Czujnik temperatury

Jako czujnik temperatury zastosowałem zwykłą diodę krzemową (popularną 1N4148). Jak się okazuje, złącze PN w półprzewodnikach w kierunku zaporowym przepuszcza określoną ilość elektronów zależnie od temperatury. Najlepsze w tym wszystkim jest to, że ilość przepuszczanego prądu jest liniowa w stosunku do temperatury, co szalenie upraszcza program. Dioda 1N4148 wytrzymuje temperatury od -65 do 200 st. C. Użyłem jej głównie dlatego, gdyż była pod ręką, a nie chciałem narażać się na koszty jakiś cyfrowych czujników Dallas-a lub czujnika analogowego dostępnego w Nettigo, które mógłbym zepsuć do czasu gdy zdobędę odpowiednie doświadczenie. Oczywiście ich również można z powodzeniem użyć (polecam o ile wiesz jak zapewnić im wodoodporność) (wytrzymują do 125 °C).

Najważniejszym jest zapewnienie, aby do czujnika i między wyprowadzenia nie dostała się woda.
W trakcie prototypownia sondy pomiarowej, udało się ją zrobić dopiero za trzecim razem poświęcając dwie diody zatopione w koszulkach termokurczliwych.

W pierwszym egzemplarzu wyprowadzenia diody przylutowałem do przewodów, potem Nałożyłem koszulkę termokurczliwą i podgrzewając ją, eksplodowała cyna robiąc dziurę. Zatem nie polecam lutowania wyprowadzeń.

W drugim egzemplarzu umieściłem diodę w koszulce termokurczliwej tak, że z jednej strony wychodziły 2 przewody i w samej koszulce były ściśnięte ze sobą. Ten układ działał... prawie. Okazało się, że powyżej 80 °C izolacja przewodów robi się mniej wytrzymała i przewody ściśnięte ze sobą połączyły swoje druty, przez co pokazała mi się jakaś ekstremalna temperatura XD.

Trzeci prototyp działa prawidłowo (do trzech razy sztuka!). Jego budowa jest prosta. W środku koszulki jest dioda i przewody wychodzą z jej obydwu końców.

Taki układ wytrzymał najdłużej.

Elektronika pomiarowa

W sieci można znaleźć wiele schematów układów do pomiaru za pomocą diody krzemowej opartych na mostkach pomiarowych lub wzmacniaczach operacyjnych. Ja nie miałem czasu na przesadne eksperymenty. Hołdując tradycji "więcej kodu niż elektroniki" zastosowałem prosty układ dzielnika napięcia. Wystarczy połączyć szeregowo diodę z rezystorem. Jej katodę z GND, rezystor z 5V (na schemacie podłączyłem rezystor do pinu "Vin", gdyż zasilam Arduino zasilaczem 5V. Jeśli używasz zasilacza o wyższym napięciu podłącz rezystor do pinu "5V"), a anodę z Analog Input 0.



Zastosowałem dość "ryzykowny" rezystor 330 Ω, który zapewnił w tym układzie dokładność 2..3 °C.

Czujnik MCP9700-E-TO można podłączyć w sposób podany w jednym z poprzednich artykułów Jak mierzyc temperaturę z Arduino.

Natomiast cyfrowe czujniki Dallas podłączamy tak jak przedstawiono tu Dallas Temperature Control Library.

Za system zbierania i przekazywania pomiarów posłużyło Arduino z odpowiednio zaprogramowanym XBee Shield.

Program na Arduino

Ponieważ czujnik był na dość długim przewodzie, wprowadzającym zakłócenia, wynik pomiaru nie był wystarczająco stabilny (wahania +/- 2 jednostki). Do jego wygładzenia użyłem filtru uśredniającego. To prosty algorytm przechowujący w tablicy 10 ostatnich pomiarów i wyliczający z nich średnią.

Potem wbudowana w Arduino funkcja "map" konwertuje jednostki przetwornika A/C z Arduino na stopnie Celsjusza. Stopnie przekazywane są przez wyjście szeregowe do XBee, który transmituje je do komputera.

Program nadaje się również do układu MCP9700, do którego wymaga oczywiście korekcji skali.

Skale wyznaczamy mierząc znane temperatury i sprawdzając jaką wartość zwraca przy nich funkcja "analogRead". Potrzebne są dwie wartości - im bardziej skrajne tym lepiej. Najprościej zmierzyć temperaturę w domu, a potem na dworze lub temperaturę ciała. Nieco trudniej byłoby zmierzyć temperaturę wrzącej wody i wody z lodem. Wartości i temperatury należy wprowadzić odpowiednie pola "define" programu.

#define VALUE1 173
#define TEMP1 24
#define VALUE2 167
#define TEMP2 37

Jeśli masz układ termometru z układem Dallas prawdopodobnie nie będzie potrzebna korekcja skali. Ważne, aby program Arduino wysyłał przez "Serial" linie tekstu zawierającą temperaturę w postaci liczby całkowitej najlepiej o możliwie stałych wartościach wzrastających.

Program na PC

Program na PC napisałem w Pythonie z użyciem PyGTK, PySerial i PyGlib. Pierwotnie napisany jest na Linuxa (platforma Ubuntu >= 10.04), jednak po kilku drobnych przeróbkach (zmianie nazwy portu szeregowego z '/dev/ttyUSB0' na właściwą) i zainstalowaniu odpowiednich plików działa na większości platform.

Program wygląda jak proste okno dialogowe z informacją w postaci paska postępu o stopniu nagrzania wody. W pasku jest informacja o czasie jaki pozostał do zagotowania. Po najechaniu wskaźnikiem myszy na pasek pojawia się informacja o temperaturze.

Program napisany w Pythonie

Program wyposażyłem w coś co nazwałem "filtr krańcowy". Jego działanie polega na tym, że temperatura przy przejściu między kolejnymi wartościami potrafi przeskakiwać kilka razy do przodu i do tyłu (32, 33, 32, 32, 33, 33). Filtr ma to wyeliminować i sprawić, że zmiana temperatury nastąpi dopiero wtedy, kiedy 5 ostatnich wartości będzie takich samych.

Badanie zasięgu

Wg. danych technicznych zasięg modułu wynosi 30 m w pomieszczeniu lub 100 m na terenie otwartym. Oczywiście zasięg może zostać zwiększony jeśli między krańcowymi modemami znajdują się inne pracujące jako rutery. Jeśli chcesz uzyskać większy zasięg możesz zaopatrzyć się w modemy większej mocy serii "XBee Pro" i/lub takie z lepszą anteną lub wyjściem antenowym. Te z wyjściem antenowym można wyposażyć w antenę kierunkową. Ponieważ najpopularniejsze XBee pracuje z częstotliwością 2.4 GHz, można podłączyć do niego osprzęt stosowany w sieciach WiFi. Amatorów "Zrób to sam" zainteresuje projekt własnej anteny kierunkowej typu "biquad", którą można wykonać z kawałka miedzianego drutu i laminatu niewytrawionej płytki drukowanej.

OK. Zanim zaczniesz zwiększać zasięg warto najpierw sprawdzić, czy to co oferuje obecnie XBee jest wystarczające. Jak podałem wcześniej, do regulacji mocy nadawania służą 2 parametry.

Pierwszy PL (rozkaz ATPL) [Power Level] określa moc nadajnika. Argumentem tego parametru jest liczba od 0 (minimalna) do 4 (maksymalna). Wymyślono go po to, aby móc dobrać moc do warunków w jakich znajduje się urządzenie. Zbyt duża moc to oczywiście większe zużycie prądu i większa możliwość "podsłuchu".

Kolejny parametr to PM (rozkaz ATPM) [Power Mode]. Parametr ten pozwala włączyć dodatkowe wzmocnienie sygnału (kosztem poboru prądu). Jego argument to 0 - wyłączone wzmocnienie, 1 - włączone wzmocnienie.

Do badania siły odbieranego sygnału służy rozkaz ATDB. Zwraca on wartość zwaną RSSI [Received signal strength indication] ostatnich odebranych danych. Wartość zwracana przez rozkaz ma wartość szesnastkową od 0 do FF czyli 0 - 255. Im wyższą wartość zwraca rozkaz, tym mniejsza moc sygnału dociera do odbiornika.

U mnie modemy ustawione na maksymalną możliwą moc przy sobie zwracały wartość 27 (39), a oddalone od siebie o 8 metrów i 3 ściany zwracały wartość 50 (80). Mogę zatem przyjąć, że nie wykorzystałem nawet 50% ich mocy.

Do badania mocy napisałem dwa programy wykorzystujące wyżej przedstawione biblioteki. Działanie programu polega na tym, że modem podłączony do komputera wysyła testowe dane, modem podłączony do Arduino je odbiera, dołącza do nich wynik działania rozkazu ATDB i odsyła z powrotem.
Komputer je odbiera, sprawdza poprawność danych i wyświetla wartość RSSI.

Podsumowanie

To koniec pierwszej części opisu XBee. Na podstawie tych informacji możesz zacząć konstruować rzeczy wymagające radiowej kontroli poczynając od systemów alarmowych poprzez zdalną kontrolę procesów, aż po grupy robotów i zdalne modele latające.

Pliki