Hi there,
I am trying to make a RX, TX code with an Adafruit M0 Feather (has RFM9X built in) using the radiohead library. I am making a test code of sorts to transmit a string that changes from "Button A" to "Button B' every cycle of my loop. In the RX code I made I am trying to read that message and then send back a message depending on which phrase was sent from the TX. Both of my programs compile fine but I am unable to accurately read the phrase (the code always goes to the else statement despite the phrase "Button A" being sent).
I am sure this is a simple fix but I haven't been able to figure it out. Attached are the RX code, TX code, and Serial monitor outputs for RX and TX. Thanks!!
RX Code
// Feather9x_RX
// -*- mode: C++ -*-
// Example sketch showing how to create a simple messaging client (receiver)
// with the RH_RF95 class. RH_RF95 class does not provide for addressing or
// reliability, so you should only use RH_RF95 if you do not need the higher
// level messaging abilities.
// It is designed to work with the other example Feather9x_TX
#include <SPI.h>
#include <RH_RF95.h>
// First 3 here are boards w/radio BUILT-IN. Boards using FeatherWing follow.
#if defined (__AVR_ATmega32U4__) // Feather 32u4 w/Radio
#define RFM95_CS 8
#define RFM95_INT 7
#define RFM95_RST 4
#elif defined(ADAFRUIT_FEATHER_M0) || defined(ADAFRUIT_FEATHER_M0_EXPRESS) || defined(ARDUINO_SAMD_FEATHER_M0) // Feather M0 w/Radio
#define RFM95_CS 8
#define RFM95_INT 3
#define RFM95_RST 4
#elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_RFM) // Feather RP2040 w/Radio
#define RFM95_CS 16
#define RFM95_INT 21
#define RFM95_RST 17
#elif defined (__AVR_ATmega328P__) // Feather 328P w/wing
#define RFM95_CS 4 //
#define RFM95_INT 3 //
#define RFM95_RST 2 // "A"
#elif defined(ESP8266) // ESP8266 feather w/wing
#define RFM95_CS 2 // "E"
#define RFM95_INT 15 // "B"
#define RFM95_RST 16 // "D"
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) || defined(ARDUINO_NRF52840_FEATHER) || defined(ARDUINO_NRF52840_FEATHER_SENSE)
#define RFM95_CS 10 // "B"
#define RFM95_INT 9 // "A"
#define RFM95_RST 11 // "C"
#elif defined(ESP32) // ESP32 feather w/wing
#define RFM95_CS 33 // "B"
#define RFM95_INT 27 // "A"
#define RFM95_RST 13
#elif defined(ARDUINO_NRF52832_FEATHER) // nRF52832 feather w/wing
#define RFM95_CS 11 // "B"
#define RFM95_INT 31 // "C"
#define RFM95_RST 7 // "A"
#endif
/* Some other possible setups include:
// Feather 32u4:
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 7
// Feather M0:
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 3
// Arduino shield:
#define RFM95_CS 10
#define RFM95_RST 9
#define RFM95_INT 7
// Feather 32u4 w/wing:
#define RFM95_RST 11 // "A"
#define RFM95_CS 10 // "B"
#define RFM95_INT 2 // "SDA" (only SDA/SCL/RX/TX have IRQ!)
// Feather m0 w/wing:
#define RFM95_RST 11 // "A"
#define RFM95_CS 10 // "B"
#define RFM95_INT 6 // "D"
*/
// Change to 434.0 or other frequency, must match RX's freq!
#define RF95_FREQ 915.0
// Singleton instance of the radio driver
RH_RF95 rf95(RFM95_CS, RFM95_INT);
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, HIGH);
Serial.begin(115200);
while (!Serial) delay(1);
delay(100);
Serial.println("Feather LoRa RX Test!");
// manual reset
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
while (!rf95.init()) {
Serial.println("LoRa radio init failed");
Serial.println("Uncomment '#define SERIAL_DEBUG' in RH_RF95.cpp for detailed debug info");
while (1);
}
Serial.println("LoRa radio init OK!");
// Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM
if (!rf95.setFrequency(RF95_FREQ)) {
Serial.println("setFrequency failed");
while (1);
}
Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);
// Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on
// The default transmitter power is 13dBm, using PA_BOOST.
// If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then
// you can set transmitter powers from 5 to 23 dBm:
rf95.setTxPower(23, false);
}
void loop() {
if (rf95.available()) {
// Should be a message for us now
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
if (rf95.recv(buf, &len)) {
digitalWrite(LED_BUILTIN, HIGH);
RH_RF95::printBuffer("Received: ", buf, len);
char* phrase = (char*)buf;
Serial.print("Got: ");
Serial.println((char*)buf);
Serial.println(strlen((char*)buf));
Serial.print("RSSI: ");
Serial.println(rf95.lastRssi(), DEC);
Serial.println(phrase);
char data[20] = "Motor is #";
if (phrase=="Button A"){
motorOn();
data[9] = 'H';
Serial.println("Check");
}
else{
motorOff();
data[9] = 'L';
}
// Send a reply
rf95.send((uint8_t*)data, sizeof(data));
rf95.waitPacketSent();
Serial.println("Sent a reply");
digitalWrite(LED_BUILTIN, LOW);
} else {
Serial.println("Receive failed");
}
}
}
void motorOn(){
Serial.println("Turned motor on!");
}
void motorOff(){
Serial.println("Turned motor off!");
}
TX Code
// Feather9x_TX
// -*- mode: C++ -*-
// Example sketch showing how to create a simple messaging client (transmitter)
// with the RH_RF95 class. RH_RF95 class does not provide for addressing or
// reliability, so you should only use RH_RF95 if you do not need the higher
// level messaging abilities.
// It is designed to work with the other example Feather9x_RX
#include <SPI.h>
#include <RH_RF95.h>
// First 3 here are boards w/radio BUILT-IN. Boards using FeatherWing follow.
#if defined (__AVR_ATmega32U4__) // Feather 32u4 w/Radio
#define RFM95_CS 8
#define RFM95_INT 7
#define RFM95_RST 4
#elif defined(ADAFRUIT_FEATHER_M0) || defined(ADAFRUIT_FEATHER_M0_EXPRESS) || defined(ARDUINO_SAMD_FEATHER_M0) // Feather M0 w/Radio
#define RFM95_CS 8
#define RFM95_INT 3
#define RFM95_RST 4
#elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040_RFM) // Feather RP2040 w/Radio
#define RFM95_CS 16
#define RFM95_INT 21
#define RFM95_RST 17
#elif defined (__AVR_ATmega328P__) // Feather 328P w/wing
#define RFM95_CS 4 //
#define RFM95_INT 3 //
#define RFM95_RST 2 // "A"
#elif defined(ESP8266) // ESP8266 feather w/wing
#define RFM95_CS 2 // "E"
#define RFM95_INT 15 // "B"
#define RFM95_RST 16 // "D"
#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) || defined(ARDUINO_NRF52840_FEATHER) || defined(ARDUINO_NRF52840_FEATHER_SENSE)
#define RFM95_CS 10 // "B"
#define RFM95_INT 9 // "A"
#define RFM95_RST 11 // "C"
#elif defined(ESP32) // ESP32 feather w/wing
#define RFM95_CS 33 // "B"
#define RFM95_INT 27 // "A"
#define RFM95_RST 13
#elif defined(ARDUINO_NRF52832_FEATHER) // nRF52832 feather w/wing
#define RFM95_CS 11 // "B"
#define RFM95_INT 31 // "C"
#define RFM95_RST 7 // "A"
#endif
/* Some other possible setups include:
// Feather 32u4:
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 7
// Feather M0:
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 3
// Arduino shield:
#define RFM95_CS 10
#define RFM95_RST 9
#define RFM95_INT 7
// Feather 32u4 w/wing:
#define RFM95_RST 11 // "A"
#define RFM95_CS 10 // "B"
#define RFM95_INT 2 // "SDA" (only SDA/SCL/RX/TX have IRQ!)
// Feather m0 w/wing:
#define RFM95_RST 11 // "A"
#define RFM95_CS 10 // "B"
#define RFM95_INT 6 // "D"
*/
// Change to 434.0 or other frequency, must match RX's freq!
#define RF95_FREQ 915.0
// Singleton instance of the radio driver
RH_RF95 rf95(RFM95_CS, RFM95_INT);
int count=0;
void setup() {
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, HIGH);
Serial.begin(115200);
while (!Serial) delay(1);
delay(100);
Serial.println("Feather LoRa TX Test!");
// manual reset
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
while (!rf95.init()) {
Serial.println("LoRa radio init failed");
Serial.println("Uncomment '#define SERIAL_DEBUG' in RH_RF95.cpp for detailed debug info");
while (1);
}
Serial.println("LoRa radio init OK!");
// Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM
if (!rf95.setFrequency(RF95_FREQ)) {
Serial.println("setFrequency failed");
while (1);
}
Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);
// Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on
// The default transmitter power is 13dBm, using PA_BOOST.
// If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then
// you can set transmitter powers from 5 to 23 dBm:
rf95.setTxPower(23, false);
}
int16_t packetnum = 0; // packet counter, we increment per xmission
void loop() {
delay(1000); // Wait 1 second between transmits, could also 'sleep' here!
Serial.println("Transmitting..."); // Send a message to rf95_server
char radiopacket[9] = "Button #";
if (count%2==0){
radiopacket[7] = 'A';
}
else{
radiopacket[7] = 'B';
}
radiopacket[8] = 0;
count++;
Serial.print("Sending "); Serial.println(radiopacket);
Serial.println("Sending...");
delay(10);
rf95.send((uint8_t *)radiopacket, strlen(radiopacket));
Serial.println("Waiting for packet to complete...");
delay(10);
rf95.waitPacketSent();
// Now wait for a reply
uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
Serial.println("Waiting for reply...");
if (rf95.waitAvailableTimeout(1000)) {
// Should be a reply message for us now
if (rf95.recv(buf, &len)) {
Serial.print("Got reply: ");
Serial.println((char*)buf);
Serial.print("RSSI: ");
Serial.println(rf95.lastRssi(), DEC);
} else {
Serial.println("Receive failed");
}
} else {
Serial.println("No reply, is there a listener around?");
}
}
RX Serial Output
TX Serial Output