Arduino LoRa Dragino-Shield V1.4 Vebindung rf95

Für ein Projekt habe ich eine Point to Point-Verbindung gemacht mit einem Arduino UNO (client) und einem Arduino MEGA (server) mit je einem LoRa Dragino-Shield.

Hardware:
Arduino UNO + LoRa-Shield von Dragino
Arduino MEGA + LoRa-Shield von Dragino

Die Verbindung ist stabil und funktioniert mit der RadioHead library.

Nun möchte ich die folgenden Sensordaten vom UNO senden und auf dem MEGA mittels HMI darstellen:

  • 2x Digitaler Eingang (Ein/Aus)
  • 2x Analoger Wert von zwei Poti’s

Meine Frage ist, wie kann ich diese Sensor-Werte übermitteln, damit sie am Arduino MEGA ausgewertet werden können? (nicht mit Serial.println…)

Die Anbindung des HMI interessiert mich im Moment auch noch nicht :slight_smile:

Code des UNO (client):

#include <SPI.h>
#include <RH_RF95.h>

// Singleton instance of the radio driver
RH_RF95 rf95;

void setup() 
{

  Serial.begin(9600);
  while (!Serial) ; // Wait for serial port to be available
  if (!rf95.init())
    Serial.println("init failed");
}

void loop()
{
  Serial.println("Sending to rf95_server");
  // Send a message to rf95_server
  uint8_t data[] = "Hello World!";
  rf95.send(data, sizeof(data));
  
  rf95.waitPacketSent();
  // Now wait for a reply
  uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

  if (rf95.waitAvailableTimeout(3000))
  { 
    // Should be a reply message for us now   
    if (rf95.recv(buf, &len))
   {
      Serial.print("got reply: ");
      Serial.println((char*)buf);
//      Serial.print("RSSI: ");
//      Serial.println(rf95.lastRssi(), DEC);    
    }
    else
    {
      Serial.println("recv failed");
    }
  }
  else
  {
    Serial.println("No reply, is rf95_server running?");
  }
  delay(400);
}

Code des MEGA (server)

#include <SPI.h>
#include <RH_RF95.h>

// Singleton instance of the radio driver
RH_RF95 rf95;

int led = 53;

void setup() 
{

  pinMode(led, OUTPUT);     
  Serial.begin(9600);
  while (!Serial) ; // Wait for serial port to be available
  if (!rf95.init())
    Serial.println("init failed");  
  // Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on

  // The default transmitter power is 13dBm, using PA_BOOST.
  // If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then 
  // you can set transmitter powers from 5 to 23 dBm:
//  driver.setTxPower(23, false);
  // If you are using Modtronix inAir4 or inAir9,or any other module which uses the
  // transmitter RFO pins and not the PA_BOOST pins
  // then you can configure the power transmitter power for -1 to 14 dBm and with useRFO true. 
  // Failure to do that will result in extremely low transmit powers.
//  driver.setTxPower(14, true);
}

void loop()
{
  if (rf95.available())
  {
    // Should be a message for us now   
    uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);
    if (rf95.recv(buf, &len))
    {
      digitalWrite(led, HIGH);
//      RH_RF95::printBuffer("request: ", buf, len);
      Serial.print("got request: ");
      Serial.println((char*)buf);
//      Serial.print("RSSI: ");
//      Serial.println(rf95.lastRssi(), DEC);
      
      // Send a reply
      uint8_t data[] = "And hello back to you";
      rf95.send(data, sizeof(data));
      rf95.waitPacketSent();
      Serial.println("Sent a reply");
       digitalWrite(led, LOW);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
}
1 Like

Du hast 2 grundlegende Möglichkeiten:

  1. Du sendest Binärdaten (ist kürzer, aber nicht unbedingt einfacher)
  2. Du sendest Text mit LineFeed (LF, '\n') abgeschlossen
    z.B. T1:0;T2:1;P1:123;P2:533\n

Das kannst Du erst mal mit dem seriellen Monitor testen und wenn es funktioniert, auf Lora übertragen.
Schau Dir dazu auch die Infos zu Zeichenketten an.

Gruß Tommy

Vielen Dank für die Antwort

Ich werde die 2. Variante versuchen und ein Feedback geben!

Gruss Pascal