Termometr bezprzewodowy – przykład zastosowania NRF24L01

Tym razem niewielki projekt urządzenia zwanego niekiedy stacją pogodową – czyli termometr z bezprzewodowym czujnikiem temperatury zewnętrznej.

stacja_1

Od dłuższego czasu zastanawiałem się, jak w sposób praktyczny wykorzystać moduły z ukladami NRF24L01. Są to transceivery na pasmo 2,4GHz, posiadają jak na swoją cene spore możliwości:

  •  szybkość do 2Mbps,
  •  wbudowany protokół z zapewnionym sprzetowo handshakingiem,
  •  obsługa 120 kanałów w paśmie 2,4GHz (kanały co 1/2MHz do 2400MHz do 2520MHz i tutaj uwaga – z mojego rozeznania legalnie można używac kanałów do 2483MHz)
  •  napięcie zasialnia 1,9 – 3,6V co daje spory potencjał w zakresie zasilania z baterii.
  •  zasięg niby do 100m (co jest wartością dość optymistyczną), antena na płytce w postaci ściezki.

Najważniejsze założenia projektu to zasilanie z baterii – czujnik zewnętrzny baterie alkaliczne, czujnik wewnątrz: baterie alkaliczne lub akumulator Li-Ion, czytelny wyswietlacz niewymagający do odczytu podświetlenia, pomiar temperatury wewnętrznej i zewnętrznej, pomiar wilgotności zewnętrznej.

Budowa odbiornika.

Wychodząc z przyjętych założeń – odbiornik oparłem o mikrokontroler ATmega328P,  wyświetlacz ze steronikiem PCD8544, monochromatyczny, rozdzieczość 84×48 pixeli – znany z telefonów komórkowych epoki przedsmartfonowej. Odbiornik posiada oczywiście moduł radiowy, czujnik temperatury wewnętrznej – DS18B20. Ostatecznie wybrałem zasialnie z akumulatora litowo-jonowego. Zastosowałem zabezpieczony akumulator w rozmiarze 14500 – czyli baterii AA, pojemność 800mAh. Zastosowanie takiego akumulatora spowodowało konieczność dodania systemu ładowania. W tej roli popularny moduł z ukladem TP4056.

stacja_5 stacja_3 stacja_4

Odnośnie modułu – uwaga pod adresem Chińczyka, który te moduły projektował. Układ TP4056 używa rezystora określającego maksymalny prąd ładowania. W module rezystor ten jest w rozmiarze 0603, co skutecznie utrudnia jesgo wymianę, do tego fabrycznie jest tam ustawione 1A. Taki prąd dla pchełki w obudowie SO-8 jest za duży, powoduje dość silne grzanie układu. Dodatkowo nie każdy akumulator zniesie ładowanie prądem 1A. Rezystor w projekcie został wymieniony na 4k3, co skutkuje ustaleniem prądu na około 280mA.  Moduł ma gniazdo micro USB, zatem daje się naładować każą ładowarką z takim wtykiem. Moduł posiada diody czerwoną i zieloną do sygnalizacji procesu ładowania jak i jego zakończenia.

Odbiornik wyposażony został w przycisk włączający podświetlenie wyświetlacza na około 10 sekund, oraz w wyłącznik. Całość zasilana jest poprzez stabilizator MCP1700 na 3,3V.

Została także zainstalowana jedna dioda LED (pomarańczowa). Pierwotnie miała służyć za ostrzeżenie przed oblodzeniem (standard w samochodach, występuje też w niektorych takich termometrach fabrycznych, sygnalizuje temperatury z przedziału ± 3°C), ostatecznie z tego zrezygnowałem ze względu na potencjalną uciążliwość).

Dodatkowo obwód wejściowy ładowarki (domyślnie micro usb 5V) jest podłączony poprzez dzielnik pół na pół na jeden z pinów mikrokontrolera w celu wykrycia faktu ładowania. Na czas ładowania włączane jest na stałe podświetlenie – w końcu oszczędzanie prądu wtedy nie jest konieczne.

Jako obudowa element z pleksi z wywierconymi trzema otworami. Akumulator w standardowym koszyku 1xAA.

Budowa czujnika zewnętrznego – nadajnika.

Nadajnik oparty jest o dwa czujniki – temperatury DS18B20 i temperatury i wilgotności DHT-11. Ten drugi nie mierzy temperatury poniżej 0, co wymusiło użycie osobnego czujnika tempetarury. Mikrokontroler oraz moduł radiowy identyczne jak w odbiorniku. Zostałą użyta dioda LED – raczej w celach testowych. Ze względu na ograniczenie zużycia prądu oraz szczelną obudowę w końcowej aplikacji dioda nie jest wykorzystywana. Jako obudowy czujnika użyłem puszki hermetycznej. W miejscu, gdzie czujnik DHT-11 styka się z obudową, zostało wywiercone kilka otworów śr. 1mm.

stacja_2

Zasialnie odbiornika stanowią 3 baterie AA.

Zasilanie, oszczędzanie energii.

Projekt jest planowany do zasilania bateryjnego lub akumulatorowego, podobnie jak rozwiązania fabryczne. Jest to praktyczne ze względu na oczywisty brak konieczności prowadzenia zasilania sieciowego. W tym celu należało rozwiązać kilka zagadnień.

Układy NRF24L01 w czasie nadawania lub nasłuchiwania/obierania danych pobierają nieco ponad 10mA. Sporo. W tym celu w pierwszej kolejności zaprojektowałem system który zapewni włączanie odbiornika tylko w wybranych momentach – spodziewanego nadjeścia ramki z danymi.

Czujnik zewnętrzny wysyła co minutę pakiet danych – 5 bajtów. Wysyłanie jest niezależne od stanu potwierdzenia poszczególnych ramek. Odbiornik włącza odbieranie po 59 sekundach od ostatniego odebranego pakietu. Jeśli w ciągu 65 sekund nie odbierze, nastepnym razem włączy odbieranie 5 sekund wcześniej i zaczeka 15 sekund. Jeśli i to nie przyniesie efektu, odbiornik zostanie ponownie włączony po 40 sekundach i zostanie włączony przed 25 sekund. Jeśli i tym razem nie uda się odbiór – stacja przejdzie w tryb odzyskiwania łączności – co 2 min. 10 sekund będzie włączać i wyłączać odbiornik. W każdej chwili odebranie pakietu powoduje zresetowanie zegara i wyłączenie odbiornika. Uklad NRF24L01 posiada dedykowaną linię CE do sterowania zasilaniem radia, zatem samo włączanie i wyłączanie odbiornika odbywa się poprzez przełączanie jednej linii.

Ramka danych ma postać (pierwszy i ostatni bajt nie przenoszą istotnych informacji):

  • 55
  • dwa kolejne bajty- temperatura tak, jak podaje ją DS18B20,
  • wilgotność jako liczba całkowita
  • 55

Oba czujniki atmosferyczne zasilane są bezpośrednio z linii mikrokotrolera, co pozwala na łatwe odłączenie ich zasilania.

Schemat odbiornika jak i wykonana płytka zakłąda zasilanie całości bezpośrednio z 3 baterii 1,5V a jedynie układ NRF24l01 poprzez stabilizator 3,3V(jego wejścia tolerują do 5V). Taki sposób okazał się nie najszczęśliwszy – Atmega328P przy zasilaniu 4,5V w trybie idle pobierała w granicach 2mA. Ostatecznie całość przerobiłem już na gotowej płytce aby była zasilana ze stabilizatora 3,3V. Czujnik DHT-11 wg naklejki na nim wymaga min. 3,5V, aczkolwiek nie stwierdziłem różnic w odczytach przy 3,3V.

Ostatecznie układ nadawczy pobiera około 0,25mA (w trybie IDLE, średnio będzie to nieco więcej). Powinno to w zasadzie zapewnić działanie przez długie miesiące na zestawie baterii.

Układ odbiornika pobiera jakieś 0,6mA, co też na zastosowanym akumulatorze powinno działać kilka tygodni. Podświetlenie wyświetlacza pochłania dodatkowe 10mA, ale uruchamiane jest na przycisk.

Oprogramowanie

Całość napisana w języku C w Atmel Studio 6. Zostałą wykorzystana biblioteka glcd – http://agock.com/software/glcd-graphic-lcd-library/ dla obsługi wyświetlacza wraz z generatorem znaków. Dla czujnika ds18b20 biblioteka stąd: http://davidegironi.blogspot.com/, do modułów radiowych stąd http://uhex.blogspot.com/2014/12/obsuga-moduu-radiowego-nrf24l01p-avr.html

Reszta jest mojego autorstwa. Czcionka na wyświetlaczu to PocketCalculator ściągnięta kiedyś z internetu przerobiona na mapy dla wyświetlacza za pomocą GLCD Font Creatora.

Na wyświetlaczu jest również pole ze statusem połączenia. Uśmiechnięta buźka symbolizuje poprawne docieranie ramek. Utrata 1 lub 2 ramek sygnalizowane jest wyświetleniem !. Utrata większej ilości danych – znakiem ? – tryb odzyskiwania łączności.

Płytki zaprojektowane w KiCadzie, wykonane metodą fotochemiczną. Moduły radiowe, ładowarki TP4056 i wyświetlacza zastosowałem gotowe.

Całość, jak wykazały testy działa przyzwoicie. Zdarzają się niekiedy utraty sygnału, jednak ogólnie niezawodność jest na  zadowalającym poziomie.

Do pobrania

Schemat i płytki KiCad:

Projekty Atmel Studio:

Ten wpis został opublikowany w kategorii Projekty. Dodaj zakładkę do bezpośredniego odnośnika.