RFM69_LowPowerLab/Examples/TxPowerTest_Transmitter/TxPowerTest_Transmitter.ino

158 lines
5.3 KiB
Arduino
Raw Normal View History

2021-08-30 21:53:12 +01:00
// TxPowerTest_Transmitter for RFM69 transceiver radios
// This turns on the Transmitter (unmodulated carrier) continuously
// Should be used experimentally to measure power output and current of the transmitter
// Use on a frequency that does not interfere with any other known active frequencies
// Ensure settings match with the Receiver sketch if you use that to measure the RSSI
// Trasmitter is toggled with 't' (or tactile/SPST button that pulls A0 to GND)
// Transmitter power is controlled with +,- in steps, or <,> in dBm
// **********************************************************************************
// Copyright Felix Rusu 2021, http://www.LowPowerLab.com/contact
// **********************************************************************************
#include <RFM69.h> //get it here: https://www.github.com/lowpowerlab/rfm69
#include <RFM69_ATC.h>
2025-02-13 02:20:54 +00:00
#include <RFM69registers.h>
2021-08-30 21:53:12 +01:00
#define NODEID 123 //must be unique for each node on same network (range up to 254, 255 is used for broadcast)
#define NETWORKID 100 //the same on all nodes that talk to each other (range up to 255)
//Match frequency to the hardware version of the radio on your Moteino (uncomment one):
//#define FREQUENCY RF69_433MHZ
#define FREQUENCY RF69_915MHZ
2025-02-13 02:20:54 +00:00
#define FREQUENCY_EXACT 910000000
2021-08-30 21:53:12 +01:00
#define IS_RFM69HW_HCW //uncomment only for RFM69HCW! Leave out if you have RFM69CW!
#define ENABLE_ATC //comment out this line to disable AUTO TRANSMISSION CONTROL
#define ATC_RSSI -90
#define SERIAL_BAUD 500000
#define DEBUG(input) Serial.print(input)
#define DEBUGln(input) Serial.println(input)
#define DEBUGHEX(input, param) Serial.print(input, param)
2025-02-13 02:20:54 +00:00
//assert button (to trigger transmission)
#ifdef RFGATEWAY
#define ASSERT_BTN 44
#else
#define ASSERT_BTN A0
#endif
#define TX_MODE_PACKET 1
#define TX_MODE_PACKET_BURST 2
#define TX_MODE_CONSTANT 3
#define TX_PACKET_PAYLOAD "PACKET WITH SOME DATA"
#define TX_MODE TX_MODE_CONSTANT
2021-08-30 21:53:12 +01:00
#ifdef ENABLE_ATC
RFM69_ATC radio/*(10,11) FOR M0 radio add-on board*/; //#if defined (__AVR_ATmega32U4__) RFM69_ATC radio(8,7);
#else
RFM69 radio; //#if defined (__AVR_ATmega32U4__) RFM69 radio(8,7);
#endif
int MODE;
2025-02-13 02:20:54 +00:00
void printHelp() {
DEBUGln("Use:\nt to toggle transmission on/off");
DEBUGln("+/- to adjust power in _powerLevel steps");
DEBUGln("<,> to adjust power in dBm");
DEBUGln("? to print this command reference\n");
}
2021-08-30 21:53:12 +01:00
void setup() {
Serial.begin(SERIAL_BAUD);
pinMode(LED_BUILTIN, OUTPUT);
2025-02-13 02:20:54 +00:00
pinMode(ASSERT_BTN, INPUT_PULLUP);
2021-08-30 21:53:12 +01:00
DEBUGln("START RFM69_NODE_TX_TEST!");
if (!radio.initialize(FREQUENCY,NODEID,NETWORKID))
DEBUGln("radio.init() FAIL");
else
DEBUGln("radio.init() SUCCESS");
2025-02-13 02:20:54 +00:00
radio.writeReg(REG_FDEVMSB, RF_FDEVMSB_50000);
radio.writeReg(REG_FDEVLSB, RF_FDEVLSB_50000);
2021-08-30 21:53:12 +01:00
#ifdef IS_RFM69HW_HCW
radio.setHighPower(); //only for RFM69HW/HCW!
#endif
#ifdef FREQUENCY_EXACT
radio.setFrequency(FREQUENCY_EXACT); //set frequency to some custom frequency
#endif
#ifdef ENABLE_ATC
radio.enableAutoPower(ATC_RSSI);
#endif
2025-02-13 02:20:54 +00:00
delay(5000);
2021-08-30 21:53:12 +01:00
char buff[50];
2025-02-13 02:20:54 +00:00
sprintf(buff, "\nTransmitting at %lu Hz...", radio.getFrequency());
2021-08-30 21:53:12 +01:00
DEBUGln(buff);
2025-02-13 02:20:54 +00:00
printHelp();
2021-08-30 21:53:12 +01:00
#ifdef ENABLE_ATC
DEBUGln("RFM69_ATC Enabled (Auto Transmission Control)\n");
#endif
MODE = RF69_MODE_SLEEP;
radio.setMode(MODE);
}
int8_t dBm=-18; //start at minimum possible value for W/CW, gets bumped by library to -2 for HW/HCW
void loop() {
if (Serial.available() > 0) {
char input = Serial.read();
if (input == 'r') //d=dump register values
radio.readAllRegsCompact();
if (input == 'R') //d=dump register values
radio.readAllRegs();
if (input=='+') {
radio.setPowerLevel(radio.getPowerLevel()+1);
DEBUG("_powerLevel=");DEBUGln(radio.getPowerLevel());
}
if (input=='-') {
if (radio.getPowerLevel()>0) {
radio.setPowerLevel(radio.getPowerLevel()-1);
}
DEBUG("_powerLevel=");DEBUGln(radio.getPowerLevel());
}
if (input=='<') {
dBm = radio.setPowerDBm(dBm-1);
DEBUG("POWER=");DEBUG(dBm);DEBUG(" (dBm); _powerLevel=");DEBUGln(radio.getPowerLevel());
}
if (input=='>') {
dBm = radio.setPowerDBm(dBm+1);
DEBUG("POWER=");DEBUG(dBm);DEBUG(" (dBm); _powerLevel=");DEBUGln(radio.getPowerLevel());
}
//transmit mode toggle (enables unmodulated carrier at current power level)
if (input=='t') {
if (MODE == RF69_MODE_TX) {
MODE = RF69_MODE_SLEEP;
DEBUG("RADIO_MODE = 0/SLEEP; _powerLevel=");DEBUGln(radio.getPowerLevel());
2025-02-13 02:20:54 +00:00
} else {
2021-08-30 21:53:12 +01:00
MODE = RF69_MODE_TX;
DEBUG("RADIO_MODE = 4/TX; _powerLevel=");DEBUGln(radio.getPowerLevel());
}
}
2025-02-13 02:20:54 +00:00
if (input=='?') printHelp();
2021-08-30 21:53:12 +01:00
}
2025-02-13 02:20:54 +00:00
delay(100);
2021-08-30 21:53:12 +01:00
if (MODE == RF69_MODE_TX) radio.setMode(MODE);
2025-02-13 02:20:54 +00:00
else if (digitalRead(ASSERT_BTN)==LOW) {
if (TX_MODE == TX_MODE_PACKET) {
DEBUGln("Sending 1 PACKET to node 88");
radio.send(88, TX_PACKET_PAYLOAD, strlen(TX_PACKET_PAYLOAD));
} else if (TX_MODE == TX_MODE_PACKET_BURST) {
DEBUGln("Sending RETRY PACKET to node 88");
radio.sendWithRetry(88, TX_PACKET_PAYLOAD, strlen(TX_PACKET_PAYLOAD));
} else if (TX_MODE == TX_MODE_CONSTANT) {
DEBUGln("Modulating constant carrier");
radio.setMode(TX_MODE);
}
}
2021-08-30 21:53:12 +01:00
else radio.setMode(RF69_MODE_SLEEP);
2025-02-13 02:20:54 +00:00
}