Hello friends, I hope you all are doing great. Today, I am going to share the new HC-12 Library for Proteus V1.1. The HC-12 is a small 433 MHz radio module that works like a wireless serial cable: whatever your Arduino prints into one HC-12 comes out of another HC-12, hundreds of metres away. It is cheap and simple, so students love it for remote controls, weather stations and wireless sensor projects.

In this new version, you get two HC-12 devices in one library: HC-12 Simple with its control panel drawn right on the schematic, and HC-12 Advance with a modern pop-up panel full of test tools. I am also sharing a complete Arduino HC-12 Proteus simulation: two Arduino UNOs chatting over the air, each with our TEP Serial Monitor.

NOTICE: We are really proud of this one. As far as we know, our team is the first to design such libraries for Proteus: a working HC-12 radio with live panels, a link test and a radio scan, right inside the simulation. It took our team a lot of hard work, many test runs and many design changes, and this library is a tribute to that effort. Your feedback is the fuel that keeps us going, so please tell us what you think in the comments below or in the Proteus Libraries category of our forum. And if our free libraries help you in your studies or work, you can buy us a coffee (our donation page is coming soon). So, let's get started with the HC-12 Library for Proteus:

Figure: HC-12 Library for Proteus V1.1 in Proteus 8.5: HC-12 Simple (node 1) and the Advance pop-up (node 2).

What is the HC-12 Wireless Serial Module?

The HC-12 is a 433 MHz wireless serial port module made by HC Information Technology. Inside, a Silicon Labs Si4463 radio chip does the radio work, and an STM8S003F3 microcontroller runs the HC-12 firmware. Your Arduino only sees a UART (the two-wire TX / RX serial port used by Serial), so you don't need to program the radio at all. Main features (HC-12 user manual v2.3A):

HC-12 key specifications
FeatureHC-12 (real module)
Radio chip / MCUSi4463 / STM8S003F3, firmware V2.3
Frequency433.4 - 473.0 MHz, 100 channels, 400 kHz apart
Transmit powerUp to 100 mW (+20 dBm), 8 levels
Sensitivity-117 dBm at 5000 bps air rate
Range (open space)1000 m in FU3, 1800 m in FU4
Supply3.2 - 5.5 V, at least 200 mA
InterfaceUART, factory default 9600 bps 8N1
Link typeTransparent, half duplex

A channel is one radio frequency: CH001 is 433.4 MHz and each channel adds 0.4 MHz. AT+C accepts up to 127, but the range above CH100 is not guaranteed.

Transparent Mode and the SET Pin

The HC-12 has two working states. In transparent mode it simply sends the bytes it gets on RXD over the air. When you pull the SET pin LOW, it enters AT command mode, where it listens to AT commands: short text commands that start with "AT", such as AT+C005 (go to channel 5). The rules from the manual are:

  • SET LOW while running: AT mode after 40 ms; the UART speed stays the same.
  • SET LOW at power-up: AT mode at 9600 8N1, whatever speed is stored.
  • SET HIGH again: the new settings are saved and used after 80 ms.

The Four FU Modes

The FU mode sets the speed on air (the air rate), and so the range. Both modules need the same FU mode, air rate and channel.

HC-12 FU modes
ModeAir rateNotes
FU1250 kbpsAny UART speed, about 15 - 25 ms delay
FU2250 kbpsUART 1200 - 4800 only, one packet per second at most
FU3 (default)Follows the UART speed5000 / 15000 / 58000 / 236000 bps
FU4500 bpsUART 1200 only, 60 bytes per packet, one packet every 2 s

What's New in HC-12 Library for Proteus V1.1

  • Two devices: HC-12 Simple (HC12TEP, On-Sheet Panel) and HC-12 Advance (HC12ADVTEP, Pop-Up Panel with test tools, settings and help). Both use TEPHC12.DLL and talk to each other.
  • Board LEDs: red PWR, blue LINK and a green ring LED round the antenna rod.
  • TEP Serial Monitor in the demo instead of the Proteus Virtual Terminal.
  • Test tools: link test, range sweep and radio scan.
  • Cleaner sketch: it confirms each line with "Sent: ..." or "Command: ...".
  • Lighter package: 1.3 MB, without the C++ source code.

HC-12 Simple vs HC-12 Advance: Which One to Use?

Both are the same HC-12 inside; only the panel differs:

HC-12 Simple vs HC-12 Advance
FeatureHC-12 SimpleHC-12 Advance
Full HC-12 model (AT commands, SET pin, FU modes, link budget)✔✔
PWR, LINK and ring LEDs, animated radio waves✔✔
Control panel drawn on the schematic✔✘
Pop-up window you can move, resize and minimise✘✔
Distance buttons with the predicted level✔✔
Link test with real test packets✘✔
Range sweep and radio scan✘✔
TEP Dark / Light theme and text size✘✔
Help page with Copy diagnostics✘✔
Keeps old v1.0 designs working✔✘

Choose HC-12 Simple for quick projects and report screenshots, and HC-12 Advance for crowded sheets or to find out why a link fails. You can mix them, like our demo does.

Download HC-12 Library for Proteus

Click the button below to download HC-12-RF-Module-Library-for-Proteus-v1.1.zip:

Download HC-12 Library for Proteus V1.1
  • README.txt: a detailed guide to the files.
  • Proteus Library Files: TEPHC12.LIB (both HC-12 devices), TEPSERIALMON.LIB and our Arduino UNO library ArduinoV3TEP.LIB / ArduinoV3TEP.IDX.
  • Proteus Model Files: TEPHC12.DLL and TEPSERIALMON.DLL.
  • Proteus Simulation: HC12-ArduinoUnoV3.pdsprj, HC12_Chat.hex and copies of both DLLs.
  • Arduino Code: HC12_Chat.ino and the AltSoftSerial 1.4 library (MIT licence).

If you don't have 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 HC-12 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.
  3. Copy TEPHC12.DLL and TEPSERIALMON.DLL into the MODELS folder.
  4. Start Proteus, press P and search for HC-12. You get HC-12 Simple (HC12TEP) and HC-12 Advance (HC12ADVTEP).

Updating from v1.0? Replace the old TEPHC12.LIB and TEPHC12.DLL, and delete TEPHC12.IDX in the LIBRARY folder; Proteus rebuilds it. The library was tested in Proteus 8.5; Proteus 7 is not supported.

HC-12 Module in Proteus

We designed the module as a clean TEP board in the real HC-12's blue, with the Si4463, its 30 MHz crystal, the STM8S003 and a black 433 MHz rubber-duck antenna. Here are both devices at the same moment: U1 is sending and U2 is receiving.

Figure: U1 (Simple) sending, U2 (Advance) receiving.

Pinout

HC-12 pins (same order as the real module)
PinFunctionDemo connection
VCCPower supply (3.2 - 5.5 V on a real module)+5 V
GNDGroundGND
RXDSerial input: data to send, or AT commandsArduino D9
TXDSerial output: received data and AT repliesArduino D8
SETLOW = AT command mode (10 k pull-up)Arduino D7

LEDs, Ring LED and Radio Waves

Board animations
IndicatorWhat it shows
PWR LED (red)On while the module is powered
LINK LED (blue)Blinks on every packet sent or received
Ring LED (green, on the antenna rod)Pulses while sending, bright while receiving
Orange waves, rippling outwardsSending; the panel says SENDING ON AIR
Green waves, rippling inwardsA packet arrived; the panel says PACKET RECEIVED
Grey wavesIdle

A SIMPLE or ADVANCE badge tells you which device you placed, and the board button is PANEL (Simple) or OPEN PANEL (Advance).

Component Properties

Both devices have the properties BAUD (default 9600), FORMAT (8N1), CHANNEL (1), MODE (FU 3) and POWER (P8 = +20 dBm). They are the settings stored in the module at Run; AT commands change them until the simulation stops.

HC-12 Simple: The On-Sheet Panel

The HC-12 Simple draws its HC-12 CONTROLS panel beside the module (image above). It shows:

  • State banner: TRANSPARENT, SENDING ON AIR (orange), PACKET RECEIVED, AT MODE, SLEEP or NO POWER.
  • Settings: FU3, 9600 BPS 8N1, CH001 = 433.4 MHz, +20 dBm, air rate and sensitivity.
  • Counters: in the image, sent 38 bytes in 2 packets, received 19 bytes in 1 packet, TOO WEAK 0, LOST 0 and the last level, -96 dBm.
  • LAST RX ("Hello from node 2") and LAST AT (the last command and reply).

The Distance Buttons

On a schematic the modules are centimetres apart, so you set the distance: 10 m to 2 km. At 100 m the panel says "AT 100 m: -96 dBm, 15000 BPS NEEDS -112 dBm -> OK" and "ABOUT 620 m" of range. A link uses the larger of the two modules' distances.

Closing and Opening the Panel

Click the red X in the panel header and only the board stays. The button now says CLOSED with a grey dot; click PANEL to bring it back.

Figure: The Simple after the red X: the PANEL button shows CLOSED.

HC-12 Advance: The Pop-Up Panel

The HC-12 Advance keeps only the board on the schematic. At Run, a TEP pop-up window opens with the look of our TEP Serial Monitor. Drag it, resize it or minimise it; after closing it, click OPEN PANEL.

The Header and Toolbar

The blue header shows "HC-12", the ADVANCE badge, U2 · CH001, the tabs Panel and Test, and the theme, Settings (gear) and Help (?) icons. The toolbar chips show the settings in use and the distance; the status bar shows the channel, FU mode, baud rate and TX / RX counts.

The Panel Page

The Panel page opens first. Here it is at 100 m:

Figure: The Panel page at 100 m: link OK with +15.8 dB to spare.

State Banner

The green banner says TRANSPARENT - READY: the module passes your data over the air. When the Arduino pulls SET low, it turns purple and says AT MODE - UART 9600 8N1:

Figure: AT mode (PC render of the panel, not a Proteus screenshot).

Module Settings and Traffic

  • Module Settings: mode FU3, channel CH001 433.4 MHz, air rate 15000 bps, UART 9600 8N1, power +20 dBm (P8) and the sensitivity, -112 dBm.
  • Traffic: sent 19 B in 1 packet, received 38 B in 2 packets, too weak 0, lost 0 bytes, last level -96 dBm, test heard 0, last RX "Hello from node 1" and last AT "AT+RX -> OK+FU3 OK+B9600 OK+C001 OK+RP:+20dBm".

Distance to the Other HC-12

Click 1.5 km and the line under the buttons turns red: "At 1.5 km: -120 dBm, needs -112 dBm -> TOO WEAK (-7.7 dB)". The range of these settings is about 620 m, so 1.5 km is too far.

Figure: At 1.5 km the signal is 7.7 dB too weak.

The Test Page

The Test page is the most powerful part of the Advance. Everything on it is computed by the simulation:

  • Link test: 10, 50 or 100 real test packets. The other HC-12s judge them exactly like data (channel, FU mode, air rate, half duplex, distance) but never pass them to their Arduino.
  • Range sweep: the level and margin at every distance step.
  • Radio scan: every other HC-12 in the design, marked PARTNER, TOO WEAK HERE, OTHER CHANNEL, OTHER FU MODE, OTHER AIR RATE or NO POWER.

Test 1: 50 Packets at 500 m

  1. Click 500 m on the Panel page (the link uses the larger of the two distances), then open the Test page.
  2. Click 50 packets in the toolbar.
  3. Wait for "Test 1 finished: 50 packets sent on CH001, FU3, 15000 bps air rate".
Figure: Link test at 500 m: 50 / 50 delivered.

Result: Delivered 50 / 50, Lost 0 (0 %), average -110.2 dBm, margin +1.8 dB: "Every test packet arrived." The green bars sit just above the dashed "needs -112 dBm" line, so the link works with little to spare. The radio scan shows U1 as PARTNER.

Test 2: 50 Packets at 1.5 km

Now click 1.5 km and run 50 packets again.

Figure: Link test at 1.5 km: every packet lost.

This time it is 0 / 50, 50 lost (100 %): "Lost: 50 too weak (-120 dBm, needs -112 dBm)". The radio scan marks U1 TOO WEAK HERE: "1 partner on CH001, but too weak at this distance - click a shorter one."

Test 3: Different Channels

A very common mistake is two modules on different channels. To try it, I sent AT+C005 from node 2's Serial Monitor, so U2 moved to CH005 while U1 stayed on CH001. Then I ran a 10-packet test at 50 m:

Figure: U2 on CH005, U1 on CH001: OTHER CHANNEL.

Result: 0 / 10, "Lost: 10 no receiver with the same channel / FU / air rate". The signal is strong (level -96 dBm), but U1 is marked OTHER CHANNEL, with the red warning "No partner: nobody uses CH005 with FU3 at 15000 bps air rate - match channel, FU mode and baud." The fix: send AT+C005 on node 1 too, or AT+C001 on node 2 to go back.

The Settings Page

The gear icon opens Settings; every choice is saved for your Windows user.

Figure: The Settings page.
  • Theme: TEP Dark (default) or Light.
  • Text size: Small, Normal or Large.
  • Open the panel at Run: On or Off ("Off: open it with the OPEN PANEL button on the module").
  • Window size: Reset to the default size.

Here is the Panel page in the Light theme:

Figure: Light theme (PC render of the panel, not a Proteus screenshot).

The Help Page and Copy Diagnostics

The ? icon opens the same Help & Support page as our Serial Monitor: eight cards, from Report a bug to Community forum. Cards whose page is not published yet say "Link coming soon".

Figure: The Help page: eight cards and the version box (v1.1, build 2026-10-05).

Found a bug? Click Copy diagnostics and paste the text into your forum post. Here is part of what it copied in my run:

TEP HC-12 Advance v1.1 (build 2026-10-05)
Model: TEPHC12.DLL, device HC12ADVTEP, part U2
State: TRANSPARENT
Settings: FU3, 9600 bps 8N1, CH001 = 433.4 MHz, P8 = +20 dBm, air rate 15000 bps
Distance: 100 m
Other HC-12s: 1 - U1 CH001 FU3 9600 bps +20 dBm, level here -96 dBm, partner

Understanding the HC-12 Link Budget

Radio power is measured in dBm: 0 dBm is 1 mW and +20 dBm is 100 mW. A received signal is a negative number such as -96 dBm; closer to zero is stronger. Every receiver has a sensitivity, the weakest signal it can still decode (-112 dBm at 15000 bps air rate). The margin is the received level minus the sensitivity: positive means OK, negative means TOO WEAK.

The model calculates the level as power - path loss, with path loss = 20log10(4πf/c) + 20log10(d) + 51 dB, which follows the manual's rule "6 dB less = half the distance". The range sweep from the screenshot:

Range sweep at FU3, 9600 bps, +20 dBm
DistanceLevelMarginResult
10 m-76.2 dBm+35.8 dBOK
50 m-90.2 dBm+21.8 dBOK
100 m-96.2 dBm+15.8 dBOK
250 m-104.1 dBm+7.9 dBOK
500 m-110.2 dBm+1.8 dBOK
1 km-116.2 dBm-4.2 dBTOO WEAK
1.5 km-119.7 dBm-7.7 dBTOO WEAK
2 km-122.2 dBm-10.2 dBTOO WEAK

Want more range? Use a slower air rate. The ranges of the model at +20 dBm are:

Range of each setting in the model
SettingsSensitivityRange
FU3, 1200 / 2400 bps (5000 bps air)-117 dBmabout 1.1 km
FU3, 4800 / 9600 bps (15000 bps air)-112 dBmabout 620 m
FU3, 19200 / 38400 bps (58000 bps air)-107 dBmabout 350 m
FU3, 57600 / 115200 bps (236000 bps air)-100 dBmabout 155 m
FU1 / FU2 (250 kbps air)-97 dBmabout 110 m
FU4 (500 bps air)-121 dBmabout 1.7 km

HC-12 AT Commands Supported

All these commands work in the library, with the manual's exact replies. They work with or without CR LF; a command also ends after 20 ms of silence.

AT commands of the HC-12 model
CommandReplyWhat it does
ATOKTest
AT+BxxxxOK+BxxxxBaud rate, 1200 - 115200
AT+CxxxOK+CxxxChannel, 001 - 127
AT+FUxOK+FUxFU mode, 1 - 4
AT+PxOK+PxPower P1 - P8 = -1, 2, 5, 8, 11, 14, 17, 20 dBm
AT+UdpsOK+UdpsData bits, parity, stop bits (e.g. AT+U8O1)
AT+RB / RC / RF / RPOK+B9600 / OK+RC001 / OK+FU3 / OK+RP:+20dBmRead one setting
AT+RXFour lines: OK+FU3, OK+B9600, OK+C001, OK+RP:+20dBmRead all settings
AT+VHC-12_V2.3Firmware version
AT+SLEEPOK+SLEEPSleeps after SET goes HIGH; SET LOW wakes it
AT+DEFAULTOK+DEFAULTFactory settings: FU3 9600 8N1 C001 P8
AT+UPDATE(no reply)Waits for a firmware update until the power is cycled
Anything elseERROR

Here is AT+C005 in node 2's Serial Monitor: the TX line is what I sent, then the sketch prints "Command: AT+C005" and the HC-12 answers "OK+C005". The pop-up's status bar already shows CH005.

Figure: AT+C005 -> Command: AT+C005 -> OK+C005.

Arduino HC-12 Proteus Simulation: Two-UNO Chat

Now let's run the demo. The project HC12-ArduinoUnoV3.pdsprj has two Arduino UNOs from our Arduino Library for Proteus V3.0, both running the same HC12_Chat.hex. Node 1 uses HC-12 Simple (U1) with Serial Monitor U3, node 2 uses HC-12 Advance (U2) with Serial Monitor U4.

Figure: The two-UNO chat with both Serial Monitors.

Wiring

Demo wiring (the same on both Arduinos)
FromToWhy
HC-12 TXDArduino D8AltSoftSerial RX
HC-12 RXDArduino D9AltSoftSerial TX
HC-12 SETArduino D7LOW = AT commands
HC-12 VCC / GND+5 V / groundPower
Serial Monitor RXDArduino D1 (TX)Shows what the Arduino prints
Serial Monitor TXDArduino D0 (RX)Sends what you type
Serial Monitor GNDGroundRXD2 stays open

Want to know more about these pins? Read our Introduction to Arduino UNO.

Why AltSoftSerial and Not SoftwareSerial?

Most HC-12 examples use SoftwareSerial. It sends fine in Proteus 8.5, but it cannot receive there: the ATmega328P model of Proteus 8.5 sets the pin-change interrupt flags but never runs the interrupt. AltSoftSerial (Paul Stoffregen, MIT licence) uses Timer1 instead, which Proteus simulates correctly, and it is the better choice on a real UNO too. On the UNO it always uses D8 (RX) and D9 (TX), and PWM on D10 is lost.

The Arduino Code

The sketch HC12_Chat.ino creates the serial port for the HC-12 and the SET pin:

AltSoftSerial HC12;                    // RX = D8 (from HC-12 TXD), TX = D9 (to HC-12 RXD)
const byte SET_PIN = 7;                // LOW = AT command mode, HIGH = transparent mode

This function switches AT mode on and off with the manual's timing:

void commandMode(bool on) {
  digitalWrite(SET_PIN, on ? LOW : HIGH);
  delay(on ? 60 : 100);                // manual: wait 40 ms after SET low, 80 ms after SET high
}

At start-up, setup() prints the module's settings with AT+RX. In loop(), a typed line that starts with AT goes to your own HC-12; any other line goes over the air:

    if (line[0] == 'A' && line[1] == 'T') {
      Serial.print(F("Command: "));
      Serial.println(line);
      commandMode(true);
      sendCommand(line);
      commandMode(false);
    } else {
      HC12.print(line);
      HC12.print("\r\n");
      Serial.print(F("Sent: "));
      Serial.println(line);
    }

Lines from the other HC-12 are printed with "Received: " in front. If you change the sketch, compile it and load the new HEX file into both UNOs; see How to get the HEX file from Arduino. New to Arduino? Start with our Arduino Tutorial for Beginners.

How to Run the Demo

  1. Open Proteus Simulation\HC12-ArduinoUnoV3.pdsprj (keep HC12_Chat.hex beside it).
  2. Press Run. Both Serial Monitors open at 9600 baud, and so does U2's pop-up panel.
  3. In U3, click Hello from node 1 (or type a line and press Enter). Watch the orange and green waves and the LINK LEDs.
  4. Answer from U4 with Hello from node 2.
  5. Click AT+V or AT+RX to talk to your own HC-12.

Simulation Results

At start-up, each monitor shows:

HC-12 settings (AT+RX):
OK+FU3
OK+B9600
OK+C001
OK+RP:+20dBm
Type a line and press Enter to send it. Lines starting with AT go to this HC-12.

Then node 1's monitor (U3) shows the chat:

Hello from node 1
Sent: Hello from node 1
Received: Hello from node 2

and AT+V answers "Command: AT+V" and "HC-12_V2.3".

The TEP Serial Monitor in the Demo

Each node has a TEP Serial Monitor Advance with TX / RX tags and the quick-send buttons AT, AT+RX, AT+V and Hello. Closed one? Click OPEN MONITOR on its symbol. Read all about it in TEP Serial Monitor Advance for Proteus.

Troubleshooting

Nothing Received, but the Other Panel Counts Received Bytes

Your sketch reads the HC-12 with SoftwareSerial. Use AltSoftSerial (D8 / D9), the hardware Serial port or an Arduino Mega (Serial1 - 3).

Nothing Received and RECEIVED Stays 0

Both modules need the same channel, FU mode and air rate. Check for TOO WEAK and click a shorter distance, or run the radio scan on the HC-12 Advance.

No Reply to AT Commands

SET must be LOW for 40 ms first, and the command must be sent at the module's current UART speed (9600 8N1 if SET was LOW at power-up).

No Panel or No Monitor Window

TEPHC12.DLL or TEPSERIALMON.DLL is missing from MODELS and the project folder. For the Advance, click OPEN PANEL or turn "Open the panel at Run" back on.

The Red X Does Not Close the Simple Panel

Your design still holds the v1.0 symbol. Delete TEPHC12.IDX in LIBRARY and pick the part again.

Things to Know Before Using a Real HC-12

  • Power: 3.2 - 5.5 V from a supply that gives at least 200 mA.
  • Capacitor: at least 22 µF (better 1000 µF) across VCC and GND.
  • Diode: above 4.5 V with continuous transmitting, put a 1N4007 in series with VCC, or the regulator overheats.
  • Pins: RXD, TXD and SET have 1 k resistors inside; don't hang an LED on TXD.
  • Neighbours: keep separate systems 5 channels apart.
  • Range: the manual gives 1000 m (FU3) and 1800 m (FU4) in open space; the simulation's ranges are calibrated to these figures.

Limitations of the Simulation

  • The distance is a value you set, not the real position of the parts. Walls and antennas are not simulated.
  • An HC-12 only talks to other HC-12s, not to our LoRa or nRF24 modules.
  • AT+UPDATE only waits; no real firmware update is done.
  • Tested in Proteus 8.5 (the Proteus screenshots in this article) and with 420 automatic checks on the PC; Proteus 7 is not supported.

Looking for other radios? Try our nRF24L01 PA LNA Library for Proteus, SX1278 LoRa Library for Proteus and CC1101 Library for Proteus.

Figure: At 50 m the link is OK with +21.8 dB to spare.

So, that was all about the HC-12 Library for Proteus V1.1. I hope the two devices, the live panels and the test tools make your wireless projects easier to understand. 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!