W artykule opiszę moduł Lora składający się z nadajnika i odbiornika dla Arduino. Przedstawiony zostanie również przykład wykorzystania go do wysyłania krótkich wiadomości i wyświetlenia ich na porcie szeregowym. Specyfikacja urządzeń jak i biblioteki zostały również zamieszczone.
Spis treści
- Krótki opis
- Specyfikacja
- Przykład
- Pliki do pobrania
Krótki opis
Moduł Lora pozwala na jedno stroną komunikację (nadajnik -> odbiornik) o częstotliwości 315 Mhz. Można on służyć jako pilot do telewizora/bramy albo jako przekaźnik informacji pogodowych.
Specyfikacja
- Napięcie robocze nadajnika: 4 ~ 12 VDC
- Prąd roboczy nadajnika: 40 mA
- Moc nadawania: 27 dBm przy 12 VDC
- Częstotliwość robocza: 315 MHz
- Szybkość przesyłania: 4,8 kb/s (maks.)
- Odległość transmisji: Gdy zasilanie wynosi 5 V, odległość transmisji w otwartej przestrzeni wynosi około 150 metrów. Aby zwiększyć zasięg nadawania, można zwiększyć moc nadawanego prądu stałego do 12 V.
- Antena: Wbudowana dedykowana antena PCB 315 MHz.
- Napięcie podstawowe odbiornika: 2~5,5 V DC
- Prąd odbiornika: 2 mA
- Czułość: -110 dB
Przykład
Zasada działania
Moduł ma za zadanie wyświetlić na ekranie urządzenia do którego podłączony jest odbiornik przypisaną wiadomość w zależności od tego ile razy został wciśnięty przycisk.
Elementy
- nadajnik Lora
- odbiornik Lora
- 2 x Arduino Uno, Mega lub Nano
- 6x kable stykowe
- Przycisk
- Dioda Led
Połączenie nadajnika
- Arduino – Nadajnik
- GND – GND
- 5V – VCC
- pin 4 – SIG
- Arduino – Przycisk
- GND – GND (jeżeli korzystamy z arduino uno lub nano można wykorzystać płytkę stykową)
- 5V – VCC
- pin 11 –
Połączenie odbiornika
- Arduino – Odbiornik
- GND – GND
- 5V – VCC
- pin 4 – SIG
- Arduino – Dioda LED
- GND do krótszej nóżki
- 5V do dłuższej
Program nadajnika
Zaczniemy od dołączenia biblioteki oraz zdefiniowania zmiennych potrzebnych do utworzenia komunikacji. Potem definiujemy zmienną count odpowiadająco za to ile razy wcisneliśmy przycisk oraz pin przycisku. Dodatkowym elementem naszego kodu potrzebnym do wysyłania wiadomości są zmienne a-h typu const char co oznacza że nie mogą one zostać nadpisane. Do zmiennych przypisane są odpowiadające im litery. W kodzie odbiornika po odebraniu danej litery wyświetlony zostanie komunikat przypisany do niej.
#include <VirtualWire.h> uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; int button = 11; int count = 1; const char a = 'a'; const char b = 'b'; const char c = 'c'; const char d = 'd'; const char e = 'e'; const char f = 'f'; const char g = 'g'; const char h = 'h';
Kolejną elementem jest void setup(). Aktywujemy w niej komunikacje na porcie szeregowym z baudratem 9600. Następnie ustawiamy wartości dla VirtualWire takie jak zdefiniowanie pin-u odpowiadającego za komunikacje, szybkość transmisji oraz ustawienie stanu Low na pin-ie ppt. Oraz ustwiamy stan na pinie od guzika na INPUT_PULLUP.
void setup() { Serial.begin(115200); vw_set_ptt_inverted(true); // Required for RF Link modules vw_setup(300); // set data speed vw_set_tx_pin(4); pinMode(button, INPUT_PULLUP); }
Ostatnim krokiem w tym kodzie będzie funkcja void loop(). W niej funkcja if będzie sprawdzała czy wcisnęliśmy przycisk, jeżeli tak to nastąpi chwilowa przerwa po której odczytany zostanie ponownie stan przycisku. Jeżeli jest on wysoki zostanie wysłana wiadomość odpowiadająca liczbie tego ile razy wcisnęliśmy przycisk. Natomiast jeżeli po przerwie stan na pinie przycisku będzie niski to count zwiększy się o 1.
void loop() { if(digitalRead(button) == HIGH){ delay(1200); if(digitalRead(button) == LOW) { count = count + 1; Serial.println("Count :"); Serial.print(count); } else { if(count == 1) { vw_send((uint8_t *)a, strlen(a)); vw_wait_tx(); delay(200); } else if(count == 2) { vw_send((uint8_t *)b, strlen(b)); vw_wait_tx(); count = 1; delay(200); } else if(count == 3) { vw_send((uint8_t *)c, strlen(c)); vw_wait_tx(); count = 1; delay(200); } else if(count == 4) { vw_send((uint8_t *)d, strlen(d)); vw_wait_tx(); count = 1; delay(200); } else if(count == 5) { vw_send((uint8_t *)e, strlen(e)); vw_wait_tx(); count = 1; delay(200); } else if(count == 6) { vw_send((uint8_t *)f, strlen(f)); vw_wait_tx(); count = 1; delay(200); } else if(count == 7) { vw_send((uint8_t*)g, strlen(g)); vw_wait_tx(); count = 1; delay(200); } else { vw_send((uint8_t*)h, strlen(h)); vw_wait_tx(); count = 1; delay(200); } } } }
Program dla odbiornika
Tu ponownie musimy zdefiniować wszystkie zmienne do odbioru przesłanych danych. Definiujemy również pin led-u.
#include <VirtualWire.h> uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t buflen = VW_MAX_MESSAGE_LEN; int ledpin = 7; String str = (char*)buf;
Nastepnie ponownie w funkcji void setup ustawiamy wszystkie funkcje dla odbioru danych takie jak ustawienie pinu odbioru oraz ustawienie niskiego stanu na pinie ppt.
void setup() { Serial.begin(115200); vw_set_ptt_inverted(true); // Required for RF link modules vw_setup(300); vw_set_rx_pin(4); vw_rx_start(); pinMode(ledpin, OUTPUT); Serial.print("Comunication Starts\n"); }
Na koniec w funkcji void loop() po otrzymaniu poprawnej wiadomości z nadajnika wykona się jeden z wielu if-ów odpowiadający temu jaka litera została odebrana i wyświetli jej wiadość.
void loop() { if (vw_get_message(buf, &buflen)) { switch(buf[0]) { case 'a': Serial.println("Witaj"); digitalWrite(ledpin, HIGH); delay(200); digitalWrite(ledpin, LOW); delay(200); digitalWrite(ledpin, HIGH); delay(200); digitalWrite(ledpin, LOW); Serial.print("\n"); case 'b': Serial.println("Co u ciebie?"); for(int i = 0; i < 2; i++){ } case 'c': Serial.println("Mamy dzisiaj ładny dzień"); for(int i = 0; i < 3; i++) { } case 'd': Serial.println("Dobrego dnia"); for(int i = 0; i < 4; i++) { } case 'e': Serial.println("Jak ci minoł dzień?"); for(int i = 0; i < 5; i++) { } case 'f': Serial.println("Dzisiaj jest ładna pogoda"); for(int i = 0; i < 6; i++){ } case 'g': Serial.println("Mam nadzieje, że dzisiejszy dzień, okaże się dla ciebie lepszy"); for(int i = 0; i < 7; i++){ } case 'h': Serial.println("Dziękujemy Ci za skorzystanie z naszych usług"); for(int i = 0; i < 8; i++) { } } } }