[ARDUINO] Bezprzewodowy czujnik temperatury z modułami nRF24L01

Moduły nRF24L01 to idealne rozwiązanie do utworzenia między mikrokontrolerami dwukierunkowej komunikacji radiowej na niewielkie odległości.

Moduły takie pracują na częstotliwości nośnej 2,4 GHz, wykorzystując modulację GFSK (modulacja FSK z filtracją gaussowską, znana chociażby z urządzeń DECT czy Bluetooth). Dzięki zintegrowanej antenie mikropaskowej, nie potrzeba żadnych zewnętrznych elementów do ich poprawnej pracy z wysoką sprawnością. Dodatkowo, moduł nRF24L01 pozwala na wybór jednej z czterech mocy nadawania, przy czym najwyższa możliwa moc jest na poziomie 0 dBm, co odpowiada wartości 1 mW.

Komunikacja modułu z mikrokontrolerem odbywa się za pośrednictwem magistrali SPI, sam moduł natomiast pozwala na wygenerowanie przerwania w momencie odebrania danych – dzięki czemu możliwe jest np. wybudzenie procesora ze stanu wstrzymania.

 

 

W projekcie użyto dwóch płytek Arduino UNO R3, pary modułów nRF24L01, a także czujnika temperatury DS18B20 i płytki rozszerzającej do Arduino – LCD Keypad Shield.

W dalszej części artykułu zestaw Arduino + sensor temperatury + moduł nRF nazywany będzie nadajnikiem, zaś odbiornikiem nazywane będzie połączenie Arduino z nakładką LCD Keypad Shield i drugim modułem radiowym.

 

 

Zadaniem nadajnika jest przesyłanie do odbiornika informacji o temperaturze, odczytywanej z układu DS18B20. Odbiornik zaś wyświetla odebrane dane na wyświetlaczu ciekłokrystalicznym oraz przekazuje je do komputera wraz z wartością instrukcji MILLIS(), której działanie zostanie opisane później.

Moduły radiowe dołączone zostały za pomocą przewodów połączeniowych do modułu Arduino UNO. Programy do obu mikrokontrolerów zostały napisane w Arduino, z użyciem dodatkowych bibliotek (umieszczone w załączniku do artykułu): MIRF (biblioteka układu nRF24L01), oneWire oraz DallasTemperature (obie ostatnie służą do obsługi układu DS18B20).

Ze względu na ograniczenia konstrukcyjne, zasilanie układu nRF24L01 nie może przekraczać 3,6 V, dlatego zostało podłączone do punktu na płytce Arduino, w którym wyprowadzono napięcie 3,3 V. Linie sygnałowe modułu radiowego mogą natomiast przyjąć napięcia do 5 V, więc nie jest wymagane użycie konwertera poziomów napięć. Ten sposób podłączenia zasilania dotyczy obu modułów nRF24L01.

Nadajnik składa się z Arduino, czujnika DS18B20, modułu nRF24L01 oraz diody świecącej.

Miganie LED sygnalizuje nadawanie pakietu, zawierającego wynik pomiaru temperatury – taki pomiar wykonywany jest co około 2 sekundy.

Do obsługi czujnika DS18B20 wykorzystano biblioteki DallasTemperature oraz OneWire. Nadawanie wykonywane jest przy wsparciu modułu nRF24L01 biblioteką MIRF, dzięki czemu program jest prosty i przejrzysty. Deklarację bibliotek oraz funkcję setup(), inicjującą i konfigurującą podstawowe funkcje układu, przedstawiono na listingu 1.

 

Listing 1. Deklaracje i funkcja setup() w kodzie nadajnika 

Warto zwrócić uwagę na instrukcje „Mirf.setTADDR()” oraz „Mirf.setRADDR()” – służą one do ustalania adresu, pod który będzie nadawana informacja lub z którego będzie ona odbierana. Adres taki może mieć od 3 do 5 bajtów (co można ustawić w rejestrze AW modułu nRF24L01).

Za pomocą instrukcji Mirf.payload ustawiono wielkość przesyłanych danych – odpowiada ona wielkości zmiennej float (4 bajty). Maksymalnie można przekazać 32 bajty naraz.

Warto zaznaczyć, że w tym projekcie mamy jeden nadajnik i jeden odbiornik, jednakże moduły radiowe przystosowane są do pracy dwukierunkowej (każdy moduł może nadawać lub odbierać).

W pętli „void loop()” wykonywany jest pomiar temperatury, zapis wyniku do zmiennej oraz wysłanie jej przez SPI do modułu nRF24L01. W dużej części wykorzystano tu biblioteki – dzięki czemu np. odczyt temperatury czy nadanie zmiennej sprowadza się do wykonania jednej instrukcji.

Każda z instrukcji ma określony czas, przez który jest wykonywana – w przypadku odwołania do biblioteki, żądając pomiaru temperatury, wprowadzane jest opóźnienie rzędu 700 mS, które pozwala czujnikowi na odpowiednie przygotowanie zebranych danych do przekazania. Stąd, przybliżony czas wykonania pętli „void loop()” wynosi ponad 2 s. Treść pętli głównej przedstawiono na listingu 2.

 

Listing 2. Pętla główna void loop (kod nadajnika)

Odbiornik składa się z Arduino UNO R3, płytki z wyświetlaczem oraz modułu radiowego. Sposób podłączenia modułu nRF24L01 rożni się od zalecanego połączenia – spowodowane to jest użyciem płytki LCD Keypad Shield, której złącza sygnałowe zajęły sygnały CSN oraz CE. Dlatego też w funkcji setup() znajdują się przypisania: Mirf.csnPin = 2; Mirf.cePin = 3; Przewody SPI zostały podłączone do złącza programowania ISP, gdyż jest to jedyny punkt na płytce LCD Keypad Shield, gdzie znajdują się wyprowadzenia linii takich, jak MOSI, MISO, SCK. W funkcji setup() konfigurowana jest także transmisja szeregowa (prędkość 9600 b/s, 8 bitów danych, brak bitów parzystości, 1 bit stopu), inicjowany jest wyświetlacz HD44780 oraz konfigurowana jest linia sterująca jego podświetleniem. Po włączeniu zasilania podświetlenie wyświetlacza powinno mignąć.

 

Listing 3. Kod programu odbiornika: deklaracje i funkcja setup()

W pętli głównej programu odbierana jest zmienna zawierająca informację przesłaną z nadajnika. Zostaje ona wyświetlona na LCD, a także przesłana przez UART do komputera, w towarzystwie wartości instrukcji MILLIS(), która liczy czas (w mS) od momentu dołączenia zasilania do płytki ARDUINO. Dzięki tej informacji, można łatwo analizować zmiany temperatur w czasie pracy układu (uwaga – po dłuższym czasie wartość instrukcji MILLIS() przepełni się, zaczynając liczenie od początku). Na ekranie LCD, poza temperaturą, wyświetlania jest także gwiazdka „*” w momencie odebrania z toru radiowego informacji wysłanej przez wcześniej opisany moduł nadajnika. Jest to sygnał dla użytkownika, że transmisja radiowa jest aktywna, a przedstawiana temperatura – aktualna. Miganie gwiazdki na wyświetlaczu odbiornika powinno być zsynchronizowane z miganiem LED w nadajniku. Listing 4 przedstawia pętlę „void loop()”.

 

Listing 4. Pętla główna void loop() w programie odbiornika

Termometr może mierzyć temperatury z zakresu -55 do +125 stopni Celsiusza.

Sposób podłączenia modułów do Arduino opisano w komentarzach na początku programów.

Należy zwrócić uwagę na kolejność uruchamiania urządzeń – zaleca się uruchomienie jako pierwszego odbiornika.

Producent szacuje zasięg radiowy modułów na około 100m w otwartej przestrzeni.

Pełny kod (nadajnik):

Pełny kod (odbiornik):

Do pobrania

O autorze