Zaloguje się
or
Tel +48 698 615 740

Arduino Lora – nadajnik i odbiornik 315mhz

22 lutego, 2022

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++) {
          
         
         }
      }
    }  
}

Pliki do pobrania

Sticky
Możliwość komentowania Arduino Lora – nadajnik i odbiornik 315mhz została wyłączona
Dadas Bartosz

Dadas Bartosz

Jest Uczniem Technikum Budowlano-Elektronicznego w Świdnicy na kierunku Technik Informatyk. Na co dzień oprócz projektów z ardunio uczy się programować aplikacje mobile. W przyszłości chcę zostać programistą.

Comments are closed.

Strona korzysta z plików cookies w celu realizacji usługi i zgodnie z Polityką Plików Cookies. Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.