mx-rm-5V two transmitters to one receiver

Hello everyone. I am working on a project where I need to send changing voltages from 2 (or more) devices via 433Mhz transmitters to one receiver. I thought about trying to do it with strings but I am getting kinda stuck. Would like some advice on how to send strings from two transmitters to one receiver

what technology do the 433mHz transmitters use, e.g. LoRa
encode your strings as array of bytes (characters) for transmission

I was also about to comment on that, if you can reveal which '433Mhz' devices you are using (there are lots of different ones) someone may be able to help.

It's called mx-rm-5V

Can you provide the forum with a link describing the actual modules you are using ?

This is a link to one of the tutorials. I have found a tutorial on how to get two transmissions but it's a basic array with two integers and I want to try and get the receiver to decode a string and from which device it gets that string

try changing the title of your post to 'mx-rm-5V two transmitters to one receiver'
if you do a web search for arduino mx-rm-5V you will get plentry of links

if you have two transmitters the transmitted packets should carry an identifer so the receiver knows the source, for an example using LoRa with multiple transmitters see post decimals-strings-and-lora

Why do you want to send and receive a string, does the string change for some reason ?

Yes. It is a changing voltage and I want to show it on an LCD display. I basically want to show the two devices' voltage at any time

Sending a number for a voltage is heaps easier than sending a 'String'

The problem itself is that I am not sure how to get the receiver to decode which is which. For the base idea I used an array with two inputs of 0 and 1 so it was quite simple to do with "if" statements. Now I can check which is which but I am not sure how to tell the receiver to take the right transmission because I think it just takes the first transmission that gets to it without trying to decode which transmitter sent it

If the example you linked to sends two integers, then use one integer to define the node number and the other interger is the voltage.

Thus the reciever knows the node number where the voltage came from.

It just takes the last transmission it received and I have to check both the node and the binary value each time. If I will try to do it with the changing voltage it will just check which transmitter sent but will take the last transmission even if it's from the other transmitter

#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
RH_ASK driver;
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x3F, 16, 2);

void setup()
{
    Serial.begin(9600);  // Debugging only
    if (!driver.init())
         Serial.println("init failed");
         lcd.init();
         lcd.backlight();
}

void loop()
{
    uint8_t buf[11];
    uint8_t buflen = sizeof(buf);
    if (driver.recv(buf, &buflen)) // Non-blocking
    {
      lcd.setCursor(0, 0);
      lcd.print((char*)buf);         
    }
}

This is the code I used for only one transmitter. Now I am trying to think how to add another transmitter. Adding another variable called "buf2" for example does nothing. It goes by the last received transmission

use a structure with members indicating transmitter node ID, message sequence number, etc, e.g.

// 433MHz transmitter test 1

#include <RH_ASK.h>     // Include RadioHead Amplitude Shift Keying Library
#include <SPI.h>        // Include dependant SPI Library

RH_ASK rf_driver;       // Create Amplitude Shift Keying Object

#define nodeID 1  //  <<< set up required node ID

struct __attribute__((packed)) Struct1 {
  byte StructureID;  // identifies the structure type
  byte NodeID;       // ID of transmitting node
  int16_t seq;       // sequence number
  int16_t x;
  float y;
  char z[10];
};

Struct1 struct1 = { 1, nodeID, 0, 1, 4.5, "hello" };

void setup() {
  Serial.begin(115200);
  rf_driver.init();       // Initialize ASK Object
  Serial.println("Transmitter: rf_driver initialised");
}

// transmit packet every 5 seconds
void loop() {
  Serial.print("Transmitting ");
  struct1.seq++;  // increment packet sequence number
  struct1.x += 1;
  struct1.y += 1;
  struct1.z[0] += 1;
  const char *msg = "Hello World";
 // rf_driver.send((uint8_t *)msg, strlen(msg));
  rf_driver.send((uint8_t *)&struct1, sizeof(struct1));
  rf_driver.waitPacketSent();
   Serial.print(" StructureID ");
  Serial.print(struct1.StructureID);
  Serial.print(" Node ");
  Serial.print(nodeID);
  Serial.print(" seq number ");
  Serial.print(" seq number ");
  Serial.print(struct1.seq);
  Serial.print(" x = ");
  Serial.print(struct1.x);
  Serial.print(" y = ");
  Serial.print(struct1.y);
  Serial.print(" z = ");
  Serial.println(struct1.z);
  delay(5000);
}

corresponding receiver

// 433MHz receiver test 1

#include <RH_ASK.h>  // Include RadioHead Amplitude Shift Keying Library
#include <SPI.h>     // Include dependant SPI Library

RH_ASK rf_driver;  // Create Amplitude Shift Keying Object

struct __attribute__((packed)) Struct1 {
  byte StructureID;  // identifies the structure type
  byte NodeID;       // ID of transmitting node
  int16_t seq;       // sequence number
  int16_t x;
  float y;
  char z[10];
} struct1;

void setup() {
  rf_driver.init();  // Initialize ASK Object
  Serial.begin(115200);
  Serial.println("Receiver: rf_driver initialised");
}

void loop() {

  uint8_t buf[100];  // Set buffer to size of expected message
  // Check if received packet is correct size
  if (rf_driver.recv((uint8_t *)&struct1, sizeof(struct1))) {
    // Message received with valid checksum
    Serial.print("Received: ");
    Serial.print(" StructureID ");
    Serial.print(struct1.StructureID);
    Serial.print(" from Node ");
    Serial.print(struct1.NodeID);
    Serial.print(" seq number ");
    Serial.print(struct1.seq);
    Serial.print(" x = ");
    Serial.print(struct1.x);
    Serial.print(" y = ");
    Serial.print(struct1.y);
    Serial.print(" z = ");
    Serial.println(struct1.z);
  }
}

when run transmitter serial monitor displays

Transmitter: rf_driver initialised
Transmitting  StructureID 1 Node 1 seq number  seq number 1 x = 2 y = 5.50 z = iello
Transmitting  StructureID 1 Node 1 seq number  seq number 2 x = 3 y = 6.50 z = jello
Transmitting  StructureID 1 Node 1 seq number  seq number 3 x = 4 y = 7.50 z = kello
Transmitting  StructureID 1 Node 1 seq number  seq number 4 x = 5 y = 8.50 z = lello
Transmitting  StructureID 1 Node 1 seq number  seq number 5 x = 6 y = 9.50 z = mello
Transmitting  StructureID 1 Node 1 seq number  seq number 6 x = 7 y = 10.50 z = nello
Transmitting  StructureID 1 Node 1 seq number  seq number 7 x = 8 y = 11.50 z = oello
Transmitting  StructureID 1 Node 1 seq number  seq number 8 x = 9 y = 12.50 z = pello

and receiver

Receiver: rf_driver initialised
Received:  StructureID 1 from Node 1 seq number 1 x = 2 y = 5.50 z = iello
Received:  StructureID 1 from Node 1 seq number 1 x = 2 y = 5.50 z = iello
Received:  StructureID 1 from Node 1 seq number 2 x = 3 y = 6.50 z = jello
Received:  StructureID 1 from Node 1 seq number 3 x = 4 y = 7.50 z = kello
Received:  StructureID 1 from Node 1 seq number 4 x = 5 y = 8.50 z = lello
Received:  StructureID 1 from Node 1 seq number 5 x = 6 y = 9.50 z = mello
Received:  StructureID 1 from Node 1 seq number 6 x =  y = 10.50 z = nello

the receiver uses the NodeID to determine which transmitter sent the packet and the sequence number to check for lost or duplicate packets etc etc

Thanks Horace. How do you rename a post? Do I start a new thread?

Jeff

results of code of post 15 using two transmitters NodeID 1 and 2
receiver displays - NodeID 2 been running for some time NodeID 1 powers up

Receiver: rf_driver initialised

Received:  StructureID 1 from Node 2 seq number 54 x = 55 y = 58.50 z = �ello
Received:  StructureID 1 from Node 2 seq number 55 x = 56 y = 59.50 z = �ello
Received:  StructureID 1 from Node 1 seq number 1 x = 2 y = 5.50 z = iello
Received:  StructureID 1 from Node 2 seq number 56 x = 57 y = 60.50 z = �ello
Received:  StructureID 1 from Node 1 seq number 1 x = 2 y = 5.50 z = iello
Received:  StructureID 1 from Node 2 seq number 57 x = 58 y = 61.50 z = �ello
Received:  StructureID 1 from Node 1 seq number 2 x = 3 y = 6.50 z = jello
Received:  StructureID 1 from Node 2 seq number 58 x = 59 y = 62.50 z = �ello
Received:  StructureID 1 from Node 1 seq number 3 x = 4 y = 7.50 z = kello
Received:  StructureID 1 from Node 2 seq number 59 x = 60 y = 63.50 z = �ello
Received:  StructureID 1 from Node 1 seq number 4 x = 5 y = 8.50 z = lello
Received:  StructureID 1 from Node 2 seq number 60 x = 61 y = 64.50 z = �ello
Received:  StructureID 1 from Node 1 seq number 5 x = 6 y = 9.50 z = mello
Received:  StructureID 1 from Node 2 seq number 61 x = 62 y = 65.50 z = �ello
Received:  StructureID 1 from Node 1 seq number 6 x = 7 y = 10.50 z = nello
Received:  StructureID 1 from Node 2 seq number 62 x = 63 y = 66.50 z = �ello
Received:  StructureID 1 from Node 1 seq number 7 x = 8 y = 11.50 z = oello

these devices appear to use a basic ALOHA protocol - when a packet becomes available it is transmitted - it may be received OK or where other stations are transmitting or there is transmission on the same frequency may be corrupted and lost

this version of the receiver checks the received sequence number against the expected sequence and if not the same reports an error message

// 433MHz receiver test 1

#include <RH_ASK.h>  // Include RadioHead Amplitude Shift Keying Library
#include <SPI.h>     // Include dependant SPI Library

RH_ASK rf_driver;  // Create Amplitude Shift Keying Object

struct __attribute__((packed)) Struct1 {
  byte StructureID;  // identifies the structure type
  byte NodeID;       // ID of transmitting node
  int16_t seq;       // sequence number
  int16_t x;
  float y;
  char z[10];
} struct1;

void setup() {
  rf_driver.init();  // Initialize ASK Object
  Serial.begin(115200);
  Serial.println("Receiver: rf_driver initialised");
}

void loop() {
  static int16_t node1seq = 0, node2seq = 0, seqErrors = 0;
  ;
  uint8_t buf[100];  // Set buffer to size of expected message
  // Check if received packet is correct size
  if (rf_driver.recv((uint8_t *)&struct1, sizeof(struct1))) {
    // Message received with valid checksum
    Serial.print("Received: ");
    Serial.print(" StructureID ");
    Serial.print(struct1.StructureID);
    Serial.print(" from Node ");
    Serial.print(struct1.NodeID);
    Serial.print(" seq number ");
    Serial.print(struct1.seq);
    Serial.print(" x = ");
    Serial.print(struct1.x);
    Serial.print(" y = ");
    Serial.print(struct1.y);
    Serial.print(" z = ");
    Serial.println(struct1.z);
    if (struct1.NodeID == 1) {
      if (struct1.seq != node1seq) {
        Serial.print("  seq number error expected ");
        Serial.print(node1seq);
        Serial.print("  seq  errors ");
        Serial.println(++seqErrors);
        node1seq = struct1.seq;
      }
      node1seq++;
    }
    if (struct1.NodeID == 2) {
      if (struct1.seq != node2seq) {
        Serial.print("  seq number error expected ");
        Serial.print(node2seq);
        Serial.print("  seq  errors ");
        Serial.println(++seqErrors);
        node2seq = struct1.seq;
      }
      node2seq++;
    }
  }
}

a run shows once the sequence numbers are synchronised it operates so

Receiver: rf_driver initialised
Received:  StructureID 1 from Node 2 seq number 4 x = 5 y = 8.50 z = lello
  seq number error expected 0  seq  errors 1
Received:  StructureID 1 from Node 1 seq number 5 x = 6 y = 9.50 z = mello
  seq number error expected 0  seq  errors 2
Received:  StructureID 1 from Node 2 seq number 5 x = 6 y = 9.50 z = mello
Received:  StructureID 1 from Node 1 seq number 6 x = 7 y = 10.50 z = nello
Received:  StructureID 1 from Node 2 seq number 6 x = 7 y = 10.50 z = nello
Received:  StructureID 1 from Node 1 seq number 7 x = 8 y = 11.50 z = oello
Received:  StructureID 1 from Node 2 seq number 7 x = 8 y = 11.50 z = oello
Received:  StructureID 1 from Node 1 seq number 8 x = 9 y = 12.50 z = pello
Received:  StructureID 1 from Node 2 seq number 8 x = 9 y = 12.50 z = pello
Received:  StructureID 1 from Node 1 seq number 9 x = 10 y = 13.50 z = qello

The transmitter of post 15 has a delay of 5seconds between packets - changing this can cause collisions
e.g. transmitter 1 sending every 5 seconds transmitter 2 every 500mSec

Received:  StructureID 1 from Node 2 seq number 312 x = 313 y = 316.50 z = �ello
Received:  StructureID 1 from Node 1 seq number 68 x = 69 y = 72.50 z = �ello
  seq number error expected 67  seq  errors 44
Received:  StructureID 1 from Node 2 seq number 314 x = 315 y = 318.50 z = �ello
  seq number error expected 313  seq  errors 45
Received:  StructureID 1 from Node 2 seq number 315 x = 316 y = 319.50 z = �ello
Received:  StructureID 1 from Node 2 seq number 316 x = 317 y = 320.50 z = �ello
Received:  StructureID 1 from Node 2 seq number 317 x = 318 y = 321.50 z = �ello

the more traffic the more collisions occur
transmitter 1 sending every 1 second transmitter 2 every 500mSec

Received:  StructureID 1 from Node 2 seq number 4072 x = 4073 y = 4076.50 z = Pello
  seq number error expected 4071  seq  errors 1702
Received:  StructureID 1 from Node 1 seq number 2066 x = 2067 y = 2070.50 z = zello
  seq number error expected 2064  seq  errors 1703
Received:  StructureID 1 from Node 2 seq number 4073 x = 4074 y = 4077.50 z = Qello
Received:  StructureID 1 from Node 2 seq number 4074 x = 4075 y = 4078.50 z = Rello
Received:  StructureID 1 from Node 1 seq number 2067 x = 2068 y = 2071.50 z = {ello
Received:  StructureID 1 from Node 2 seq number 4075 x = 4076 y = 4079.50 z = Sello
Received:  StructureID 1 from Node 2 seq number 4077 x = 4078 y = 4081.50 z = Uello
  seq number error expected 4076  seq  errors 1704
Received:  StructureID 1 from Node 2 seq number 4079 x = 4080 y = 4083.50 z = Wello
  seq number error expected 4078  seq  errors 1705
Received:  StructureID 1 from Node 1 seq number 2070 x = 2071 y = 2074.50 z = ~ello
  seq number error expected 2068  seq  errors 1706
Received:  StructureID 1 from Node 2 seq number 4080 x = 4081 y = 4084.50 z = Xello
Received:  StructureID 1 from Node 2 seq number 4081 x = 4082 y = 4085.50 z = Yello
Received:  StructureID 1 from Node 1 seq number 2071 x = 2072 y = 2075.50 z = ello
Received:  StructureID 1 from Node 2 seq number 4082 x = 4083 y = 4086.50 z = Zello
Received:  StructureID 1 from Node 2 seq number 4084 x = 4085 y = 4088.50 z = \ello
  seq number error expected 4083  seq  errors 1707
Received:  StructureID 1 from Node 2 seq number 4086 x = 4087 y = 4090.50 z = ^ello
  seq number error expected 4085  seq  errors 1708
Received:  StructureID 1 from Node 1 seq number 2074 x = 2075 y = 2078.50 z = �ello
  seq number error expected 2072  seq  errors 1709

the receiver code can only detect lost packets (using the sequence number)

a duplex system supporting two way communication can use a more more sophisticated protocol to correct for errors, e.g. on report of lost packet the receiver could send a message to the transmitter requesting retransmission up to a sliding window protocol

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.