RFM69HCW Library for Proteus V1.1: two Arduino UNOs with green RFM69HCW modules, the RFM69HCW Advance pop-up with its Radio page and the TEP Serial Monitor in its Simple interface

RFM69HCW Library for Proteus V1.1 (433 MHz FSK + Arduino)

2.5K Views
40
700
60
25
60
PCBWay

Hello friends, I hope you all are doing great. Today, I am going to share the new RFM69HCW Library for Proteus V1.1. The RFM69HCW is HopeRF's small square sub-1 GHz radio, a favourite for wireless sensor networks because every message can be confirmed with an ACK. With this RFM69HCW Library for Proteus, two modules in one design talk over a simulated 433 MHz air, and your Arduino drives them over SPI with the same LowPowerLab RFM69 library you use on real hardware.

Version 1.1 replaces the first version of this post. You now get two devices: RFM69HCW Simple, with its control panel on the schematic, and RFM69HCW Advance, with a pop-up window and four measured RF test tools. The new RFM69 Arduino Proteus demo has two Arduino UNOs, a node and a gateway, that ACK every message, PING each other and turn their transmit power down with RFM69_ATC, shown in the compact Simple interface of our TEP Serial Monitor. Have you read version 1.0? Then jump to "What's New" below.

NOTICE: This library is very special to our team. Our RFM69HCW model has the chip's registers, modes, FIFO, packet engine and AES, carries the ACKs of the LowPowerLab protocol and works out the signal level at every distance. It took our team a lot of hard work, many test runs and many design changes. Your feedback is the fuel that keeps us going, so please tell us what you think in the comments below or in the RFM69HCW Library board of our forum. And if our free libraries help you, you can buy us a coffee. So, let's get started with the RFM69HCW Library for Proteus:

RFM69HCW Library for Proteus V1.1: two Arduino UNOs with green RFM69HCW modules, the RFM69HCW Advance pop-up with its Radio page and the TEP Serial Monitor in its Simple interface
Figure: The RFM69HCW demo in Proteus 8.5: NODE 2 (Simple) sends with ATC, the GATEWAY, NODE 1 (Advance), ACKs every message at -80 dBm; its Radio page and Serial Monitor U4 in the Simple interface.

What is the RFM69HCW RF Module?

The RFM69HCW is a radio transceiver module (it sends and receives) made by HopeRF around the Semtech SX1231H chip, for the licence-free bands below 1 GHz. It is sold in 315, 433, 868 and 915 MHz versions, and the H in HCW marks the high-power version: up to +20 dBm (100 mW). The Arduino talks to the chip over SPI, a 4-wire bus (clock, data in, data out and chip select), and the DIO0 pin tells it when a packet has arrived.

The module itself is a small square green board, 16 x 16 mm, with 8 castellated pads on each side. Most makers solder a straight wire to its ANT pad as the antenna and use the free LowPowerLab RFM69 Arduino library by Felix Rusu, which adds node IDs, ACKs, retries and automatic power control on top of the chip. That is exactly what our demo does.

The RFM69HCW at a Glance

RFM69HCW in numbers
FeatureValue
ChipSemtech SX1231H (printed RF69) with a 32 MHz crystal
Frequency bandsModules for 315, 433, 868 or 915 MHz; each module is matched for ONE band
ModulationFSK, GFSK, MSK, GMSK and OOK; the LowPowerLab library uses FSK
Bit rateUp to 300 kbps; the library's default is 55.6 kbps
TX powerUp to +20 dBm (100 mW); the library's power levels 0 - 23 give -2 to +20 dBm
Sensitivity (our model, FSK)-118 dBm at 1.2 kbps, -114 at 4.8, -105 at 38.4, -103 at 55.6 and -97 dBm at 250 kbps; OOK 2 dB worse
Packet enginePreamble, sync word, length, address, CRC, AES-128 encryption and a 66-byte FIFO
Supply1.8 - 3.6 V; the pins are NOT 5 V tolerant; about 130 mA while sending at +20 dBm
InterfaceSPI, DIO0 (packet received / sent) and an active-HIGH RESET pin

RFM69HCW, CC1101, nRF24L01, HC-12 or LoRa: Which Library Do You Need?

Our RF libraries for Proteus
Your moduleWhat it doesOur library
RFM69HCW (square green HopeRF module, wire antenna)315 / 433 / 868 / 915 MHz FSK with ACKs and auto power, SPIThis article
CC1101 (green D-SUN board, spring antenna)315 / 433 / 868 / 915 MHz, packets and OOK remote codes, SPICC1101 Library for Proteus
nRF24L01 (PCB antenna)2.4 GHz, SPI, short rangenRF24L01 Library for Proteus
nRF24L01+PA+LNA (SMA antenna)2.4 GHz with a power amplifier and an LNA, longer rangenRF24L01+PA+LNA Library for Proteus
HC-12433 MHz wireless serial module (UART)HC-12 Library for Proteus
SX1278 / Ra-02433 MHz LoRa, long range at low data rates, SPISX1278 LoRa Library for Proteus
RFM95WHopeRF 868 / 915 MHz LoRa (SX1276), SPIRFM95W LoRa Library for Proteus
SX1262Semtech LoRa, 150 - 960 MHz, up to +22 dBm, SPISX1262 LoRa Library for Proteus

All of them are compared in our RF Module Libraries for Proteus roundup.

Radio Terms You Will See in This Article

Radio terms
TermMeaning
Sub-1 GHzThe licence-free bands below 1 GHz (315, 433, 868, 915 MHz); which ones you may use depends on your country
FSKFrequency shift keying: a 1 is sent a little above the carrier, a 0 a little below it (the deviation, 50 kHz in the demo)
kbpsThousands of bits per second on the air
dBmPower compared to 1 mW: 0 dBm = 1 mW, +20 dBm = 100 mW, and every 10 dB is a factor of 10
SensitivityThe weakest signal the receiver can still decode at its bit rate
RSSIReceived Signal Strength Indicator: the level of the last packet in dBm
ACKAcknowledgement: a short packet that answers "got it"
sendWithRetry()The library's send with ACK: it waits 30 ms for the ACK and tries up to 3 times
ATCAutomatic Transmission Control (RFM69_ATC): the node turns its power down until the gateway hears a target RSSI
Node ID, network IDThe address of one radio (gateway 1, node 2 in the demo), and the number shared by all radios of one network (100)
Sync wordA 2-byte pattern after the preamble that marks the start of a packet; LowPowerLab puts the network ID in it
AES-128Encryption with a 16-character key; both radios need the same key
CRCA check value at the end of the packet that reveals damaged packets
PA_BOOSTThe output of the high-power amplifiers PA1 and PA2, up to +20 dBm; the only one wired on the RFM69HCW
Duty cycleThe share of time a transmitter is on the air; Europe limits it to 10 % or 1 % in some bands

How Two RFM69HCW Radios Talk: Packets, ACKs and ATC

In the demo, node 2 sends a message to the gateway, node 1, every 2 s. One message, step by step:

  1. sendWithRetry() writes the length, the target (1), the sender (2), a control byte ("ACK requested") and the text into the 66-byte FIFO and starts TX.
  2. The chip sends 3 bytes of preamble, the sync word 2D 64 (64 hex = network 100), the length, the header, the text and a 2-byte CRC; at 55.6 kbps, a bit takes 18 us.
  3. The gateway's chip checks the CRC and raises DIO0; the interrupt on D2 tells the library.
  4. The gateway's sketch sees receiveDone() and calls sendACK() at once.
  5. The node waits up to 30 ms for that ACK, sends the packet again if none comes (3 tries in all), and sendWithRetry() returns true or false.

That ACK is the big difference to a CC1101, which never answers: an RFM69 sender always knows whether its message arrived.

FSK and the Bit Rate

With FSK, the carrier moves 50 kHz up for a 1 and 50 kHz down for a 0. The bit rate comes from the 32 MHz crystal: LowPowerLab writes 576, so 32,000,000 / 576 = 55,556 bits per second, shown as 55.6 kbps.

Bit Rate and Range: Why 4.8 kbps Reaches Further

The level at the receiver is the TX power minus the path loss. While it stays above the receiver's sensitivity, the link works. Our model uses free-space loss up to 1 m and a path-loss exponent of 3 beyond it: at 433 MHz, 85 dB at 100 m and 124 dB at 2 km (6 dB more at 868 MHz). With the demo's +20 dBm:

  • 100 m: +20 - 85 = -65 dBm. 55.6 kbps needs -103 dBm: OK with a margin of +38.2 dB.
  • 2 km: +20 - 124 = -104 dBm: just too weak at 55.6 kbps, but OK at 4.8 kbps, which needs -114 dBm.

A slower bit carries more energy, and the receiver can use a narrower filter that lets in less noise. The price is time: a frame with 32 data bytes takes 6.19 ms at 55.6 kbps, but 71.7 ms at 4.8 kbps. With +20 dBm, 55.6 kbps reaches about 1.9 km, 4.8 kbps about 4.2 km.

ACKs, Retries and RSSI

The sender waits only 30 ms, so the demo's gateway calls sendACK() first and prints afterwards: a line of 40 characters takes about 40 ms at 9600 baud. The gateway prints the RSSI of each message, the node the RSSI of its ACK. A signal less than 1.5 dB above the sensitivity arrives with a CRC error, and the library drops it.

ATC: Automatic Transmission Control

Full power is often far more than a link needs. With RFM69_ATC and enableAutoPower(-80), every message asks the gateway to put the RSSI it measured into the ACK. Heard stronger than -80 dBm, the node turns its power one step down; weaker, one step up; after a try without an ACK, one step up, too. The node ends up with just enough power: less battery current, less interference and, in Europe, a power closer to the legal limit.

Network ID, Node IDs and the AES Key

A receiver accepts only packets with its own sync word, and LowPowerLab's is 2D plus the network ID, so network 100 never even hears network 101. The library keeps only packets addressed to its node ID. With encrypt() and a 16-character key, the chip encrypts every packet with AES-128; another key gives only garbage. So type RATE, FREQ, NET and KEY on both monitors: frequency, bit rate (within 10 %), network ID and key must match.

PA_BOOST and setHighPower()

The SX1231H has three power amplifiers, but on the RFM69HCW only PA1 and PA2 reach the antenna. So an HCW sketch must call radio.setHighPower() after initialize(); without it, the module sends almost nothing, and our Simulation Log says so. The library's power levels 0 - 15 use PA1 alone (-2 to +13 dBm), 16 - 19 PA1 + PA2 (+12 to +15 dBm), and 20 - 23 add the +20 dBm registers (+17 to +20 dBm), which are on only while the radio sends.

What's New in RFM69HCW Library for Proteus V1.1

If you used version 1.0, here is what has changed:

  • Two devices in TEPRFM69.LIB: RFM69HCW Simple (RFM69TEP, the v1.0 device, so old designs keep working) and RFM69HCW Advance (RFM69ADVTEP) with a pop-up window.
  • A redrawn board: the square green HopeRF module with a yellow wire antenna instead of v1.0's wide navy board. The 8 Proteus pins stay where they were, so v1.0 wiring fits.
  • A live antenna and three LEDs: wire, ANT pad and RF trace glow orange while sending and green while receiving. PWR, TX and RX are a TEP addition: the real module has no LEDs.
  • Close and reopen: a red X and a PANEL button on the Simple, OPEN PANEL on the Advance.
  • Four measured test tools (Advance): Link test, Throughput, Scan and Registers.
  • Model: every message is recorded with its tries, ACK and TX power, the Simulation Log explains mismatches, and an unpowered RFM69 can no longer stall the simulation. DISTANCE and the link budget are unchanged.
  • A two-UNO demo with the TEP Serial Monitor instead of Virtual Terminals: every v1.0 output line, plus RFM69_ATC, commands and a link line every 10 s.
  • Lighter package: about 1.5 MB, without the C++ source code (v1.0: about 7.4 MB).

A v1.0 design keeps its old symbol: new model and DISTANCE buttons, but no new board, LEDs or red X. Here its panel still shows the chip's reset values:

A v1.0 RFM69HCW design after the update to v1.1: the old wide navy board with a small green module and the v1.0 RFM69HCW CONTROLS panel in STANDBY
Figure: A v1.0 design after the update: the old navy board and the v1.0 panel with the chip's reset values; re-pick the part for the new one (PC render).

RFM69HCW Library for Proteus: Simple vs Advance

Both devices run the same model; only the panel differs:

RFM69HCW Simple vs Advance
FeatureSimpleAdvance
Full RFM69HCW model (SPI, registers, modes, FIFO, packet engine, AES, DIO0, RST, timing)✔✔
Square green HopeRF board, glowing wire antenna and PWR / TX / RX LEDs✔✔
DISTANCE buttons 10 m - 10 km and the link-budget verdict✔✔
Control panel on the schematic (state, settings, counters, last packet)✔✘
Pop-up window you can move, resize and minimise✘✔
Radio page: what the sketch set, packet format, ACKs and ATC, traffic, distance✘✔
Link test, Throughput, Scan and Registers✘✔
TEP Dark / Light theme, text size, Help page with Copy diagnostics✘✔
Same device name as v1.0 (old designs keep working)✔✘

Choose Simple to keep the radio's state beside your circuit, and Advance for hard numbers about your link. The demo has one of each, and the two talk to each other.

Download RFM69HCW Library for Proteus

Click the button below to download RFM69HCW-RF-Library-for-Proteus-v1.1.zip (about 1.5 MB, without the C++ source code):

RFM69HCW Library for Proteus V1.1
  • README.txt: a detailed guide to the files, the wiring, the model, the test tools and real hardware.
  • Proteus Library Files: TEPRFM69.LIB (both devices), TEPSERIALMON.LIB and our Arduino UNO library ArduinoV3TEP.LIB / ArduinoV3TEP.IDX.
  • Proteus Model Files: TEPRFM69.DLL and TEPSERIALMON.DLL.
  • Proteus Simulation: RFM69-ArduinoUnoV3.pdsprj, RFM69_Node.hex, RFM69_Gateway.hex and copies of both DLLs.
  • Arduino Code: RFM69_Node.ino, RFM69_Gateway.ino and the LowPowerLab RFM69 library 1.6.0 (Felix Rusu) with RFM69_ATC (Thomas Studwell), unmodified, under the GNU GPL-3.0 with its License.txt.

Because of the GPL-3.0, the README also names the complete corresponding source of the two .hex files: the sketches, this library and the Arduino AVR core 1.8.6. No Proteus yet? Read How to Download and Install Proteus 7 and 8. New to libraries? Follow How to Install a New Library in Proteus.

How to Install RFM69HCW Library for Proteus

  1. Close Proteus and extract the whole zip file.
  2. Copy the four files from Proteus Library Files into the LIBRARY folder, usually C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\LIBRARY (on some PCs C:\ProgramData\Labcenter Electronics\Proteus 8 Professional\LIBRARY).
  3. Copy TEPRFM69.DLL and TEPSERIALMON.DLL into the MODELS folder.
  4. Start Proteus, press P and search for RFM69. You get the Simple and the Advance device (category Peripherals > Wireless).

Updating from v1.0? Replace TEPRFM69.LIB and TEPRFM69.DLL, and delete TEPRFM69.IDX if there is one in LIBRARY. A v1.0 design keeps its v1.0 symbol and runs with the new model; re-pick the part to get the v1.1 board. Tested in Proteus 8.5; Proteus 7 is not supported.

The RFM69HCW Board in Proteus

We designed the module as a clean TEP board shaped like the real HopeRF RFM69HCW: the square green module with its 16 named pads, the black RF69 / SX1231H chip, the 32.000 MHz crystal and a yellow quarter-wave wire antenna on the ANT pad, as on Adafruit's breakout. Below sit the PANEL button, three LEDs, a SIMPLE or ADVANCE badge and the 8 Proteus pins. Here is U1, the Simple device, while it sends:

RFM69HCW Simple board in Proteus sending: orange wire antenna, ANT pad and RF trace, PWR, TX and RX LEDs lit, and the RFM69HCW CONTROLS panel in RX - LISTENING at 100 m
Figure: U1 (Simple) sends: orange wire, pad and trace, waves rippling out, and its panel at 100 m.

The wire, the ANT pad and the RF trace glow orange, and the waves ripple out. All three LEDs are lit: TX for the message, RX for the ACK a few milliseconds later, as each blink is held 0.3 - 0.4 s. On U2, the Advance device, the same parts glow green when a message arrives:

RFM69HCW Advance board in Proteus receiving: green wire antenna and waves, light-green ANT pad and RF trace, PWR, TX and RX LEDs lit, OPEN PANEL button and ADVANCE badge
Figure: U2 (Advance) receives: green wire and waves, light-green pad and trace, OPEN PANEL and the ADVANCE badge.

Pinout

The eight Proteus pins keep the v1.0 order. The real module's pads (ANT GND DIO3 DIO4 3.3V DIO0 DIO1 DIO2 / GND DIO5 RESET NSS SCK MOSI MISO GND) and the breakouts use other orders, so always wire by the names:

RFM69HCW pins in Proteus (VCC GND SCK MISO MOSI NSS RST DIO0)
PinFunctionDemo connection
VCCPower (3.3 V on a real module)Supply terminal
GNDGroundGND
SCKSPI clock from the ArduinoArduino D13
MISOSPI data from the radioArduino D12
MOSISPI data to the radioArduino D11
NSSSPI chip select, active LOWArduino D10
RSTReset, active HIGH: low or open, the radio runsArduino D9 (the sketches pulse it)
DIO0Interrupt output: PayloadReady in RX, TxReady in TXArduino D2 (INT0)

Wire Antenna, LEDs and Waves

Board animations (the same on both devices)
IndicatorWhat it shows
PWR LED (red)Lit while VCC and GND are connected
TX LED (orange)Blinks for every packet sent, ACKs included
RX LED (green)Blinks for every packet received, ACKs included
Wire antenna, ANT pad, RF traceYellow at rest, orange while sending, green while receiving (a bright segment runs up or down the wire)
Waves above the wireRipple out while sending, in while receiving
PANEL / OPEN PANEL, SIMPLE / ADVANCEThe panel button and the device badge

There are no properties to edit: your sketch sets the radio over SPI, as on the real chip, and you choose the DISTANCE on the panel (100 m at every Run).

RFM69HCW Simple: The Control Panel on the Sheet

Beside the Simple board, the RFM69HCW CONTROLS panel shows what the radio is doing, without one debug line in your sketch. The first board picture shows it at the default 100 m:

The RFM69HCW Simple panel
PartWhat it shows
Header, red XRFM69HCW CONTROLS; the X closes the panel
State barRX - LISTENING (green), TX - SENDING (orange), STANDBY, SLEEP or SYNTHESIZER (blue), NO POWER - CHECK VCC / GND, IN RESET - RST PIN HIGH or OUT OF BAND (red)
Settings line 1433.920 MHz FSK 55.6 kbps NETWORK 100: what the sketch wrote
Settings line 2CRC ON AES OFF +5 dBm PA1: the power of the last packet sent and its amplifier (PA1, PA_BOOST, or PA0 - NOT WIRED without setHighPower())
CountersSENT, RECEIVED, TOO WEAK (CRC ERR appears after the first CRC error); an ACK is a packet, too
LAST PACKETIts RSSI, then the LowPowerLab header decoded: sender -> target, the text, ACK or ACK REQ
DISTANCE TO THE OTHER RADIOS10 m, 100 m, 500 m, 1 km, 2 km, 3 km, 5 km, 10 km
VerdictAT 100 m: -80 dBm, 55.6 kbps NEEDS -103 dBm -> OK
HintCLICK A DISTANCE - LOWER kbps REACHES FURTHER

Why the Node Shows +5 dBm and "P"

U1 sends at +5 dBm, not +20: RFM69_ATC has turned it down, so the verdict reads -80 dBm, exactly the target (PA1 alone at this level). The last packet, 1 -> 2: "P" ACK, is the gateway's ACK. An ATC ACK carries one extra byte, the RSSI the gateway measured without its minus sign, and 80 is the letter P in ASCII. The ACK itself arrives at -65 dBm: the gateway always answers with +20 dBm. And RX - LISTENING? The v1.1 node listens between its messages.

DISTANCE: 2 km Is TOO WEAK

Now click 2 km on the panel of U1. The verdict turns to TOO WEAK:

RFM69HCW Simple panel in Proteus with 2 km clicked: AT 2 km: -114 dBm, 55.6 kbps NEEDS -103 dBm, TOO WEAK, at +10 dBm PA1
Figure: 2 km at 55.6 kbps: -114 dBm at +10 dBm, TOO WEAK.

U3 now prints "no ACK", and ATC raises the power one step after every failed try: +10 dBm in my screenshot, the full +20 dBm a few messages later. Even then the gateway gets -104 dBm, and 55.6 kbps needs -103 dBm. U2 counts the lost packets (Too weak 21). The link uses the larger of the two DISTANCE settings, so one click on either panel is enough.

Lower kbps Reaches Further: RATE 4.8 at 2 km

Leave the distance at 2 km and type RATE 4.8 in the send box of BOTH Serial Monitors (one node alone would break the link). The verdict says OK again:

RFM69HCW Simple panel in Proteus at 2 km and 4.8 kbps: AT 2 km: -104 dBm, 4.8 kbps NEEDS -114 dBm, OK, +20 dBm PA_BOOST, last packet RSSI -104 dBm
Figure: RATE 4.8 on both nodes: at 2 km, -104 dBm is enough, because 4.8 kbps needs only -114 dBm.

On U3, the ACKs come back:

RFM69 Arduino Proteus output in the TEP Serial Monitor Simple interface: no ACK at 2 km, RATE 4.8 typed, Bit rate 4.8 kbps, then ACK received at RSSI -104 dBm
Figure: U3: no ACK at 55.6 kbps, then RATE 4.8 and ACKs at -104 dBm.
Sending "Hello #25" ... no ACK
Link (10 s): 5 sent, 2 ACKed, 0 received, power +12 dBm, the gateway hears -80 dBm
Sending "Hello #26" ... no ACK
Sending "Hello #27" ... no ACK
Sending "Hello #28" ... no ACK
Sending "Hello #29" ... no ACK
RATE 4.8
Bit rate 4.8 kbps - set the gateway to the same rate
Sending "Hello #30" ... ACK received, RSSI -104 dBm
Link (10 s): 5 sent, 1 ACKed, 0 received, power +20 dBm, the gateway hears -104 dBm
Sending "Hello #31" ... ACK received, RSSI -104 dBm

I had typed RATE 4.8 on U4 first, so Hello #30 got its ACK at once. The "-80 dBm" in the first link line is the last ACK report from before the move. The power stays at +20 dBm now (-104 dBm is weaker than the target), and the panel's "h" is 104 in ASCII. To go back: 100 m and RATE 55.5 on both monitors (the library's 55.6 kbps).

Closing the Panel

Need room on the sheet? Click the red X. The board button says PANEL: CLOSED with a grey dot, while the radio and the sketch keep running. Click PANEL to bring it back.

RFM69HCW Simple board in Proteus with the control panel closed: PANEL: CLOSED, the red PWR LED lit and the yellow wire antenna between messages
Figure: The panel closed: PANEL: CLOSED, PWR lit, the wire yellow between messages.

RFM69HCW Advance: The Pop-Up Window

The Advance device keeps only the board on the schematic. At Run, the "TEP RFM69HCW Advance" pop-up opens with the look of our Serial Monitor and no Windows title bar: move it by its header, resize or minimise it, and reopen it with OPEN PANEL. The header shows the state (U2 · RX) and the Radio and Test tabs; the blue status bar counts TX, RX and too weak.

The Radio Page

RFM69HCW Advance Radio page in Proteus: RX - LISTENING, 433.920 MHz, +20 dBm PA1 + PA2, 55.6 kbps FSK, network 100 sync 2D 64, 46 ACKs sent back, At 100 m: -65 dBm, needs -103 dBm, OK (+38.2 dB), reach about 1.9 km
Figure: The Radio page of the gateway: 46 messages, 46 ACKs, OK at 100 m (+38.2 dB), reach about 1.9 km.
  • RADIO: what the sketch set: 433.920 MHz, 55.6 kbps FSK, +20 dBm with PA1 + PA2, sensitivity -103 dBm, RX bandwidth 125 kHz.
  • PACKET FORMAT AND SECURITY: network ID 100 (sync 2D 64), CRC on, AES-128 off, "this radio = node 1 · talks to 2".
  • ACKS AND AUTO POWER: 46 ACKs sent back, the last one 1162 us after the request; the ACKs carry the RSSI (ATC).
  • TRAFFIC: 21 too weak and 3 at another bit rate from my 2 km and RATE tests; "Hello #52" at -78 dBm, as ATC turned the node down again after 2 km.
  • DISTANCE: "OK (+38.2 dB)" and my favourite line, "+20 dBm at 55.6 kbps reach about 1.9 km".

The Test Page: Four Measured RFM69HCW Test Tools

Every number on the Test tab is measured on the running model, and each tool ends with a "Good for:" line.

1. Link Test: ACKs, Retries and ATC

Choose 10, 20 or 50 packets and click Run test. The tool records the sketch's real traffic: every message with its tries, ACK and round trip, and every packet heard with its outcome. The DISTANCE buttons sit on the tool. 10 packets on the gateway at 100 m:

RFM69HCW link test in Proteus: 10 of 10 requests answered with an ACK, 0 retries, reply after 1142 us, -80.2 dBm at +5 dBm, and the link budget at 1.2, 4.8, 55.6 and 250 kbps
Figure: Link test at 100 m: 10 / 10 ACKs sent, no retries, -80.2 dBm from a node at +5 dBm (ATC).

U2 answered all 10 messages from U1 without one retry. Each green bar stands at -80.2 dBm, far above the dashed "needs -103 dBm" line, and the blue dots show the sender's power: +5 dBm, where ATC settled. The ACK started 1142 us after a request on average: the time the gateway's UNO needs to read the packet and switch to TX. Below, the link budget at +20 dBm:

Link budget at +20 dBm, 433.92 MHz (from the Link test; the level is the same for every bit rate)
Distance1.2 kbps4.8 kbps55.6 kbps (this radio)250 kbps
10 m-35 dBm, OK +83OK +79OK +68OK +62
100 m-65 dBm, OK +53OK +49OK +38OK +32
500 m-86 dBm, OK +32OK +28OK +17OK +11
1 km-95 dBm, OK +23OK +19OK +8OK +2
2 km-104 dBm, OK +14OK +10TOO WEAKTOO WEAK
3 km-110 dBm, OK +8OK +4TOO WEAKTOO WEAK
5 km-116 dBm, OK +2TOO WEAKTOO WEAKTOO WEAK
10 km-125 dBm, TOO WEAKTOO WEAKTOO WEAKTOO WEAK

At 55.6 kbps the link ends between 1 and 2 km, at 4.8 kbps between 3 and 5 km. Click 2 km during a test, and the bars turn red and the retries appear. Good for: seeing how far your link reaches, how many retries it needs and how ATC sets the power.

2. Throughput: How Many Messages per Second?

This tool does not use your sketch. Two model radios in a private test air send 50 LowPowerLab frames back to back at this radio's distance, frequency and power. You choose the bit rate, the payload (8, 32 or 61 bytes, the library's maximum) and ACK on or off.

RFM69HCW throughput test in Proteus at 55.5k, 32-byte payload, ACK on: 122.3 packets per second, 3.91 kB/s, 8176 us per packet, 50 of 50 delivered and ACKed, and a table of all bit rates with the EU 433 MHz duty cycle
Figure: Throughput at 55.6 kbps, 32 B, ACK on: 122.3 packets/s, 3.91 kB/s, 50 / 50 ACKed.

The 50 frames took 409 ms: 122.3 packets/s, 3.91 kB/s of payload. The bar splits the 8176 us per packet: 200 us to switch to TX, 6192 us for the frame and 1784 us for the ACK. Check the frame yourself: 3 bytes of preamble, 2 of sync word, the length byte, 3 header bytes, 32 data bytes and the CRC make 43 bytes, or 344 bits of 18 us. Without ACKs: 156.4 packets/s. A real UNO adds its SPI time. All bit rates:

All bit rates at a 32-byte payload (100 m apart)
Bit rateWith ACKWithout ACKFrame on airRange hereEU 433 MHz (10 %): at most
1.2 kbps2.8 /s, 89 B/s3.5 /s, 112 B/s286.7 ms5.8 km1256 frames / hour
4.8 kbps11.1 /s, 354 B/s13.9 /s, 445 B/s71.7 ms4.2 km5023 frames / hour
19.2 kbps43.7 /s, 1.4 kB/s55.2 /s, 1.8 kB/s17.9 ms2.7 km20089 frames / hour
55.6 kbps122.3 /s, 3.9 kB/s156.4 /s, 5.0 kB/s6.19 ms1.9 km58140 frames / hour
250.0 kbps469.9 /s, 15.0 kB/s634.5 /s, 20.3 kB/s1.38 ms1.1 km261628 frames / hour

That is the whole trade-off: 1.2 kbps reaches 5.8 km but carries 89 bytes per second, 250 kbps carries 15 kB/s but ends at 1.1 km. The last column: in Europe, a 433 MHz transmitter may be on the air at most 10 % of the time, 360 s per hour, or 1256 frames at 1.2 kbps. The third card measures your sketch: the gateway is on the air 0.09 % of the time. Good for: choosing the bit rate, packet size and ACKs, and checking the 433 MHz 10 % duty cycle.

3. Scan: Which Frequencies Are Busy?

Choose 1, 5 or 10 s. The scan never changes the radio's registers; it lists every packet of the TEP RFM69 radios by sender, frequency, bit rate and network ID, in band views for 315, 433, 868 and 915 MHz. Five seconds at 433 MHz:

RFM69HCW frequency scan in Proteus, 433 MHz band view: one bar at 433.920 MHz from U1, FSK 55.6 k, net 100, 3 packets, strongest -80 dBm, on this frequency
Figure: Scan, 5 s: 3 packets from U1 on 433.920 MHz at -80 dBm, on this radio's frequency.

One bar at 433.920 MHz, on the red line of this radio's frequency: 3 packets from U1, FSK 55.6 k, network 100, at -80 dBm, and "on this frequency" in the list. Senders on other frequencies are listed, too. Good for: finding which frequencies are busy and which radios send on them.

4. Registers: What Did Your Sketch Write?

This tool reads the registers live, as the library's readReg() would, decodes them and lists the Arduino's last SPI commands:

RFM69HCW registers read live in Proteus: BITRATE 02 40 = 55.6 kbps, FRF 6C 7A E1 = 433.920 MHz, SYNCVALUE 2D 64 for network 100, PALEVEL 7F, the last SPI commands and U1 as PARTNER (LISTENING)
Figure: Registers: what the gateway sketch wrote, its last SPI commands, and U1 as PARTNER (LISTENING).
  • FRF 6C 7A E1 = 433.920 MHz: 0x6C7AE1 = 7,109,345 steps of 32 MHz / 524,288 (61 Hz).
  • BITRATE 02 40, FDEV 03 33, RXBW 42: 32 MHz / 576 = 55.6 kbps, deviation 50.0 kHz, RX bandwidth 125 kHz.
  • SYNCVALUE 2D 64, PACKETCONFIG1 90, PACKETCONFIG2 10: network 100, variable length, CRC on, no address filter in the chip (the library checks the node ID), AES off.
  • PALEVEL 7F, OCP 0F, TESTPA1 / 2 55 70: PA1 + PA2, over-current protection off (by setHighPower()), and the +20 dBm registers off while the radio listens.

Read the SPI log from the bottom up, and you watch the gateway go back to listening after an ACK: STANDBY (OPMODE 04), the RSSI (E8, -116 dBm: nothing on the air), DIO0 to PayloadReady, RX (OPMODE 10) and the +20 dBm registers off. At the bottom, U1 is marked PARTNER (LISTENING). Now type NET 101 on U3 only:

RFM69HCW registers in Proteus after NET 101 on the node: U1 433.920 MHz 55.6 kbps NETWORK 101, -74 dBm here, marked OTHER NETWORK ID in red
Figure: NET 101 on U3: the Registers page marks U1 as OTHER NETWORK ID.

U1 now sends the sync word 2D 65, U2's chip ignores it, and the partner line says OTHER NETWORK ID in red. "Last command 4.440 s ago": with nothing to read, the gateway's sketch leaves the SPI bus alone. The -74 dBm? ATC on U1 raised the power after its failed tries. Good for: checking what your sketch really wrote into the RFM69.

Settings and Help

The gear opens Settings: theme (TEP Dark or Light), text size, open the panel at Run, and a button that resets the window size, saved for your Windows user.

Settings page of the RFM69HCW Advance pop-up: theme TEP Dark or Light, text size Small, Normal or Large, open the panel at Run on or off, and reset the window size
Figure: Settings, saved under HKCU\Software\TheEngineeringProjects\TEP RFM69HCW Advance.

The ? icon opens Help & Support: eight cards and Copy diagnostics for a bug report. Report a bug and Suggest a feature open the RFM69HCW board of our forum; Read the article, User guide and Check for updates open this article; the other three open the donate page, our website and the forum. A links.ini next to the DLL can change the links.

Help and Support page of the RFM69HCW Advance: eight cards with their links to the RFM69HCW forum board, this article, the donate page, the website and the forum, and the Copy diagnostics button
Figure: Help & Support: every card shows its link; TEP RFM69HCW Advance v1.1, build 2026-10-07, TEPRFM69.DLL.

RFM69HCW Wireless Link with Arduino in Proteus

Open RFM69-ArduinoUnoV3.pdsprj from the Proteus Simulation folder, with the .hex files and the DLLs beside it. It has two Arduino UNOs from our Arduino Library for Proteus V3.0 (the first image shows the whole circuit):

  • NODE 2 - SENDS, ATC: UNO 1 (ARD1) with RFM69_Node.hex, the RFM69HCW Simple (U1) and Serial Monitor U3.
  • GATEWAY - NODE 1: UNO 2 (ARD2) with RFM69_Gateway.hex, the RFM69HCW Advance (U2) and Serial Monitor U4.

Wiring

Demo wiring (the same on both UNOs, as in the v1.0 demo)
FromToWhy
RFM69 VCC / GNDSupply / groundPower (+5 V in the simulation; a real module needs 3.3 V)
RFM69 SCKArduino D13SPI clock
RFM69 MISOArduino D12Data from the radio
RFM69 MOSIArduino D11Data to the radio
RFM69 NSSArduino D10Chip select
RFM69 DIO0Arduino D2INT0: the library's receive interrupt
RFM69 RSTArduino D9Reset pulse at start-up
Serial Monitor RXD / TXD / GNDArduino D1 / D0 / groundShows what the Arduino prints, sends what you type

D11, D12 and D13 are the UNO's hardware SPI pins, and D2 is INT0 (see our Introduction to Arduino UNO). No wire joins the two nodes: they share one simulated air.

The Arduino Code

Both sketches use the unmodified LowPowerLab RFM69 library with RFM69_ATC, its auto-power version. The node's settings sit at the top:

#define NODEID      2              // unique for each node on the same network
#define GATEWAYID   1
#define NETWORKID   100            // identical on all nodes that talk to each other
#define FREQUENCY   RF69_433MHZ
//#define ENCRYPTKEY  "sampleEncryptKey"   // exactly 16 characters, the same on every node
#define ATC_RSSI    -80            // v1.1: the RSSI the gateway should hear (RFM69_ATC)
#define RFM69_RST   9

RFM69_ATC radio;                   // NSS on D10 (SS), DIO0 on D2 (INT0)

Remove the two slashes before ENCRYPTKEY in both sketches to switch AES on. In setup(), both sketches pulse the active-HIGH RST pin, start the radio and switch the high-power amplifiers on:

  pinMode(RFM69_RST, OUTPUT);      // RST is active HIGH: pulse it for a clean start
  digitalWrite(RFM69_RST, HIGH);
  delay(10);
  digitalWrite(RFM69_RST, LOW);
  delay(10);
  if (!radio.initialize(FREQUENCY, NODEID, NETWORKID)) {
    Serial.println(F("RFM69 not responding - check the SPI wiring, RST and power"));
    while (true) {}
  }
  radio.setHighPower();            // RFM69HCW / RFM69HW only: PA_BOOST, up to +20 dBm
#ifdef ENCRYPTKEY
  radio.encrypt(ENCRYPTKEY);
#endif

The node then switches ATC on with its -80 dBm target:

  radio.enableAutoPower(atcTarget);

Every 2 s, the node sends "Hello #n" with sendWithRetry(). After an ACK, radio.RSSI holds the level of that ACK:

  if (radio.sendWithRetry(GATEWAYID, message, strlen(message))) {
    ++acked; ++linkAcked;
    Serial.print(F("ACK received, RSSI "));
    Serial.print(radio.RSSI);
    Serial.println(F(" dBm"));
    return true;
  }
  ++noAck;
  Serial.println(F("no ACK"));
  return false;

The gateway copies the packet and answers first, then prints (the node has the same function, so the gateway can SEND and PING it, too):

void checkRadio() {
  if (!radio.receiveDone()) return;
  char text[RF69_MAX_DATA_LEN + 1];
  byte length = radio.DATALEN;
  memcpy(text, (const void *)radio.DATA, length);
  text[length] = '\0';
  uint16_t sender = radio.SENDERID;
  int16_t rssi = radio.RSSI;
  bool ack = radio.ACKRequested();
  if (ack) radio.sendACK();      // reply first, print afterwards

To print the power, both sketches turn the library's power level 0 - 23 into dBm, with the three amplifier ranges from above:

int powerDbm() {                   // the RFM69HCW power of a LowPowerLab power level (0 .. 23)
  int level = radio.getPowerLevel();
  return level < 16 ? level - 2 : level < 20 ? level - 4 : level - 3;
}

The library has no bit-rate function, so RATE writes the two bit-rate registers itself (plus a matching RX bandwidth); RATE 55.5 gives back the library's 576 (0x0240):

void setBitRate(float kbps) {      // RegBitrate = 32 MHz / bit rate; RxBw about 2 x the bit rate
  unsigned long reg = (kbps > 55.4 && kbps < 55.7) ? 0x0240 : (unsigned long)(32000.0 / kbps + 0.5);   // 55.5: the library's 55555 bps
  radio.writeReg(REG_BITRATEMSB, reg >> 8);
  radio.writeReg(REG_BITRATELSB, reg & 0xFF);

NET is one call, and KEY checks the length before it calls encrypt():

    radio.setNetwork(id);
    if (strlen(arg) != 16) { Serial.println(F("KEY needs exactly 16 characters or OFF, e.g. KEY sampleEncryptKey")); return; }
    radio.encrypt(arg);

POWER on the node switches ATC off first, then sets a fixed power:

    atcTarget = 0;
    radio.enableAutoPower(0);
    radio.setPowerDBm(dbm);

To change a sketch, install the RFM69_LowPowerLab library (or copy the one from Arduino Code), export the compiled binary and load the new HEX file into its UNO; see How to get the HEX file from Arduino. New to Arduino? Start with our Arduino Tutorial for Beginners.

Serial Monitor Commands

Commands of the demo sketches (monitor quick buttons: PING, STATUS, POWER 20, ATC -80 on U3; PING, STATUS, SEND Hello node 2, HELP on U4)
CommandWhat it does
HELPThe command list
STATUSNode ID, network, frequency, bit rate, power, AES, chip check and counters
SEND <text>A message to the other node now, with ACK (up to 40 characters)
PINGThe ACK round trip to the other node
POWER <dBm>-2 .. 20 dBm (on the node, it switches ATC off)
ATC <dBm|OFF>Node only: automatic power, the RSSI the gateway should hear, e.g. ATC -80
RATE <kbps>1.2 - 300 kbps, e.g. RATE 4.8 (type it on both monitors)
FREQ <MHz>290 - 340, 424 - 510 or 862 - 1020 MHz, e.g. FREQ 434.5 (both monitors)
NET <id>Network ID 0 - 255 (both monitors)
KEY <16 chars|OFF>AES-128, e.g. KEY sampleEncryptKey (both monitors)
AUTO <ON|OFF>Node only: the Hello message every 2 s

How to Run the Demo

  1. Press Run. Both Serial Monitors (9600 baud) and the pop-up of U2 open. Watch the RSSI on U4 fall.
  2. Type PING and STATUS on U3, then POWER 20 and ATC -80.
  3. Type SEND Hello node 2 and PING on U4.
  4. Click 2 km on the panel of U1, then type RATE 4.8 on both monitors. Back: 100 m and RATE 55.5.
  5. Type NET 101 on U3 and look at the Registers tool of U2; NET 100 brings the link back.
  6. Run the four tools on the Test tab of U2.

RFM69HCW Proteus Simulation Results

The Serial Monitor in Its Simple Interface

Both monitors in this demo run in the Simple interface of our TEP Serial Monitor, and every monitor screenshot in this article shows them that way. Only the log, the send box and one slim toolbar row stay visible (baud rate, follow, pause, search and clear). The header, the quick buttons and the status bar are hidden, so the window stays small next to your schematic.

  • Switch to it: right-click the log and choose Simple interface, or press Ctrl+Shift+U.
  • Back to the full view: click the corner button (the expand arrows at the top right), press Esc or Ctrl+Shift+U, or right-click and choose Full interface.
  • Your choice is remembered.

Type commands such as PING, RATE 4.8 or NET 101 in the send box and press Enter; the quick buttons come back with the full view. RXD2, the monitor's second input, is not used: the RFM69 talks SPI and has no serial line to watch. Read all about the monitor in TEP Serial Monitor Advance for Proteus.

Start-Up and ATC: Watch the RSSI Fall

After Run, both monitors print their banners, and a message goes out every 2 s. The first lines of U3 and U4:

TEP RFM69HCW Node Demo v1.1
Node 2, network 100, 433 MHz - sending to the gateway (node 1)
Auto power (RFM69_ATC): the gateway should hear -80 dBm
Type HELP in the Serial Monitor for the commands
Sending "Hello #0" ... ACK received, RSSI -65 dBm
TEP RFM69HCW Gateway Demo v1.1
Gateway (node 1), network 100, 433 MHz - listening
Type HELP in the Serial Monitor for the commands
[2] Hello #0   RSSI -65 dBm   - ACK sent

Hello #0 arrives at -65 dBm, the full +20 dBm at 100 m. Then RFM69_ATC goes to work, and you can watch it on U4:

RFM69HCW gateway output in the TEP Serial Monitor Simple interface: [2] Hello #1 to #11 with the RSSI falling from -66 to -75 dBm while RFM69_ATC turns the node down
Figure: U4: the RSSI falls about 1 dB per message, from -66 dBm (Hello #1) to -75 dBm (Hello #11).
[2] Hello #1   RSSI -66 dBm   - ACK sent
[2] Hello #2   RSSI -67 dBm   - ACK sent
[2] Hello #3   RSSI -68 dBm   - ACK sent
[2] Hello #4   RSSI -70 dBm   - ACK sent
Link (10 s): 5 received, 5 ACKs sent, last RSSI -70 dBm
[2] Hello #5   RSSI -71 dBm   - ACK sent
[2] Hello #6   RSSI -72 dBm   - ACK sent
[2] Hello #7   RSSI -73 dBm   - ACK sent
[2] Hello #8   RSSI -72 dBm   - ACK sent
[2] Hello #9   RSSI -73 dBm   - ACK sent
Link (10 s): 5 received, 5 ACKs sent, last RSSI -73 dBm
[2] Hello #10   RSSI -74 dBm   - ACK sent
[2] Hello #11   RSSI -75 dBm   - ACK sent

Each ACK makes the node take one power step down. Two steps look odd: Hello #4 drops 2 dB, and #8 is 1 dB louder than #7. powerDbm() explains both: from level 20 (+17 dBm) to 19 (+15 dBm) the +20 dBm registers go off, and level 15 (PA1 alone, +13 dBm) is 1 dB stronger than level 16 (PA1 + PA2, +12 dBm). A few messages later, U4 shows -80 dBm for every message (see the first image), and the node settles at +5 dBm.

Typing Commands: PING and STATUS

Now U3, the node. I typed PING, pressed Enter, then STATUS. The lines I typed carry a blue TX tag, the Arduino's lines a green RX tag:

TEP Serial Monitor Simple interface in Proteus: PING typed, PING: ACK from node 1 after 5.8 ms, RSSI -65 dBm, and the STATUS lines of the RFM69HCW node at +7 dBm with ATC target -80 dBm
Figure: U3: the ACK round trip of a PING in 5.8 ms, and the STATUS lines.
Sending "Hello #10" ... ACK received, RSSI -65 dBm
Link (10 s): 5 sent, 5 ACKed, 0 received, power +10 dBm, the gateway hears -74 dBm
Sending "Hello #11" ... ACK received, RSSI -65 dBm
PING
PING: ACK from node 1 after 5.8 ms, RSSI -65 dBm
Sending "Hello #12" ... ACK received, RSSI -65 dBm
STATUS
Status: node 2, network 100, 433.92 MHz, 55.6 kbps, +7 dBm, AES off, radio OK
  sent 14, ACKed 14, no ACK 0, received 0, ATC target -80 dBm, auto-send ON (every 2 s)

The ACK came back after 5.8 ms: the PING frame, the gateway's reply, the ACK frame and the SPI work of the UNOs (our PC test measured 5.1 ms; the difference is the simulated UNO's real SPI time). The link line and STATUS show ATC at work: +10 dBm, then +7 dBm. Every ACK still arrives at -65 dBm: only the node turns its power down.

The Gateway's Side of the PING

On U4, the PING arrives like any message and gets its ACK:

RFM69HCW gateway in the TEP Serial Monitor Simple interface: [2] PING RSSI -76 dBm - ACK sent between Hello #11 and Hello #12
Figure: U4: the PING from node 2 arrives at -76 dBm and gets its ACK.
[2] Hello #11   RSSI -75 dBm   - ACK sent
[2] PING   RSSI -76 dBm   - ACK sent
[2] Hello #12   RSSI -77 dBm   - ACK sent

The gateway can PING, too: in my run, PING on U4 printed "PING: ACK from node 2 after 5.6 ms", and SEND Hello node 2 printed "[1] Hello node 2 RSSI -65 dBm - ACK sent" on U3. POWER 20 on U3 printed "Power +20 dBm (ATC off)", and U4 was back at -65 dBm.

A Network Mismatch: NET 101

Last experiment: type NET 101 on U3 only.

RFM69HCW node in the TEP Serial Monitor Simple interface: power +5 dBm, the gateway hears -80 dBm, then NET 101 typed, Network 101 - set the gateway to the same network ID, then no ACK
Figure: U3: ATC settled at +5 dBm and -80 dBm, then NET 101 and no ACK.
Sending "Hello #75" ... ACK received, RSSI -65 dBm
Link (10 s): 5 sent, 5 ACKed, 0 received, power +5 dBm, the gateway hears -80 dBm
Sending "Hello #76" ... ACK received, RSSI -65 dBm
NET 101
Network 101 - set the gateway to the same network ID
Sending "Hello #77" ... no ACK
Sending "Hello #78" ... no ACK

The link line shows where ATC settled: +5 dBm, and the gateway hears exactly -80 dBm. After NET 101, every message ends with "no ACK": the gateway's chip drops every packet with the wrong sync word. The Registers tool of U2 (above) names the reason. Type NET 100 on U3, and the ACKs are back.

Troubleshooting

  • "RFM69 not responding - check the SPI wiring, RST and power": check SCK D13, MISO D12, MOSI D11, NSS D10, VCC / GND, that RST is low after the reset pulse, and TEPRFM69.DLL in MODELS and beside the project.
  • Sent but never received: did BOTH sketches call setHighPower(), with the same frequency, bit rate, network ID and AES key? The Registers tool and the Simulation Log name what does not match.
  • "no ACK" on the node: the gateway is out of range (lower the bit rate), not listening (its sketch must call receiveDone() often and sendACK() at once), or its ACK is too weak. The Link test says which.
  • Nothing on the gateway: DIO0 must reach D2 (INT0).
  • No monitor or pop-up: a DLL is missing; or click OPEN MONITOR / OPEN PANEL.
  • The old navy board: replace the LIB, delete TEPRFM69.IDX and re-pick the part.
  • Your own sketch: hardware SPI and INT0 on D2 work in Proteus 8.5; only pin-change interrupts never fire there, so SoftwareSerial cannot receive (not needed here).

Things to Know Before Using a Real RFM69HCW

The demo sketches use only the LowPowerLab library, so they run on two real UNOs and modules, too. Keep in mind:

  • 3.3 V only: the supply range is 1.8 - 3.6 V, so feed VCC from 3.3 V, never from 5 V. At +20 dBm the module draws about 130 mA, more than an UNO's 3.3 V pin gives: use a 3.3 V regulator and a 10 uF + 100 nF capacitor near the module. In the simulation, VCC goes to +5 V, because the model only checks that it is powered.
  • Level shifting: the RFM69HCW's pins are NOT 5 V tolerant. On a 5 V Arduino UNO, Nano or Mega, put a level shifter (for example a TXS0108E or 74HC4050, or resistor dividers on SCK, MOSI, NSS and RST) in between; MISO and DIO0 are read fine by a 5 V AVR. 3.3 V boards (ESP32, ESP8266, Moteino) connect directly; Adafruit's breakout has the level shifting on board.
  • Antenna: a module is built for ONE band. The simplest antenna is a quarter-wave wire on the ANT pad: 16.4 cm at 433 MHz, 8.2 cm at 868 MHz and 7.8 cm at 915 MHz, kept straight and away from metal. Never transmit without an antenna at +20 dBm.
  • setHighPower(): call it after initialize() on every RFM69HCW or RFM69HW.
  • Check the pinout: the bare module and the breakouts order their pins differently.
  • Legal bands and duty cycle: use only the frequencies and powers allowed where you live. Europe (ERC/REC 70-03): 433.05 - 434.79 MHz at 10 mW with up to 10 % duty cycle, 868.0 - 868.6 MHz at 25 mW with up to 1 %; USA (FCC part 15): 902 - 928 MHz. The RFM69HCW's +20 dBm (100 mW) is more than the EU limits: turn it down with setPowerDBm() or let RFM69_ATC do it.

Limitations of the Simulation

  • Not modelled: listen and continuous mode, DIO1 - DIO5, packets longer than the FIFO, AFC and the frequency deviation, collisions, random packet loss (a link is OK, at the edge with a CRC error, or too weak), fading, multipath, interference, SPI timing violations and the supply voltage.
  • The range is a teaching model (exponent 3 beyond 1 m); real range depends on your antennas and surroundings.
  • The model is our own implementation, written from Semtech's SX1231H data sheet; it contains no LowPowerLab code.
  • Tested in Proteus 8.5 SP0 on 7 Oct 2026 (the demo, ATC, PING both ways, SEND, POWER, 2 km and RATE 4.8, NET 101, the four tools and every Proteus screenshot here) and with 961 automatic PC checks, all passed, 45 of them with the unmodified LowPowerLab library and 63 with the real v1.1 sketches. The "PC render" was drawn by the model's own code. Proteus 7 is not supported.

For 2.4 GHz, see our nRF24L01 Library for Proteus and nRF24L01+PA+LNA Library for Proteus. For other sub-1 GHz radios, try our CC1101 Library for Proteus, HC-12 Library for Proteus, SX1278 LoRa Library for Proteus, RFM95W LoRa Library for Proteus or SX1262 LoRa Library for Proteus.

So, that was all about the RFM69HCW Library for Proteus V1.1. I hope the DISTANCE buttons, the glowing wire antenna, the four test tools and the ATC experiment make sub-1 GHz radio with ACKs much easier to understand, so your wireless network works the first time you wire two real modules. If you use the RFM69HCW Library for Proteus in a project, please share your feedback in the comments or in our forum, and if you have any questions, ask in the comments and I will help you out. Till the next tutorial, take care and have fun!


Comments

0

Join the conversation