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);
}
}
}