Hackster is hosting Hackster Holidays, Ep. 7: Livestream & Giveaway Drawing. Watch previous episodes or stream live on Friday!Stream Hackster Holidays, Ep. 7 on Friday!
Lithium ION
Published © GPL3+

LoRa Transmitter and Receiver using Arduino

The best project to use automation for long range without internet and GSM. Try the LoRa transmitter and receiver project to turn ON/OFF.

IntermediateFull instructions provided1.5 hours17,858
LoRa Transmitter and Receiver using Arduino

Things used in this project

Hardware components

Grove - LoRa Radio 433MHz
Seeed Studio Grove - LoRa Radio 433MHz
×1
Arduino UNO
Arduino UNO
×1

Software apps and online services

PCBWAY
Arduino IDE
Arduino IDE

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
Solder Wire, Lead Free
Solder Wire, Lead Free

Story

Read more

Custom parts and enclosures

Gerber files receiver

Schematics

TX

RX

Code

Receiver code

Arduino
#include <LoRa.h> 

const int LED1 = 3;   // indicator LED
const int RLY1 = 4;   // relay 1
const int RLY2 = 5;   // relay 2

String inString = "";    // string to hold input
int val = 0;
int SyncWord = 0x22;
 
void setup() {
  Serial.begin(9600);
  pinMode(LED1,OUTPUT);
  pinMode(RLY1,OUTPUT);
  pinMode(RLY2,OUTPUT);
  
  digitalWrite(LED1 , LOW);
  digitalWrite(RLY1 , HIGH);
  digitalWrite(RLY2 , HIGH);
  
  while (!Serial);
  Serial.println("LoRa Receiver");
  if (!LoRa.begin(433E6)) { // or 915E6
    Serial.println("Starting LoRa failed!");
    while (1);
  }
   LoRa.setSpreadingFactor(12);           // ranges from 6-12,default 7 see API docs
   LoRa.setSignalBandwidth(62.5E3);           // for -139dB (page - 112)
   LoRa.setCodingRate4(8);                   // for -139dB (page - 112)
   LoRa.setSyncWord(SyncWord);           // ranges from 0-0xFF, default 0x12, see API docs
/*
  Serial.print("current spreading factor : ");
  Serial.println(LoRa.getSpreadingFactor());
  Serial.print("current bandwidth : ");
  Serial.println(LoRa.getSignalBandwidth());
  Serial.println("LoRa init succeeded.");
  */
}
bool i=0;
int priviousValue = 0;
int liveValue = 0;

void loop() { 
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) { 
    // read packet    
    while (LoRa.available())
    {
      int inChar = LoRa.read();
      inString += (char)inChar;
      val = inString.toInt();  
      digitalWrite(LED1 , HIGH);
      delay(10);
      digitalWrite(LED1 , LOW);
      delay(10);     
    }
    inString = "";     
    LoRa.packetRssi();    
  }
  
  Serial.println(val);  
  liveValue = val;
    
  if(priviousValue != liveValue)
  {
    priviousValue = liveValue;
  
    if(val == 11)
    {
      digitalWrite(RLY1 , LOW);
    }
    
    if(val == 22)
    {
      digitalWrite(RLY1 , HIGH);
    }
  
    if(val == 33)
    {
      digitalWrite(RLY2 , LOW);
    }
    
    if(val == 44)
    {
      digitalWrite(RLY2 , HIGH);
    }
  }
  delay(50);
}

/*
 * 1. when switch 1 is pressed turn ON RLY1 & RLY2
 * 2. if 
 */

Transmitter Code

Arduino
#include <LoRa.h> 
//int pot = A0;
const int SW1 = 3;
const int SW2 = 4;


int SyncWord = 0x22;
 
void setup() {
  Serial.begin(9600);
  pinMode(SW1,INPUT_PULLUP);
  pinMode(SW2,INPUT_PULLUP);

  cli();                                    //stop interrupts
                                            //set timer1 interrupt at 1Hz = 1sec
  TCCR1A = 0;                               // set entire TCCR1A register to 0
  TCCR1B = 0;                               // same for TCCR1B
  TCNT1  = 0;                               // initialize counter value to 0
                                            // set compare match register for 1hz increments
  OCR1A = 15624;                            // = (16*10^6) / (1*1024) - 1 (must be <65536)
                                            
  TCCR1B |= (1 << WGM12);                   // turn on CTC mode                                      
  TCCR1B |= (1 << CS12) | (1 << CS10);      // Set CS10 and CS12 bits for 1024 prescaler                                          
  TIMSK1 |= (1 << OCIE1A);                  // enable timer compare interrupt

  sei();                                    //allow interrupts
  
  while (!Serial);  
  Serial.println("LoRa Sender");
  if (!LoRa.begin(433E6)) { // or 915E6, the MHz speed of yout module
    Serial.println("Starting LoRa failed!");
    while (1);
  }
  
  LoRa.setSpreadingFactor(12);           // ranges from 6-12,default 7 see API docs
  LoRa.setSignalBandwidth(62.5E3 );           // for -139dB (page - 112)
  LoRa.setCodingRate4(8);                   // for -139dB (page - 112)
  LoRa.setSyncWord(SyncWord);
/*
  Serial.print("current spreading factor : ");
  Serial.println(LoRa.getSpreadingFactor());
  Serial.print("current bandwidth : ");
  Serial.println(LoRa.getSignalBandwidth());
  Serial.println("LoRa init succeeded.");
  */
}

int priviousSwitchValue1 = 1;
int priviousSwitchValue2 = 1;
int liveSwitchValue1 = 0;
int liveSwitchValue2 = 0;
bool switchPressFlag1 = false;
bool switchPressFlag2 = false;
bool gLedPin = 0;

int data = 1;

void loop() {
  //static int data = 1;
  
  liveSwitchValue1 = digitalRead(SW1);
  if( (liveSwitchValue1 == 0) and (switchPressFlag1 == false) )
  {
    delay(50);
    data = 11;
    Serial.println("11");
    switchPressFlag1 = true;
    priviousSwitchValue1 = !priviousSwitchValue1;

    LoRa.beginPacket();  
    LoRa.print(data);
    LoRa.endPacket();
  }
  if( (liveSwitchValue1 == 1) and (switchPressFlag1 == true) )
  {
    delay(50);
    data = 22;
    Serial.println("22");
    switchPressFlag1 = false;
    LoRa.beginPacket();  
    LoRa.print(data);
    LoRa.endPacket();
  }
  
  liveSwitchValue2 = digitalRead(SW2);
  if( (liveSwitchValue2 == 0) and (switchPressFlag2 == false))
  {
    delay(50);
    data = 33;
    Serial.println("33");
    switchPressFlag2 = true;
    priviousSwitchValue2 = !priviousSwitchValue2;
    LoRa.beginPacket();  
    LoRa.print(data);
    LoRa.endPacket();
  }
  if( (liveSwitchValue2 == 1) and (switchPressFlag2 == true) )
  {
    delay(50);
    data = 44;
    Serial.println("44");
    switchPressFlag2 = false;
    LoRa.beginPacket();  
    LoRa.print(data);
    LoRa.endPacket();
  }

  
  if(gLedPin == 1)
  {
    data = 55;
    Serial.println("55");
    gLedPin = 0;
    LoRa.beginPacket();  
    LoRa.print(data);
    LoRa.endPacket();
  }
  
  // LoRa.beginPacket();  
  // LoRa.print(data);
  // LoRa.endPacket();
}

ISR(TIMER1_COMPA_vect){//timer1 interrupt 1Hz toggles pin 13 (LED)
//generates pulse wave of frequency 1Hz/2 = 0.5kHz (takes two cycles for full wave- toggle high then toggle low)
  static volatile int ledFlag = 0;
  if(++ledFlag >= 5)
  {
    gLedPin = 1;
    ledFlag = 0;
  }
}

Credits

Lithium ION
53 projects • 34 followers
A passionate electronics DIY boy. Currently improving in Embedded systems, soldering and programming.

Comments