Adafruit Feather M0 Radio with RFM69 Radio Packet

hello friends. I am playing with two of these Adafruit Feather radio packets. I have them up and running and communicating. One is sending a “hello world” sketch and the other is receiving.

I would like to Put a button on the “sender” and an LED on the receiver. When the button is pushed the LED turns on or off. Can someone help me with the following code to make this happen?


Addrdemo_tx
// rf69 demo tx rx.pde
// -*- mode: C++ -*-
// Example sketch showing how to create a simple addressed, reliable
// messaging client with the RH_RF69 class.
// It is designed to work with the other example RadioHead69_AddrDemo_RX.
// Demonstrates the use of AES encryption, setting the frequency and
// modem configuration.
 
#include <SPI.h>
#include <RH_RF69.h>
#include <RHReliableDatagram.h>
 
/************ Radio Setup ***************/
 
// Change to 434.0 or other frequency, must match RX's freq!
#define RF69_FREQ 915.0
 
// Who am i? (server address)
#define MY_ADDRESS   1
 
// Where to send packets to! MY_ADDRESS in client (RX) should match this.
#define DEST_ADDRESS 2
 
// First 3 here are boards w/radio BUILT-IN. Boards using FeatherWing follow.
#if defined (__AVR_ATmega32U4__)  // Feather 32u4 w/Radio
 #define RFM69_CS    8
 #define RFM69_INT   7
 #define RFM69_RST   4
 #define LED        13
 
#elif defined(ADAFRUIT_FEATHER_M0) || defined(ADAFRUIT_FEATHER_M0_EXPRESS) || defined(ARDUINO_SAMD_FEATHER_M0)  // Feather M0 w/Radio
 #define RFM69_CS    8
 #define RFM69_INT   3
 #define RFM69_RST   4
 #define LED        13
 
#elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_RFM)  // Feather RP2040 w/Radio
 #define RFM69_CS   16
 #define RFM69_INT  21
 #define RFM69_RST  17
 #define LED        LED_BUILTIN
 
#elif defined (__AVR_ATmega328P__)  // Feather 328P w/wing
 #define RFM69_CS    4  //
 #define RFM69_INT   3  //
 #define RFM69_RST   2  // "A"
 #define LED        13
 
#elif defined(ESP8266)  // ESP8266 feather w/wing
 #define RFM69_CS    2  // "E"
 #define RFM69_INT  15  // "B"
 #define RFM69_RST  16  // "D"
 #define LED         0
 
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) || defined(ARDUINO_NRF52840_FEATHER) || defined(ARDUINO_NRF52840_FEATHER_SENSE)
 #define RFM69_CS   10  // "B"
 #define RFM69_INT   9  // "A"
 #define RFM69_RST  11  // "C"
 #define LED        13
 
#elif defined(ESP32)  // ESP32 feather w/wing
 #define RFM69_CS   33  // "B"
 #define RFM69_INT  27  // "A"
 #define RFM69_RST  13  // same as LED
 #define LED        13
 
#elif defined(ARDUINO_NRF52832_FEATHER)  // nRF52832 feather w/wing
 #define RFM69_CS   11  // "B"
 #define RFM69_INT  31  // "C"
 #define RFM69_RST   7  // "A"
 #define LED        17
 
#endif
 
/* Teensy 3.x w/wing
#define RFM69_CS     10  // "B"
#define RFM69_INT     4  // "C"
#define RFM69_RST     9  // "A"
#define RFM69_IRQN   digitalPinToInterrupt(RFM69_INT)
*/
 
/* WICED Feather w/wing
#define RFM69_CS     PB4  // "B"
#define RFM69_INT    PA15 // "C"
#define RFM69_RST    PA4  // "A"
#define RFM69_IRQN   RFM69_INT
*/
 
// Singleton instance of the radio driver
RH_RF69 rf69(RFM69_CS, RFM69_INT);
 
// Class to manage message delivery and receipt, using the driver declared above
RHReliableDatagram rf69_manager(rf69, MY_ADDRESS);
 
int16_t packetnum = 0;  // packet counter, we increment per xmission
 
void setup() {
 Serial.begin(115200);
 //while (!Serial) delay(1); // Wait for Serial Console (comment out line if no computer)
 
 pinMode(LED, OUTPUT);
 pinMode(RFM69_RST, OUTPUT);
 digitalWrite(RFM69_RST, LOW);
 
 Serial.println("Feather Addressed RFM69 TX Test!");
 Serial.println();
 
 // manual reset
 digitalWrite(RFM69_RST, HIGH);
 delay(10);
 digitalWrite(RFM69_RST, LOW);
 delay(10);
 
 if (!rf69_manager.init()) {
   Serial.println("RFM69 radio init failed");
   while (1);
 }
 Serial.println("RFM69 radio init OK!");
 // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM (for low power module)
 // No encryption
 if (!rf69.setFrequency(RF69_FREQ)) {
   Serial.println("setFrequency failed");
 }
 
 // If you are using a high power RF69 eg RFM69HW, you *must* set a Tx power with the
 // ishighpowermodule flag set like this:
 rf69.setTxPower(20, true);  // range from 14-20 for power, 2nd arg must be true for 69HCW
 
 // The encryption key has to be the same as the one in the client
 uint8_t key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                   0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
 rf69.setEncryptionKey(key);
 
 Serial.print("RFM69 radio @");  Serial.print((int)RF69_FREQ);  Serial.println(" MHz");
}
 
// Dont put this on the stack:
uint8_t buf[RH_RF69_MAX_MESSAGE_LEN];
uint8_t data[] = "  OK";
 
void loop() {
 delay(1000);  // Wait 1 second between transmits, could also 'sleep' here!
 
 char radiopacket[20] = "Hello World #";
 itoa(packetnum++, radiopacket+13, 10);
 Serial.print("Sending "); Serial.println(radiopacket);
 
 // Send a message to the DESTINATION!
 if (rf69_manager.sendtoWait((uint8_t *)radiopacket, strlen(radiopacket), DEST_ADDRESS)) {
   // Now wait for a reply from the server
   uint8_t len = sizeof(buf);
   uint8_t from;
   if (rf69_manager.recvfromAckTimeout(buf, &len, 2000, &from)) {
     buf[len] = 0; // zero out remaining string
 
     Serial.print("Got reply from #"); Serial.print(from);
     Serial.print(" [RSSI :");
     Serial.print(rf69.lastRssi());
     Serial.print("] : ");
     Serial.println((char*)buf);
     Blink(LED, 40, 3); // blink LED 3 times, 40ms between blinks
   } else {
     Serial.println("No reply, is anyone listening?");
   }
 } else {
   Serial.println("Sending failed (no ack)");
 }
}
 
void Blink(byte pin, byte delay_ms, byte loops) {
 while (loops--) {
   digitalWrite(pin, HIGH);
   delay(delay_ms);
   digitalWrite(pin, LOW);
   delay(delay_ms);
 }
}
 
 
 
Addrdemo_RX
 
// rf69 demo tx rx.pde
// -*- mode: C++ -*-
// Example sketch showing how to create a simple addressed, reliable
// messaging client with the RH_RF69 class.
// It is designed to work with the other example RadioHead69_AddrDemo_TX.
// Demonstrates the use of AES encryption, setting the frequency and
// modem configuration.
 
#include <SPI.h>
#include <RH_RF69.h>
#include <RHReliableDatagram.h>
 
/************ Radio Setup ***************/
 
// Change to 434.0 or other frequency, must match RX's freq!
#define RF69_FREQ 915.0
 
// Who am i? (client address)
#define MY_ADDRESS   2
 
// First 3 here are boards w/radio BUILT-IN. Boards using FeatherWing follow.
#if defined (__AVR_ATmega32U4__)  // Feather 32u4 w/Radio
 #define RFM69_CS    8
 #define RFM69_INT   7
 #define RFM69_RST   4
 #define LED        13
 
#elif defined(ADAFRUIT_FEATHER_M0) || defined(ADAFRUIT_FEATHER_M0_EXPRESS) || defined(ARDUINO_SAMD_FEATHER_M0)  // Feather M0 w/Radio
 #define RFM69_CS    8
 #define RFM69_INT   3
 #define RFM69_RST   4
 #define LED        13
 
#elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_RFM)  // Feather RP2040 w/Radio
 #define RFM69_CS   16
 #define RFM69_INT  21
 #define RFM69_RST  17
 #define LED        LED_BUILTIN
 
#elif defined (__AVR_ATmega328P__)  // Feather 328P w/wing
 #define RFM69_CS    4  //
 #define RFM69_INT   3  //
 #define RFM69_RST   2  // "A"
 #define LED        13
 
#elif defined(ESP8266)  // ESP8266 feather w/wing
 #define RFM69_CS    2  // "E"
 #define RFM69_INT  15  // "B"
 #define RFM69_RST  16  // "D"
 #define LED         0
 
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) || defined(ARDUINO_NRF52840_FEATHER) || defined(ARDUINO_NRF52840_FEATHER_SENSE)
 #define RFM69_CS   10  // "B"
 #define RFM69_INT   9  // "A"
 #define RFM69_RST  11  // "C"
 #define LED        13
 
#elif defined(ESP32)  // ESP32 feather w/wing
 #define RFM69_CS   33  // "B"
 #define RFM69_INT  27  // "A"
 #define RFM69_RST  13  // same as LED
 #define LED        13
 
#elif defined(ARDUINO_NRF52832_FEATHER)  // nRF52832 feather w/wing
 #define RFM69_CS   11  // "B"
 #define RFM69_INT  31  // "C"
 #define RFM69_RST   7  // "A"
 #define LED        17
 
#endif
 
/* Teensy 3.x w/wing
#define RFM69_CS     10  // "B"
#define RFM69_INT     4  // "C"
#define RFM69_RST     9  // "A"
#define RFM69_IRQN   digitalPinToInterrupt(RFM69_INT)
*/
 
/* WICED Feather w/wing
#define RFM69_CS     PB4  // "B"
#define RFM69_INT    PA15 // "C"
#define RFM69_RST    PA4  // "A"
#define RFM69_IRQN   RFM69_INT
*/
 
// Singleton instance of the radio driver
RH_RF69 rf69(RFM69_CS, RFM69_INT);
 
// Class to manage message delivery and receipt, using the driver declared above
RHReliableDatagram rf69_manager(rf69, MY_ADDRESS);
 
void setup() {
 Serial.begin(115200);
 //while (!Serial) delay(1); // Wait for Serial Console (comment out line if no computer)
 
 pinMode(LED, OUTPUT);
 pinMode(RFM69_RST, OUTPUT);
 digitalWrite(RFM69_RST, LOW);
 
 Serial.println("Feather Addressed RFM69 RX Test!");
 Serial.println();
 
 // manual reset
 digitalWrite(RFM69_RST, HIGH);
 delay(10);
 digitalWrite(RFM69_RST, LOW);
 delay(10);
 
 if (!rf69_manager.init()) {
   Serial.println("RFM69 radio init failed");
   while (1);
 }
 Serial.println("RFM69 radio init OK!");
 // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM (for low power module)
 // No encryption
 if (!rf69.setFrequency(RF69_FREQ)) {
   Serial.println("setFrequency failed");
 }
 
 // If you are using a high power RF69 eg RFM69HW, you *must* set a Tx power with the
 // ishighpowermodule flag set like this:
 rf69.setTxPower(20, true);  // range from 14-20 for power, 2nd arg must be true for 69HCW
 
 // The encryption key has to be the same as the one in the server
 uint8_t key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                   0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
 rf69.setEncryptionKey(key);
 
 Serial.print("RFM69 radio @");  Serial.print((int)RF69_FREQ);  Serial.println(" MHz");
}
 
// Dont put this on the stack:
uint8_t data[] = "And hello back to you";
// Dont put this on the stack:
uint8_t buf[RH_RF69_MAX_MESSAGE_LEN];
 
void loop() {
 if (rf69_manager.available()) {
   // Wait for a message addressed to us from the client
   uint8_t len = sizeof(buf);
   uint8_t from;
   if (rf69_manager.recvfromAck(buf, &len, &from)) {
     buf[len] = 0; // zero out remaining string
 
     Serial.print("Got packet from #"); Serial.print(from);
     Serial.print(" [RSSI :");
     Serial.print(rf69.lastRssi());
     Serial.print("] : ");
     Serial.println((char*)buf);
     Blink(LED, 40, 3); // blink LED 3 times, 40ms between blinks
 
     // Send a reply back to the originator client
     if (!rf69_manager.sendtoWait(data, sizeof(data), from))
       Serial.println("Sending failed (no ack)");
   }
 }
}
 
void Blink(byte pin, byte delay_ms, byte loops) {
 while (loops--) {
   digitalWrite(pin, HIGH);
   delay(delay_ms);
   digitalWrite(pin, LOW);
   delay(delay_ms);
 }
}

you require two versions of your original code
transmitter - connect a button to a GPIO line and use digitalRead() to read its value - on a button press transmit a ON message

char radiopacket[20] = "ON";

receiver: connect an LED to a GPIO line - if you receive a message and if it is "ON" switch on LED

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.