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.