Hello everybody.
I'm needing a little help with the programming of my project.
The project's goal is to control and monitor two leds sensors using radio frequency. I chose the nRF24L01+ transceiver to be half-duplex.
An Arduino+nRF24(PC) will be connected to the computer, its role is to control the LEDs and receive the value of the sensors connected to the other Arduino+nRF24(HOME).
My first attempt was using the module RF433MHz, and arrived in this programming (working perfectly):
(Arduino+nRF24(HOME))
#include <VirtualWire.h>
#include <Thermistor.h>
Thermistor temp(5);
int LDR = A4;
const int pinQ = 10;
const int pinP[] = {5, 6, 7, 8, 4, 9, 10, 11, 12, 13};
bool pinS[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
char info[30]; //RF
long previousMillis = 0; //time
long interval = 1000; //time
void setup()
{
Serial.begin(9600);
for (int pinOUT=0;pinOUT<pinQ;pinOUT++){pinMode(pinP[pinOUT],OUTPUT);}
pinMode(3,INPUT);
vw_set_rx_pin(3); // Pino de Recepção
vw_setup(2000);
vw_rx_start();
}
void loop()
{
// RF
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
int i; for (i = 0; i < buflen; i++) { info[i]=buf[i]; } // Guarda a Informação Recebida num Array
// LEDs
switch(info[0])
{
case 48: digitalWrite(pinP[0],!digitalRead(pinP[0])); break;
case 49: digitalWrite(pinP[1],!digitalRead(pinP[1])); break;
case 50: digitalWrite(pinP[2],!digitalRead(pinP[2])); break;
case 51: digitalWrite(pinP[3],!digitalRead(pinP[3])); break;
case 52: digitalWrite(pinP[4],!digitalRead(pinP[4])); break;
case 53: digitalWrite(pinP[5],!digitalRead(pinP[5])); break;
case 54: digitalWrite(pinP[6],!digitalRead(pinP[6])); break;
case 55: digitalWrite(pinP[7],!digitalRead(pinP[7])); break;
case 56: digitalWrite(pinP[8],!digitalRead(pinP[8])); break;
case 57: digitalWrite(pinP[9],!digitalRead(pinP[9])); break;
case 97: for (int pinOUT = 0; pinOUT < pinQ; pinOUT++) { digitalWrite(pinP[pinOUT], LOW); }; break;
case 98: for (int pinOUT = 0; pinOUT < pinQ; pinOUT++) { digitalWrite(pinP[pinOUT], HIGH); }; break;
}
Serial.println(String(info)); // Escreve no SerialMonitor a Informação Recebida
memset( &info, 0, sizeof(info) );
}
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
// Luminosidade
int luminosidade = analogRead(LDR);
Serial.print("Luminosidade: ");
Serial.println(luminosidade);
// Temperatura
int temperatura = temp.getTemp();
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println("*C");
}
}
Arduino+nRF24(PC)
#include <VirtualWire.h>
char info[30];
int index = 0;
char inChar;
void setup()
{
Serial.begin(9600);
pinMode(4,OUTPUT);
vw_set_tx_pin(4); // Pino para Transferir
vw_set_ptt_inverted(true);
vw_setup(2000); // Velociade de Transmissão
}
void loop()
{
if (Serial.available() > 0)
{
while (1)
{
inChar = Serial.read(); // Guarda o Primeiro Caracter
info[index] = inChar; // Coloca o Caracter numa Array
index++;
delay(2);
if (Serial.available() <= 0)
{
index = 0;
const char *msg = info;
vw_send((uint8_t *)msg, strlen(msg)); // Envia a Informação
vw_wait_tx();
memset( &info, 0, sizeof(info) );
break;
}
}
}
}
And in the last days I have tried to adapt this code to use nRF24. But got no success.
I've success using this code. But it only shows the sensor value when I send a character.
(Arduino+nRF24(HOME))
#include <SPI.h>
#include "RF24.h"
RF24 radio(9, 10);
const uint64_t pipes[2] = { 0xF0F0F0F000LL, 0xF0F0F0F0FFLL };
//int LDR = A5;
int sensor;
const int pinQ = 9;
const int pinP[] = {2, 3, 4, 5, 6, 7, 8, 14, 15};
bool pinS[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
void setup()
{
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.setChannel(100);
radio.setRetries(15,15);
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1, pipes[1]);
radio.startListening();
for (int pinOUT=0;pinOUT<pinQ;pinOUT++){pinMode(pinP[pinOUT],OUTPUT);}
}
void loop()
{
if(radio.available())
{
char led[32] = "";
radio.read(&led, 32);
switch(led[0])
{
case '0': digitalWrite(pinP[0],!digitalRead(pinP[0])); break;
case '1': digitalWrite(pinP[1],!digitalRead(pinP[1])); break;
case '2': digitalWrite(pinP[2],!digitalRead(pinP[2])); break;
case '3': digitalWrite(pinP[3],!digitalRead(pinP[3])); break;
case '4': digitalWrite(pinP[4],!digitalRead(pinP[4])); break;
case '5': digitalWrite(pinP[5],!digitalRead(pinP[5])); break;
case '6': digitalWrite(pinP[6],!digitalRead(pinP[6])); break;
case '7': digitalWrite(pinP[7],!digitalRead(pinP[7])); break;
case '8': digitalWrite(pinP[8],!digitalRead(pinP[8])); break;
case '9': digitalWrite(pinP[9],!digitalRead(pinP[9])); break;
case 'a': for (int pinOUT = 0; pinOUT < pinQ; pinOUT++) { digitalWrite(pinP[pinOUT], LOW); }; break;
case 'b': for (int pinOUT = 0; pinOUT < pinQ; pinOUT++) { digitalWrite(pinP[pinOUT], HIGH); }; break;
}
radio.stopListening(); sensor = analogRead(A5); radio.write(&sensor, 32); radio.startListening();
}
}
(Arduino+nRF24(PC))
#include <SPI.h>
#include "RF24.h"
RF24 radio(9, 10);
const uint64_t pipes[2] = { 0xF0F0F0F000LL, 0xF0F0F0F0FFLL };
int sensor;
void setup()
{
Serial.begin(9600);
radio.begin();
radio.setDataRate(RF24_250KBPS);
radio.setChannel(100);
radio.setRetries(15,15);
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1, pipes[0]);
radio.startListening();
}
void loop()
{
if(Serial.available())
{
char led[32] = "";
byte i = 0;
while(Serial.available())
{
led[i] = Serial.read();
i++;
delay(2);
}
led[i] = 0;
radio.stopListening();
radio.write(&led, 32);
radio.startListening();
}
if(radio.available())
{ radio.read(&sensor, 32); Serial.print("luminosidade = "); Serial.println(sensor); }
}
But I need to constantly monitor the value of the sensor, and only take a break when I turn on the led, and soon after returning to show value of sensor.
I saw several tutorials, but they all seem complex. My native language is Portuguese, and my english is not the best one. And since there are not many tutorials in Portuguese for this transceiver, I have to resort to tutorials in English. :~
If anyone can help, I will be very grateful.
