#include <SPI.h>
#include <RF24.h>
#define RADIO_CE_PIN 4
#define RADIO_CS_PIN 21
#define TRIG_PIN 5
#define ECHO_PIN 13
#define TX_LED_PIN 2
RF24 radio(RADIO_CE_PIN, RADIO_CS_PIN);
const byte address[6] = "00001";
void setup() {
Serial.begin(115200);
pinMode(TX_LED_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
radio.begin();
radio.setChannel(115);
radio.setPALevel(RF24_PA_HIGH);
radio.setAutoAck(true);
radio.openWritingPipe(address);
radio.openReadingPipe(1, address);
radio.startListening(); // start in receive mode
Serial.println("Ping-pong Ultrasonic <-> LED setup started");
}
long getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void loop() {
checkUltrasonic();
receiveData(); // Check for data after sending
delay(400);
}
void checkUltrasonic() {
long distance = getDistance();
int data = (distance <= 30) ? 1 : 0;
Serial.print("Measured distance: ");
Serial.print(distance);
Serial.println(" cm");
// --- PING: Send ---
radio.stopListening();
bool ok = radio.write(&data, sizeof(data));
Serial.println(ok ? "TX success" : "TX failed");
delay(10);
// --- Immediately go to PONG mode ---
radio.startListening();
}
void receiveData() {
if (radio.available()) {
int receivedData;
radio.read(&receivedData, sizeof(receivedData));
Serial.print("Received: ");
Serial.println(receivedData);
digitalWrite(TX_LED_PIN, receivedData == 1 ? HIGH : LOW);
} else {
Serial.println("No data received (listening)...");
}
}