/* This Sketch is for the Reciever */
const int baud = 9600; //Serial baud rate
const bool startTest = true; //Run an LED test on startup?
const int rfCH = 120; //Radio Channel
const int errorTol = 100; //How many errors to allow? (One per rfTimeout)
const int resetDelay = 1000; //How long to stay in error moe
const int KaReset = 30000; //After this, reset due to no new data
const int dlyXShort = 50;
const int dlyShort = 200;
const int dlyMid = 300;
const int dlyLong = 500;
const int dlyXLong = 1000;
//Includes
#include "Arduino.h"
#include <SPI.h>
#include <RF24.h>
#include <avr/wdt.h>
//Decalre Pins
const int led1 = 7;
const int led2 = 6;
const int led3 = 5;
const int led4 = 4;
const int led5 = 3;
const int ledCxn = A0;
//Storage
int data;
int dataOld = 9001;
int ackData;
int ackDataOld = 9001;
bool TxFlag = true;
int errorCount = 0;
bool rfCxn = false;
//Timing
unsigned long KaTimer = 0;
//Radio Stuff
RF24 radio(9, 10);
byte addresses[][6] = {"1Node","2Node"};
void setup()
{
//Pin Modes
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(ledCxn, OUTPUT);
//Set Initial LED States
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(ledCxn, LOW);
//Start Serial
Serial.begin(baud);
// Initiate the radio object
radio.begin();
// Set the transmit power to lowest available to prevent power supply related issues
radio.setPALevel(RF24_PA_HIGH);
// Set the speed of the transmission to the quickest available
radio.setDataRate(RF24_2MBPS);
// Use a channel unlikely to be used by Wifi, Microwave ovens etc
radio.setChannel(rfCH);
// Open a writing and reading pipe on each radio, with opposite addresses
radio.openWritingPipe(addresses[0]);
radio.openReadingPipe(1, addresses[1]);
//Run LED Test on startup?
if (startTest == true)
{ledTest();}
//Start Listening
radio.startListening();
}
void hardReset()
{
Serial.println("");
Serial.println("REBOOTING PLEASE WAIT");
Serial.println("");
wdt_disable();
wdt_enable(WDTO_15MS);
while (1) {}
}
void loop()
{
rxData();
setLEDs();
if (TxFlag == true)
{txData();}
kaTiming();
}
void kaTiming()
{
if (millis() - KaTimer >= KaReset/2)
{
Serial.println("Caution! Halfway to Keepalive Reset!");
}
if (millis() - KaTimer >= KaReset)
{
Serial.println("Keepalive reset activated... Resetting in 3s");
delay(3000);
hardReset();
}
}
void rxData()
{
dataOld = data;
if ( radio.available())
{
while (radio.available())
{
radio.read( &data, sizeof(data));
TxFlag = true;
rfCxn = true;
KaTimer = millis();
}
//Serial Debug
Serial.print("Rx'd: ");
Serial.println(data);
}
}
void txData()
{
//Stop listening so we can talk
radio.stopListening();
ackData = data+1000;
radio.write( &ackData, sizeof(ackData) );
TxFlag = false;
//Serial debug (data + 1000)
Serial.print("TX'd: ");
Serial.println(ackData);
// Now, resume listening so we catch the next packets.
radio.startListening();
}
void setLEDs()
{
//Connection LED
if (rfCxn == true)
{
digitalWrite(ledCxn, HIGH);
}
int keep1 = digitalRead(led1);
int keep2 = digitalRead(led2);
int keep3 = digitalRead(led3);
int keep4 = digitalRead(led4);
int keep5 = digitalRead(led5);
switch (data) {
case 0:
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
break;
case 1:
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, HIGH);
break;
case 2:
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, HIGH);
digitalWrite(led5, LOW);
break;
//Truncated for space, follows binary pattern
case 31:
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
break;
default:
digitalWrite(led1, keep1);
digitalWrite(led2, keep2);
digitalWrite(led3, keep3);
digitalWrite(led4, keep4);
digitalWrite(led5, keep5);
break;
}
};
void errorLoop()
{
Serial.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
Serial.println(" ");
Serial.println("ERROR DETECTED - Resetting soon...");
Serial.println(" ");
Serial.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
bool error = true;
unsigned long resetTimer = millis();
while (error == true)
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
delay(dlyXShort);
digitalWrite(led1, HIGH);
delay(dlyXShort);
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
delay(dlyXShort);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
delay(dlyXShort);
digitalWrite(led3, LOW);
digitalWrite(led4, HIGH);
delay(dlyXShort);
digitalWrite(led4, LOW);
digitalWrite(led5, HIGH);
delay(dlyXShort);
digitalWrite(led5, LOW);
digitalWrite(led4, HIGH);
delay(dlyXShort);
digitalWrite(led4, LOW);
digitalWrite(led3, HIGH);
delay(dlyXShort);
digitalWrite(led3, LOW);
digitalWrite(led2, HIGH);
delay(dlyXShort);
digitalWrite(led2, LOW);
digitalWrite(led1, HIGH);
delay(dlyXShort);
digitalWrite(led1, LOW);
if (millis() - resetTimer > resetDelay)
{
hardReset();
}
}
};
void ledTest()
{
//Truncated for space
};