Hola, buen día a todos.
Estoy diseñando un proyecto para establecer comunicación entre dos Arduino UNO a través de radiofrecuencia, utilizando el módulo NRF24L01 (Transceptor, con Antena SMA, LNA y PA). Sin embargo el "Emisor" solo envía los datos al "Receptor" al estar activo un sensor (ultrasónico) y presionar el botón Reset de la placa Arduino UNO. ¿Será problema del código o es momento de cambiar las antenas? ¿Qué estoy haciendo mal?
Código Emisor
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <SPI.h>
int trigPin1 = 19;
int echoPin1 = 2;
int trigPin2 = 3;
int echoPin2 = 4;
int trigPin3 = 5;
int echoPin3 = 6;
int trigPin4 = 7;
int echoPin4 = 8;
int msg[1]; // Array a transmitir
RF24 radio(9,10); // Creamos un objeto radio del tipo RF2$
const uint64_t pipe = 0xE8E8F0F0E1LL; // Usamos este canal
void setup(void) {
Serial.begin (9600);
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(trigPin3, OUTPUT);
pinMode(echoPin3, INPUT);
pinMode(trigPin4, OUTPUT);
pinMode(echoPin4, INPUT);
radio.begin();
radio.openWritingPipe(pipe); // Abrir para escribir
}
void secondsensor(){ // This function is for second sensor.
int duration2, distance2;
digitalWrite (trigPin2, HIGH);
delayMicroseconds (10);
digitalWrite (trigPin2, LOW);
duration2 = pulseIn (echoPin2, HIGH);
distance2 = (duration2/2) / 29.1;
Serial.print("2nd Sensor: ");
Serial.print(distance2);
Serial.print("cm ");
if (distance2 < 20) { // Change the number for long or short distances.
msg[0] = 1;
radio.write(msg, 1);
}
else {
msg[0] = 2;
radio.write(msg, 1);
}
}
void fourthsensor(){ // This function is for fourth sensor.
int duration4, distance4;
digitalWrite (trigPin4, HIGH);
delayMicroseconds (10);
digitalWrite (trigPin4, LOW);
duration4 = pulseIn (echoPin4, HIGH);
distance4 = (duration4/2) / 29.1;
Serial.print("4th Sensor: ");
Serial.print(distance4);
Serial.print("cm ");
if (distance4 < 20) { // Change the number for long or short distances.
msg[0] = 3;
radio.write(msg, 1);
}
else {
msg[0] = 4;
radio.write(msg, 1);
}
}
void loop(void) {
{
Serial.println("\n");
int duration1, distance1;
digitalWrite (trigPin1, HIGH);
delayMicroseconds (10);
digitalWrite (trigPin1, LOW);
duration1 = pulseIn (echoPin1, HIGH);
distance1 = (duration1/2) / 29.1;
Serial.print("1st Sensor: ");
Serial.print(distance1);
Serial.print("cm ");
if (distance1 < 30) { // Change the number for long or short distances.
secondsensor();
delay(100);
}
}
{
Serial.println("\n");
int duration3, distance3;
digitalWrite (trigPin3, HIGH);
delayMicroseconds (10);
digitalWrite (trigPin3, LOW);
duration3 = pulseIn (echoPin3, HIGH);
distance3 = (duration3/2) / 29.1;
Serial.print("3rd Sensor: ");
Serial.print(distance3);
Serial.print("cm ");
if (distance3 < 30) { // Change the number for long or short distances.
fourthsensor();
delay(100);
}
}
}
Código Receptor
#include <nRF24L01.h>
#include <RF24.h>
//#include <RF24_config.h>
#include <SPI.h>
#include <Wire.h> // libreria de comunicacion por I2C
#include <LCD.h> // libreria para funciones de LCD
#include <LiquidCrystal_I2C.h> // libreria para LCD por I2C
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7); // DIR, E, RW, RS, D4, D5, D6, D7
int ledPin1 = 3;
int ledPin2 = 4;
int msg[1];
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
void setup(void) {
Serial.begin (9600);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
lcd.setBacklightPin(3,POSITIVE); // puerto P3 de PCF8574 como positivo
lcd.setBacklight(HIGH); // habilita iluminacion posterior de LCD
lcd.begin(16, 2); // 16 columnas por 2 lineas para LCD 1602A
lcd.clear(); // limpia pantalla
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
}
void lcdest1l(){ //Ver "Libre" en lcd
lcd.setCursor(0, 0);
lcd.print("EST1 L");
}
void lcdest1o(){ //Ver "Ocupado" en lcd
lcd.setCursor(0, 0);
lcd.print("EST1 O");
}
void lcdest2l(){ //Ver "Libre" en lcd
lcd.setCursor(0, 1);
lcd.print("EST2 L");
}
void lcdest2o(){ //Ver "Ocupado" en lcd
lcd.setCursor(0, 1);
lcd.print("EST2 O");
}
void loop(void) {
if (radio.available())
{
bool done = false;
while (!done){
done = radio.read(msg, 1);
Serial.println (msg[0]);
if (msg[0] == 1)
{
lcdest1o();
}
if (msg[0] == 2)
{
lcdest1l();
}
if (msg[0] == 3)
{
lcdest2o();
}
if (msg[0] == 4)
{
lcdest2l();
}
if (msg[0] == 1 || msg[0] == 3)
{
digitalWrite (ledPin1, HIGH);
delay (100);
digitalWrite (ledPin2, LOW);
}
else
{
digitalWrite (ledPin2, HIGH);
delay (100);
digitalWrite (ledPin1, LOW);
}
}
}
}
Desde ya, les agradezco su ayuda.