receptor code:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
#define CE_PIN 9
#define CSN_PIN 53
DHT dht(DHTPIN, DHTTYPE);
const byte thisSlaveAddress[5] = {'R','x','A','A','A'};
RF24 radio(CE_PIN, CSN_PIN);
float dataReceived[6]; // this must match dataToSend in the TX
float ackData[3]; // the two values to be sent to the master
bool newData = false;
const byte controllerFA = 10;
const byte controllerRA = 11;
const byte controllerFB = 12; //PWM FORWARD PIN for OSMC Controller B (right motor)
const byte controllerRB = 13; //PWM REVERSE PIN for OSMC Controller B (right motor)
int analogTmp = 0; //temporary variable to store
int throttle, direction = 0;
int leftMotor,leftMotorScaled = 0; //left Motor helper variables
float leftMotorScale = 0;
int rightMotor,rightMotorScaled = 0; //right Motor helper variables
float rightMotorScale = 0;
float maxMotorScale = 0; //holds the mixed output scaling factor
int deadZone = 10; //jostick dead zone
//VNH1 RIGHT
const int inaPin = 21;
const int inbPin = 23;
const int diagaPin = 25;
const int diagbPin = 27;
//VNH2 RIGHT
const int inaPin1 = 30;
const int inbPin1 = 32;
const int diagaPin1 = 34;
const int diagbPin1 = 36;
//VNH3 RIGHT
const int inaPin2 = 38;
const int inbPin2 = 40;
const int diagaPin2 = 42;
const int diagbPin2 = 44;
//VNH4 RIGHT
const int inaPin3 = 45;
const int inbPin3 = 46;
const int diagaPin3 = 47;
const int diagbPin3 = 48;
//=============
int sensor=A0;
const int rly1 = 22,rly2 = 24,rly3 = 26,rly4 = 28;
//==============
void setup() {
Serial.begin(9600);
pinMode(sensor,INPUT);
pinMode(rly1, OUTPUT);
pinMode(rly2, OUTPUT);
pinMode(rly3, OUTPUT);
pinMode(rly4, OUTPUT);
//VNH1
pinMode(inaPin, OUTPUT);
pinMode(inbPin, OUTPUT);
pinMode(diagaPin, INPUT);
pinMode(diagbPin, INPUT);
//VNH2
pinMode(inaPin1, OUTPUT);
pinMode(inbPin1, OUTPUT);
pinMode(diagaPin1, INPUT);
pinMode(diagbPin1, INPUT);
//VNH3
pinMode(inaPin2, OUTPUT);
pinMode(inbPin2, OUTPUT);
pinMode(diagaPin2, INPUT);
pinMode(diagbPin2, INPUT);
//VNH4
pinMode(inaPin3, OUTPUT);
pinMode(inbPin3, OUTPUT);
pinMode(diagaPin3, INPUT);
pinMode(diagbPin3, INPUT);
//PWM OTUPUTS
pinMode(controllerFB, OUTPUT);
pinMode(controllerRB, OUTPUT);
pinMode(controllerFA, OUTPUT);
pinMode(controllerRA, OUTPUT);
Serial.println("SimpleRxAckPayload Starting");
//pinMode(53, OUTPUT);
radio.begin();
dht.begin();
radio.setDataRate( RF24_250KBPS );
radio.openReadingPipe(1, thisSlaveAddress);
radio.enableAckPayload();
radio.writeAckPayload(1, &ackData, sizeof(ackData)); // pre-load data
radio.startListening();
}
//==========
void updateReplyData() {
// ackData[0] -= 1;
// ackData[1] -= 1;
// if (ackData[0] < 100) {
// ackData[0] = 109;
// }
// if (ackData[1] < -4009) {
// ackData[1] = -4000;
// }
radio.writeAckPayload(1, &ackData, sizeof(ackData)); // load the payload for the next time
}
//===============
void getData() {
if ( radio.available() ) {
radio.read( &dataReceived, sizeof(dataReceived) );
updateReplyData();
newData = true;
}
}
//================
void showData() {
if (newData == true) {
Serial.print("Data received ");
Serial.print(" X: ");Serial.print(dataReceived[0]);
Serial.print(" Y: ");Serial.print(dataReceived[1]);
Serial.print(" B1: ");Serial.print(dataReceived[2]);
Serial.print(" B2: ");Serial.print(dataReceived[3]);
Serial.print(" B3: ");Serial.print(dataReceived[4]);
Serial.print(" B4: ");Serial.print(dataReceived[5]);
Serial.println();
Serial.print(" ackPayload sent ");
Serial.print(" Humedad: ");Serial.print(ackData[0]);
Serial.print(" Temperatura: ");Serial.print(ackData[1]);
Serial.print(" Gas: ");Serial.print(ackData[2]);
Serial.println();
newData = false;
}
}
//================
void relay(){
////
if (dataReceived[2] == HIGH) {
digitalWrite(rly1, HIGH);
} else {
digitalWrite(rly1, LOW);
}
////
if (dataReceived[3] == HIGH) {
digitalWrite(rly2, HIGH);
} else {
digitalWrite(rly2, LOW);
}
////
if (dataReceived[4] == HIGH) {
digitalWrite(rly3, HIGH);
} else {
digitalWrite(rly3, LOW);
}
////
if (dataReceived[5] == HIGH) {
digitalWrite(rly4, HIGH);
} else {
digitalWrite(rly4, LOW);
}
}
//=========
void vnh(){
const byte joysticYA = dataReceived[0]; //Analog Jostick Y axis
const byte joysticXA = dataReceived[1]; //Analog Jostick X axis
//aquire the analog input for Y and rescale the 0..1023 range to -255..255 range
analogTmp = analogRead(joysticYA);
throttle = (512-analogTmp)/2;
delay(1000);
//...and the same for X axis
analogTmp = analogRead(joysticXA);
direction = -(512-analogTmp)/2;
//mix throttle and direction
leftMotor = throttle+direction; //
rightMotor = throttle-direction;
//print the initial mix results
Serial.print("LIN:"); Serial.print( leftMotor, DEC);
Serial.print(", RIN:"); Serial.print( rightMotor, DEC);
//calculate the scale of the results in comparision base 8 bit PWM resolution
leftMotorScale = leftMotor/255.0;
leftMotorScale = abs(leftMotorScale);
rightMotorScale = rightMotor/255.0;
rightMotorScale = abs(rightMotorScale);
Serial.print("| LSCALE:"); Serial.print( leftMotorScale,2);
Serial.print(", RSCALE:"); Serial.print( rightMotorScale,2);
//choose the max scale value if it is above 1
maxMotorScale = max(leftMotorScale,rightMotorScale);
maxMotorScale = max(1,maxMotorScale);
//and apply it to the mixed values
leftMotorScaled = constrain(leftMotor/maxMotorScale,-255,255);
rightMotorScaled = constrain(rightMotor/maxMotorScale,-255,255);
Serial.print("| LOUT:"); Serial.print( leftMotorScaled);
Serial.print(", ROUT:"); Serial.print( rightMotorScaled);
Serial.print(" |");
//apply the results to appropriate uC PWM outputs for the LEFT motor:
if(abs(leftMotorScaled)>deadZone)
{
if (leftMotorScaled > 0)
{
Serial.print("F");
Serial.print(abs(leftMotorScaled),DEC);
digitalWrite(inaPin2, HIGH);
digitalWrite(inbPin2, LOW);
digitalWrite(inaPin3, HIGH);
digitalWrite(inbPin3, LOW);
analogWrite(controllerRA,0);
analogWrite(controllerFA,abs(leftMotorScaled));
}
else
{
Serial.print("R");
Serial.print(abs(leftMotorScaled),DEC);
digitalWrite(inaPin2, LOW);
digitalWrite(inbPin2, HIGH);
digitalWrite(inaPin3, LOW);
digitalWrite(inbPin3, HIGH);
analogWrite(controllerFA,0);
analogWrite(controllerRA,abs(leftMotorScaled));
}
}
else
{
Serial.print("IDLE");
analogWrite(controllerFA,0);
analogWrite(controllerRA,0);
}
//apply the results to appropriate uC PWM outputs for the RIGHT motor:
if(abs(rightMotorScaled)>deadZone)
{
if (rightMotorScaled > 0)
{
Serial.print("F");
Serial.print(abs(rightMotorScaled),DEC);
digitalWrite(inaPin, HIGH);
digitalWrite(inbPin, LOW);
digitalWrite(inaPin1, HIGH);
digitalWrite(inbPin1, LOW);
analogWrite(controllerRB,0);
analogWrite(controllerFB,abs(rightMotorScaled));
}
else
{
Serial.print("R");
Serial.print(abs(rightMotorScaled),DEC);
digitalWrite(inaPin, LOW);
digitalWrite(inbPin, HIGH);
digitalWrite(inaPin1, LOW);
digitalWrite(inbPin1, HIGH);
analogWrite(controllerFB,0);
analogWrite(controllerRB,abs(rightMotorScaled));
}
}
else
{
Serial.print("IDLE");
analogWrite(controllerFB,0);
analogWrite(controllerRB,0);
}
Serial.println("");
delay(10);
}
//==========
void loop() {
ackData[0] = dht.readHumidity();
ackData[1] = dht.readTemperature();
ackData[2] = analogRead(sensor);
getData();
vnh();
showData();
relay();
}