Thanks Nick.
The sketch relays packets from other RFM22B nodes on a network. It uses Mike McCauleys library RF22: RF22 library for Arduino. Sketch as follows:
#include <RF22Datagram.h>
#include <RF22.h>
#include <SPI.h>
#define BUFFERLENGTH 8
char SoftwareVersion[] = "Centre version 1.0";
uint8_t PumpAddress = 1;
uint8_t RelayAddress = 2;
uint8_t CentreAddress = 3;
uint8_t BoomAddress = 4;
uint8_t SSpin = 10;
uint8_t Intpin = 0;
uint8_t ErrorCount = 0;
long interval = 5000;
long previousMillis = 0;
uint8_t RfBuffer[BUFFERLENGTH];
RF22Datagram rf22(RelayAddress, SSpin, Intpin);
void setup()
{
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
delay(3000);
digitalWrite(8, LOW);
Serial.begin(1200);
Serial.println(F("Setup"));
SPI.setClockDivider(SPI_CLOCK_DIV4);
InitialiseRF();
}
void loop()
{
rf22.waitAvailableTimeout(2000);
uint8_t len = sizeof(RfBuffer);
uint8_t from;
uint8_t to;
if (rf22.recvfrom(RfBuffer, &len, &from, &to))
{
Serial.print(F("got request from: "));
Serial.println(from, HEX);
Serial.print(F(" Type: "));
Serial.print((char)RfBuffer[1]);
Serial.print(F(" "));
Serial.print(F("Dest: "));
Serial.print(RfBuffer[2]);
Serial.print(F(" "));
Serial.print(F("Payload: "));
Serial.println(RfBuffer[3]);
test_rssi();
digitalWrite(8, HIGH);
delay(150);
digitalWrite(8, LOW);
if(to == RelayAddress)
{
if(RfBuffer[2] == CentreAddress)
{
rf22.sendto(RfBuffer, sizeof(RfBuffer), CentreAddress);
rf22.waitPacketSent();
Serial.print(F("Relayed1 from "));
Serial.print(from, DEC);
Serial.println(F(" to Centre"));
}
else if(RfBuffer[2] == BoomAddress)
{
rf22.sendto(RfBuffer, sizeof(RfBuffer), CentreAddress);
rf22.waitPacketSent();
Serial.print(F("Relayed2 from "));
Serial.print(from, DEC);
Serial.println(F(" to Boom"));
}
else if(RfBuffer[2] == PumpAddress)
{
rf22.sendto(RfBuffer, sizeof(RfBuffer), PumpAddress);
rf22.waitPacketSent();
Serial.print(F("Relayed from "));
Serial.print(from, DEC);
Serial.println(F(" to Pump"));
}
else if(RfBuffer[2] == RelayAddress)
{
ClearBuffer();
uint8_t x = random(250);
RfBuffer[0] = '<';
RfBuffer[1] = 'A';
RfBuffer[2] = from;
RfBuffer[3] = 2;
RfBuffer[4] = x;
RfBuffer[5] = '>';
rf22.sendto(RfBuffer, sizeof(RfBuffer), from);
rf22.waitPacketSent();
Serial.print(F("Ping replied to: "));
Serial.println(from, DEC );
}
Serial.println(F("--------"));
ErrorCount = 0;
}
}
else
{
Serial.println(F("recv failed"));
ErrorCount ++;
if (ErrorCount > 4)
{
Serial.println(F("Re initialising"));
ErrorCount = 0;
//InitialiseRF();
//delay(3000);
}
}
}
int ClearBuffer()
{
for (int i = 0; i < BUFFERLENGTH; i++)
{
RfBuffer[i]= 0;
}
}
void InitialiseRF()
{
if (!rf22.init())
Serial.println(F("RF22 init failed"));
else
{
rf22.setModemConfig(RF22::GFSK_Rb2_4Fd36);
rf22.setTxPower(RF22_TXPOW_20DBM);
}
}
void test_rssi()
{
rf22.setModeRx();
uint8_t rssi = rf22.lastRssi();
Serial.print(F("RSSI"));
Serial.print(F(": "));
Serial.println(rssi, DEC);
rf22.setModeIdle();
}