Sending multiple values over RF using RADIOHEAD library

Hi

I have an arduino pro mini connected to a few sensors and a 433mhz transmitter that needs to transmit the readings to another arduino.

I am able to transmit a single reading with the code below. However, I'd like to send all 3 sensor values - but don't know how to do so. I don't 100% understand the code I'm using - I found it on a forum.

Help?

TX code:

#include <Wire.h>
#include <RH_ASK.h>
#include <SPI.h> // Not actually used but needed to compile

RH_ASK driver;
char b[5];
String str;

void writeI2CRegister8bit(int addr, int value) {
  Wire.beginTransmission(addr);
  Wire.write(value);
  Wire.endTransmission();
}

unsigned int readI2CRegister16bit(int addr, int reg) {
  Wire.beginTransmission(addr);
  Wire.write(reg);
  Wire.endTransmission();
  delay(20);
  Wire.requestFrom(addr, 2);
  unsigned int t = Wire.read() << 8;
  t = t | Wire.read();
  return t;
}

void setup() {
  Wire.begin();
  Serial.begin(9600);
  writeI2CRegister8bit(0x20, 6); //reset
  if (!driver.init())
      Serial.println("TX init failed");  
}

void loop() {
  uint16_t analog = readI2CRegister16bit(0x20, 0);
  uint8_t data[2] = {analog, (analog >> 8)}; // extract as {lower byte, upper byte)  
  Serial.print(analog); //read capacitance register
  Serial.print(", ");
  Serial.print(readI2CRegister16bit(0x20, 5)); //temperature register
  Serial.print(", ");
  writeI2CRegister8bit(0x20, 3); //request light measurement 
  Serial.println(readI2CRegister16bit(0x20, 4)); //read light register

  driver.send(data, 2);
  driver.waitPacketSent();  
  uint16_t merged = (data[1] << 8) | data[0]; //merge them back together  
  Serial.print("Sent: ");Serial.println(merged);
      
  delay(1000);
}

RX code:

// ask_receiver.pde
// -*- mode: C++ -*-
// Simple example of how to use RadioHead to receive messages
// with a simple ASK transmitter in a very simple way.
// Implements a simplex (one-way) receiver with an Rx-B1 module

#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile

RH_ASK driver;

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

void loop()
{
    uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
    uint8_t buflen = sizeof(buf);

    if (driver.recv(buf, &buflen)) // Non-blocking
    {
      uint16_t merged = (buf[1] << 8) | buf[0]; //merge them back together

	// Message with a good checksum received, dump it.
	//driver.printBuffer("Got:", buf, buflen);
        Serial.print("Got: ");Serial.println(merged);
    }
}

Make the transmit buffer (data[2]) bigger, e.g. data[6] for 3 integers. Eventually simpler, use
int data[3];
for 3 integers, and
driver.send(data,6); //6 == 3*sizeof(data[0])
but I'm not sure if that compiles well (may need typecast).

Thanks DrDiettrich.

I can't compile

driver.send(data,6);

since the send function requires uint8_t*.
I get this message "no known conversion for argument 1 from 'int [3]' to 'const uint8_t* {aka const unsigned char*}' "

This worked

driver.send((uint8_t*)data,6);

But I don't know how to read the data on the receiving side. I'm getting "1 0 1E 1 63 0 " instead of the 3 integers I sent.
How can I parse the data back to numbers?

Thanks!!

Here's the full TX again:

#include <Wire.h>
#include <RH_ASK.h>
#include <SPI.h> // Not actually used but needed to compile

RH_ASK driver;
char b[5];
String str;

void writeI2CRegister8bit(int addr, int value) {
  Wire.beginTransmission(addr);
  Wire.write(value);
  Wire.endTransmission();
}

unsigned int readI2CRegister16bit(int addr, int reg) {
  Wire.beginTransmission(addr);
  Wire.write(reg);
  Wire.endTransmission();
  delay(20);
  Wire.requestFrom(addr, 2);
  unsigned int t = Wire.read() << 8;
  t = t | Wire.read();
  return t;
}

void setup() {
  Wire.begin();
  Serial.begin(9600);
  writeI2CRegister8bit(0x20, 6); //reset
  if (!driver.init())
      Serial.println("TX init failed");  
}

void loop() {
  uint16_t analog = readI2CRegister16bit(0x20, 0);
//  uint8_t data[2] = {analog, (analog >> 8)}; // extract as {lower byte, upper byte)  
  int data[3];
  data[0]=1;
  data[1]=analog;
  data[2]=99;
  
  Serial.print(analog); //read capacitance register
  Serial.print(", ");
  Serial.print(readI2CRegister16bit(0x20, 5)); //temperature register
  Serial.print(", ");
  writeI2CRegister8bit(0x20, 3); //request light measurement 
  Serial.println(readI2CRegister16bit(0x20, 4)); //read light register

//  driver.send(data, 2);
  driver.send((uint8_t*)data,6); //6 == 3*sizeof(data[0])
  
  driver.waitPacketSent();  
//  uint16_t merged = (data[1] << 8) | data[0]; //merge them back together  
//  Serial.print("Sent: ");Serial.println(merged);
  Serial.print("Sent: ");Serial.println(data[1]);
      
  delay(1000);
}

And RX:

// ask_receiver.pde
// -*- mode: C++ -*-
// Simple example of how to use RadioHead to receive messages
// with a simple ASK transmitter in a very simple way.
// Implements a simplex (one-way) receiver with an Rx-B1 module

#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile

RH_ASK driver;

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

void loop()
{
    uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
    uint8_t buflen = sizeof(buf);

    if (driver.recv(buf, &buflen)) // Non-blocking
    {
 //     uint16_t merged = (buf[1] << 8) | buf[0]; //merge them back together
      
 // Message with a good checksum received, dump it.
 driver.printBuffer("Got:", buf, buflen);
      //  Serial.print("Got: ");Serial.println(merged);
//        Serial.print("Got: ");Serial.println(buf);
    }
}

m_i_k_e You were close.

driver.send((uint8_t*)data,6);

That is the correct way to send the 6 bytes of the three integers. What you printed out (1 1E1 63) is the hex representation of the data you sent 1, analog=481, 99.

Here is a sketch which shows the receive of the three integers directly into your data array.

#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile

RH_ASK driver;

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

void loop()
{
  //uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
  int receivedData[3] = {0};
  uint8_t buflen = sizeof(receivedData);

  //if (driver.recv(buf, &buflen)) // Non-blocking
  if (driver.recv((uint8_t*)receivedData, &buflen)) //if data is not an array, use &receivedData
  {
    for (byte i = 0; i < 3; i++)
    {
      Serial.print(receivedData[i]);
      Serial.print('\t');
      Serial.println(receivedData[i],HEX);
    }
  }
}