SLAVE RX1
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
const int pinCE = 9;
const int pinCSN = 10;
const int p1Pin = A3;
const int p2Pin = A4;
int sendState = 1;
bool recvState = true;
float p1Value = 5.89;
float p1Update = 22.22;
float incomingArray[32];
float p1Request = 12.34;
float p2Value = 5.89;
unsigned long retryRefreshMarker = 0;
unsigned long respondDelay = 0;
unsigned long pRefreshMarker = 0;
int buf[10], temp;
int buf2[10], temp2;
unsigned long int p1avgValue;
unsigned long int p2avgValue;
RF24 wirelessSPI(pinCE, pinCSN);
const uint64_t pAddress = 0xB00B1E5000F0;
void setup() {
Serial.begin(57600);
Serial.println("BOOTING");
Serial.println("REV 1.0.6");
wirelessSPI.begin();
wirelessSPI.setDataRate(RF24_250KBPS);
wirelessSPI.setPALevel(RF24_PA_LOW);
wirelessSPI.setAutoAck(1);
wirelessSPI.setCRCLength(8);
wirelessSPI.enableAckPayload();
// wirelessSPI.setChannel(35);
wirelessSPI.setRetries(10, 10);
wirelessSPI.openReadingPipe(1, pAddress);
// wirelessSPI.openWritingPipe(pAddress);
wirelessSPI.startListening();
}
void loop() {
if (recvState){
readResponse();
}
if (sendState == 1) {
recvState = false;
if (millis() - respondDelay > 320) {
sendData();
sendState = 0;
recvState = true;
respondDelay = millis();
}
}
if (millis() - pRefreshMarker > 800) {
for (int i = 0; i < 10; i++) {
buf[i] = analogRead(p1Pin);
}
for (int i = 0; i < 10; i++) {
buf2[i] = analogRead(p2Pin);
}
p1avgValue = 0;
for (int i = 2; i < 8; i++)
p1avgValue += buf[i];
float pVol = (float)p1avgValue * 5.0 / 1024 / 6;
p1Value = -5.7 * pVol + 24.4;
p2avgValue = 0;
for (int i = 2; i < 8; i++)
p2avgValue += buf2[i];
float pVol2 = (float)p2avgValue * 5.0 / 1024 / 6;
p2Value = -5.7 * pVol2 + 24.4;
pRefreshMarker = millis();
}
}
void sendData() {
// Serial.println("sending ata");
wirelessSPI.stopListening();
wirelessSPI.openWritingPipe(pAddress);
float Array[3] = {p1Update, p1Value, p2Value};
if (!wirelessSPI.write( &Array, sizeof(Array))) {
// Serial.println("send failed");
}
else {
// Serial.println("Send okayY");
}
}
void readResponse() {
wirelessSPI.startListening();
while (wirelessSPI.available()) {
wirelessSPI.read( &incomingArray, sizeof(incomingArray) );
//Serial.println("sending try");
float incomingResponse = float(incomingArray[0]);
if (incomingResponse == p1Request) {
sendState = 1;
wirelessSPI.flush_rx();
wirelessSPI.flush_tx();
}
}
}
SLAVE RX2
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <EEPROM.h>
int sendState = 0;
const int pinCE = 9;
const int pinCSN = 10;
const int Pump1 = 4;
const int Pump2 = 5;
float commandValue = 0.0;
float incomingCommand = 0.0;
float incomingArray[32];
float Request = 12.34;
float Value1 = 12.21;
float Value2 = 22.22;
float setUpTime1 = 2222.2222;
float setDownTime1 = 2222.3333;
float pIsHigh = 123.123;
float pIsLow = 321.321;
unsigned long OnMarker = 0;
unsigned long UpOnMarker = 0;
unsigned long respondDelay = 0;
unsigned long UpCounter = 0;
unsigned long DownCounter = 0;
unsigned long mark = 0;
int pState = 0;
RF24 wirelessSPI(pinCE, pinCSN);
const uint64_t pAddress = 0xB00B1E5000F1;
const uint32_t keyword = 0xFADEDEAD;
const uint16_t keywordAddress = 0x00;
const uint16_t paramAddress = keywordAddress + sizeof(keyword);
struct __attribute__ ((packed)) _paramS {
unsigned long DownTime1 = 2500;
unsigned long UpTime1 = 2500;
} dParams;
void setup() {
getParam();
Serial.begin(57600);
wirelessSPI.begin();
wirelessSPI.setDataRate(RF24_250KBPS);
wirelessSPI.setAutoAck(1);
wirelessSPI.enableAckPayload();
wirelessSPI.setRetries(15, 15);
wirelessSPI.setPALevel(RF24_PA_HIGH);
wirelessSPI.openReadingPipe(1, pAddress);
wirelessSPI.openWritingPipe(pAddress);
wirelessSPI.startListening();
Serial.println("hello");
pinMode(Pump1, OUTPUT);
pinMode(Pump2, OUTPUT);
}
void loop() {
readResponse();
if (sendState == 1) {
if (millis() - respondDelay > 100) {
sendStatus();
sendState = 0;
respondDelay = millis();
}
}
//////
if (pState == 1) {
digitalWrite(Pump2, HIGH);
if (millis() - OnMarker > dParams.DownTime1) {
digitalWrite(Pump2, LOW);
pState = 0;
}
}
if (pState == 2) {
digitalWrite(Pump1, HIGH);
if (millis() - UpOnMarker > dParams.UpTime1) {
digitalWrite(Pump1, LOW);
pState = 0;
}
}
}
void readResponse() {
wirelessSPI.startListening();
while (wirelessSPI.available()) {
wirelessSPI.read( &incomingArray, sizeof(incomingArray) );
incomingCommand = float(incomingArray[0]);
if (incomingCommand == Request) {
commandValue = float(incomingArray[1]);
respondDelay = millis();
sendState = 1;
}
if (incomingCommand == pIsHigh) {//////////////
Serial.print("Got Status High ");
OnMarker = millis();
pState = 1;
DownCounter ++;
}
if (incomingCommand == pIsLow) {
Serial.print("Got Status Low ");
UpOnMarker = millis();
pState = 2;
UpCounter ++;
}
if (incomingCommand == setDownTime1) {
for (byte y = 1; y < 2; y++) {
unsigned long commandValue = float(incomingArray[y]);
dParams.DownTime1 = commandValue;
}
}
}
// wirelessSPI.flush_rx();
}
void sendStatus() {
wirelessSPI.stopListening();
wirelessSPI.openReadingPipe(1, pAddress);
float Array[3] = {Value1, UpCounter, DownCounter};
if (!wirelessSPI.write( &Array, sizeof(Array))) {
// Serial.println("delivery failed");
// wirelessSPI.flush_tx();
}
else {
// Serial.println("Send successful.");
// wirelessSPI.flush_tx();
}
}
void saveParam()
{
EEPROM.put(keywordAddress, keyword);
EEPROM.put(paramAddress, dParams);
}
void getParam()
{
uint32_t tmpKey;
EEPROM.get(keywordAddress, tmpKey);
if (tmpKey == keyword) {
EEPROM.get(paramAddress, dParams); // EEPROM was already initialized OK to read
} else {
saveParam();
}
}