
ESP-07 Library for Proteus: ESP8266 Wi-Fi Module with u.FL Antenna

Hello friends, I hope you all are doing great. Today, I am going to share the ESP-07 Library for Proteus. The ESP-07 is the ESP8266 Wi-Fi module for projects where the signal matters: next to its small ceramic antenna it has a u.FL socket for an external antenna. With this library you can place it in Proteus, wire it to an Arduino, send it AT commands and watch it join the Wi-Fi, serve web pages, switch its own GPIO pins and talk TCP to other modules - all inside the simulation.
ESP-07 Library for Proteus
Latest version: V1.0 (October 2026, this tutorial)
Helping Tools
- Laptop WiFi Monitor: a laptop on the Wi-Fi of your design: a browser, a TCP / UDP terminal and ping
- Mobile WiFi Monitor: a smartphone that opens the pages of your Wi-Fi module and sends it commands
- Serial Monitor Advance: a serial terminal window for the UART of your board
This is the ninth library of our Wi-Fi series, and it brings three things our earlier ESP8266 modules did not have: the antenna jumper (click it and the RSSI goes up by 7 dB), the boot pins that a bare ESP-07 needs (EN, RST, GPIO0 and GPIO15, checked like on the bench) and six free GPIO pins that your Arduino drives with AT commands. As always, the demos end with a project that links this module with the previous library of the series: the ESP-07 and our ESP-01 adapter become a two-way Wi-Fi chat between two Arduinos.
NOTICE: real ESP-07 modules differ between makers and batches: some have only the blue LED, the antenna selector sits in different places, and the newer ESP-07S has no ceramic antenna at all. Check your module before you wire it. Your feedback is the fuel that keeps us going, so please tell us what you think in the comments below or in the ESP-07 board of our forum. And if our free libraries help you, you can buy us a coffee. So, let's get started with the ESP-07 Library for Proteus:
What is the ESP-07?
The ESP-07 is one of the Ai-Thinker modules built around the ESP8266 Wi-Fi chip. Under its metal can sit the ESP8266EX, the flash memory and the crystal; outside the can are the antennas and 16 pins, eight on each long side. Like the ESP-01, it ships with the AT firmware, so an Arduino can use it through a serial port with commands such as AT+CWJAP and AT+CIPSEND. Unlike the ESP-01, it brings out almost every pin of the chip - and it is made for range.
| Real ESP-07 | This library in Proteus | |
|---|---|---|
| Chip | ESP8266EX under a metal can, AT firmware | our AT firmware 1.7.4 model |
| Antennas | a ceramic chip antenna and a u.FL socket | both, with a clickable jumper (+7 dB on u.FL) |
| Pins | 16, on a 2 mm pitch | 16, on the 0.1 inch grid of Proteus |
| Boot pins | EN and RST pulled up, GPIO15 pulled down, GPIO0 high for normal boot | checked at every boot, shown on the panel |
| GPIO | GPIO0, 2, 4, 5, 12, 13, 14, 15, 16 | GPIO4, 5, 12, 13, 14, 16 driven with AT+SYSGPIO |
| LEDs | red power LED and blue LED on GPIO2 (on most boards) | the red PWR and blue IO2 LEDs, live |
| Supply | 3.3 V, about 300 mA peaks | VCC on 3.3 V |
The Ceramic Antenna and the u.FL Socket
The ceramic antenna is a tiny chip at one end of the board. It works, but it is small, so its range is a little shorter than the PCB antenna of an ESP-01 or ESP-12E. The u.FL socket (also called IPEX) takes a small coaxial cable to an external antenna, which can sit outside a metal box or point at a far router - that is why people choose the ESP-07. On many real boards a tiny 0-ohm resistor decides which antenna is connected, and moving it takes a soldering iron. In our part it is a jumper you click: on the u.FL side the module gets an external antenna with 7 dB more signal.
The Boot Pins of a Bare ESP8266 Module
The ESP-01 hides most of its pins, and our ESP-01 adapter even ties CH_PD high for you. The ESP-07 does not: when you use one on its own, a few pins decide whether it starts at all. EN (also called CH_PD) must be pulled up, or the chip stays off. RST resets the chip when it goes low. GPIO15 must be low when the chip starts - pulled down with a resistor - or the ESP8266 tries to boot from an SD card and the AT firmware never runs. GPIO0 low at boot selects the flash mode for loading new firmware. Our model checks all four at every boot and the panel shows them, so a missing resistor in Proteus looks the same as on the bench: no answer from the module.
GPIO Pins Through AT Commands
The AT firmware can also use the free pins of the ESP8266. AT+SYSGPIODIR=4,1 makes GPIO4 an output, AT+SYSGPIOWRITE=4,1 sets it high and AT+SYSGPIOREAD=4 reads a pin back. So the Arduino can switch an LED or a relay that hangs on the ESP-07 itself, without spending one of its own pins - handy when the module sits at the far end of a cable from the Arduino. Both demos use GPIO4 this way.
Features of the ESP-07 Library for Proteus
- The ESP-07 as it looks: the black board with the metal can, the ceramic antenna, the u.FL socket with its jumper, the two LEDs and the 16 gold pins, drawn a little bigger than the real module.
- A clickable antenna jumper: ceramic or u.FL; on u.FL the RSSI goes up by 7 dB, a weak signal gets better and the scan sees farther. The ANTENNA property sets it at Run.
- Real boot pins: EN low switches the module off, RST low resets it, GPIO15 must be low at boot and GPIO0 low selects the flash mode - the panel shows the state of each.
- Six GPIO pins (GPIO4, 5, 12, 13, 14 and 16) that the Arduino drives or reads with AT+SYSGPIO commands.
- Live LEDs and antennas: the red PWR LED, the blue IO2 LED, and the antenna in use turns orange while the module sends and green while it receives.
- The AT firmware 1.7.4 of our ESP-01 Library for Proteus: Wi-Fi join and scan, TCP and UDP, the server, +IPD, CIPSEND, UART_CUR, SNTP, PING and more.
- Wi-Fi in Proteus: a virtual router with DHCP and two neighbours for scans, a phone that opens your web page, an internet host, and TCP / UDP to every TEP Wi-Fi part in the design.
- Our pop-up panel: the phone, the module card with the antenna buttons and the boot pins, a Test page with four measuring tools, Settings and Help.
- Two demo projects with our Arduino UNO V4.0: a Wi-Fi switch for the LED on GPIO4, and a Wi-Fi chat with our ESP-01 adapter.
- A compact package: about 2.36 MB, without the C++ source code of the models.
The ESP-07 Part in Proteus
Search ESP-07 in Pick Devices; the device ESP-07 WIFI MODULE is in TEPESP07.LIB. The pins sit on both sides as on the real module: RST, ADC, EN, IO16, IO14, IO12, IO13, VCC on the left and TXD, RXD, IO5, IO4, IO0, IO2, IO15, GND on the right. The part is drawn about 1.15 x the real size, because its pins sit on the 0.1 inch grid of Proteus while the real module uses a 2 mm pitch; next to our UNO it is still small. Click the PANEL pad or the metal can to open the panel, and the jumper to change the antenna.
Every State of the ESP-07
We ran the switch demo and paused the simulation for each picture. At Run the ESP-07 powers up and prints its boot text; the blue IO2 LED flashes during the boot, as on the real module:
While data flows, the antenna in use shows the direction:
Now click the jumper. It moves to the u.FL side, and from then on the u.FL socket is the antenna that glows:
Download ESP-07 Library for Proteus
Click the button below to download ESP-07-Library-for-Proteus-v1.0.zip (about 2.36 MB, without the C++ source code of the models):
ESP-07 Library for Proteus V1.0- README.txt: the device, installation, the two demos, the pins, the properties, troubleshooting and the limits.
- Proteus Library Files:
TEPESP07.LIB(the ESP-07),ArduinoV4TEP.LIB(our Arduino boards V4.0 - the UNO of the demos) andTEPESP01ADAPTER.LIB(our ESP-01 adapter, the client of the second demo). - Proteus Model Files:
TEPNET.DLL(the ESP-07 and the Wi-Fi network) andTEPARDUINO.DLL(the Arduino boards). - Proteus Simulation: the two demo projects, their HEX files and copies of the DLLs.
- Arduino Code: the three demo sketches. AltSoftSerial is not included - install it from the Library Manager.
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 ESP-07 Library for Proteus
- Close Proteus and extract the whole zip file, for example to your Desktop.
- Copy the three files from Proteus Library Files into the LIBRARY folder of Proteus (usually
C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\LIBRARY). - Copy
TEPNET.DLLandTEPARDUINO.DLLfrom Proteus Model Files into the MODELS folder - replace older copies (the new TEPNET.DLL still runs all our ESP32 boards, the ESP-01, the ESP-01S, the WiFi Shield and the ESP-01 adapter). - Delete
TEPESP07.IDX,ArduinoV4TEP.IDXandTEPESP01ADAPTER.IDXfrom the LIBRARY folder if they are there. - Start Proteus, press P and search for ESP-07.
The sketches are normal UNO sketches: select Arduino Uno in the Arduino IDE, install AltSoftSerial, write your sketch and use Sketch > Export Compiled Binary; then double-click the UNO in Proteus and set its Program File to the HEX (see How to get the HEX file from Arduino).
Demo 1: A Wi-Fi Switch on the ESP-07's Own Pin
Open ESP-07-WiFi-Switch.pdsprj. The ESP-07 needs a little more than four wires: VCC to +3.3V and GND to ground, R1 pulls EN up, R2 pulls GPIO15 down, and the module's TXD goes to the UNO's D8 and its RXD comes from D9. The LED with R3 hangs on GPIO4 of the ESP-07 - not on the UNO. The UNO is our Arduino UNO Library for Proteus V4.0, with its built-in serial monitor at 9600 baud, and the module talks to AltSoftSerial on D8 / D9.
The ESP-07 starts at 115200 bps, too fast for a software serial port to receive, so the sketch sends one AT+UART_CUR=9600 at that speed and then talks at 9600 - the same trick as in our ESP-01 demos. If nothing answers, it says which pins to check. Then it sets the module up: station mode, and GPIO4 as an output, with the LED off:
void setupModule() {
command("ATE0"); // no echo
command("AT+CWMODE=1"); // station
command("AT+SYSGPIODIR=4,1"); // GPIO4 (the LED) an output
setLed(false);
Switching the LED is one AT command. The sketch remembers the state, so the web page and the monitor can show it:
void setLed(bool on) {
led = on;
command(on ? "AT+SYSGPIOWRITE=4,1" : "AT+SYSGPIOWRITE=4,0");
}
The page also shows the signal. AT+CWJAP? answers with the router's name, its MAC address, the channel and the RSSI as the last number, so the sketch keeps the text after the last comma:
void onJoined(const char* s) {
if (strncmp(s, "+CWJAP:", 7)) return;
const char* last = strrchr(s, ',');
if (last) rssi = atoi(last + 1);
}
void readRssi() { command("AT+CWJAP?", 2000, onJoined); }
Press Run and watch the UNO's monitor. The module is found, joins TEP-WiFi, reports its signal and starts the web server:
UNO + ESP-07: Wi-Fi switch (the LED on the ESP-07's GPIO4)
www.TheEngineeringProjects.com
ESP-07 found, now at 9600 bps
Joining TEP-WiFi... connected
Signal: RSSI -45 dBm
Switch page ready: open http://192.168.1.101/
Serial monitor: ON, OFF, RSSI, SCAN, STATUS, AT..., HELP
Now open the module's panel and tap OPEN ESP PAGE on its phone. The page shows the LED, three links and the signal of the moment:
Every request goes through the same few lines of the sketch: the path of the request decides what happens to the LED, then the page is sent with the new state:
if (!strcmp(path, "/on")) setLed(true);
if (!strcmp(path, "/off")) setLed(false);
The monitor is a small Wi-Fi tool too. Type ON or OFF to switch the LED, RSSI for the signal, SCAN for the networks in range and STATUS for a summary; any line starting with AT goes to the module as it is. Here the LED is switched on from the monitor, then the phone and the web request test ask for the page:
ON
LED ON (AT+SYSGPIOWRITE=4,1)
Request: GET / HTTP/1.1
Request: GET / HTTP/1.1
Request: GET / HTTP/1.1
Request: GET / HTTP/1.1
Testing the Antenna Jumper
This is the part that makes the ESP-07 special, so let's measure it. The panel's module card shows the antenna in use with two buttons, Ceramic and u.FL, and the boot pins below them:
Click u.FL (or the jumper on the part) and the external antenna is in use; the RSSI rises from -46 to -40 dBm with a GOOD signal:
Typed in the monitor, RSSI and SCAN show the same: the router at -38 to -40 dBm and the two neighbour networks at -72 and -81 dBm. Then OFF and STATUS:
RSSI
Signal: RSSI -40 dBm
SCAN
Scanning (AT+CWLAP)...
TEP-WiFi -38 dBm
Neighbour_WiFi -72 dBm
Guest_Network -81 dBm
3 network(s) in range
OFF
LED OFF (AT+SYSGPIOWRITE=4,0)
STATUS
LED OFF, IP 192.168.1.101, RSSI -40 dBm, 3 pages served, up 20 s
The difference matters most when the signal is weak. The phone's WEAK button moves the router far away. On the u.FL antenna the module still reads -73 dBm; back on the ceramic antenna it drops to -82 dBm - still connected, but close to the edge:
OUT OF RANGE takes the router away completely; the module loses its IP address, and the sketch's next page or command fails until GOOD brings the router back and the module joins again:
The Test Page, Settings and Help
The panel opens at Run, in the look of our TEP Serial Monitor Advance for Proteus. Its Test page measures the running model. The web request test opened the switch page three times, and the Wi-Fi join test made the module leave and re-join the router three times:
The whole first demo while it sends a page - the LED on GPIO4 lit, the antenna orange:
One more thing the sketch does: every 30 seconds it checks that the module still answers at 9600. A reset puts the ESP-07 back to 115200 bps without its server, so the sketch finds it again and repeats the set-up:
if (millis() - lastCheck > CHECK_EVERY) {
if (!command("AT", 1000) && !command("AT", 1000)) {
Serial.println(F("The ESP-07 restarted - setting it up again"));
if (startEsp()) setupModule();
}
lastCheck = millis();
}
Demo 2: A Wi-Fi Chat with the ESP-01 Adapter
Now the ESP-07 meets the previous library of the series, our ESP-01 Adapter Library for Proteus. In ESP-07-and-ESP-01-Adapter-Chat.pdsprj the first UNO and the ESP-07 (U1, 192.168.1.101) are the chat server on TCP port 5000, with the LED on GPIO4 again. The second UNO with the ESP-01 adapter (U2, 192.168.1.102) is the client. Whatever you type in one serial monitor appears in the other one, and the client can switch the ESP-07's LED by sending LED ON or LED OFF.
Our earlier demos opened a TCP link for one request and closed it. A chat keeps the link open. The server allows several links with AT+CIPMUX=1, listens on port 5000, and AT+CIPSTO=0 tells the firmware never to close an idle link:
command("AT+CIPMUX=1"); // several connections - needed for the server
char at[24];
snprintf_P(at, sizeof(at), PSTR("AT+CIPSERVER=1,%d"), CHAT_PORT);
command(at);
command("AT+CIPSTO=0"); // the chat link never times out
When the client connects, the firmware prints 0,CONNECT - the number is the link. The server keeps that number, because every AT+CIPSEND needs it:
if (comma && !strcmp(comma + 1, "CONNECT")) {
peer = atoi(line);
Serial.print(F("ARD2 joined the chat (link "));
Serial.print(peer);
Serial.println(')');
continue;
}
Each message arrives as +IPD,<link>,<length>: followed by the text. The server prints it, and two messages are commands: LED ON and LED OFF switch GPIO4 and get an answer; any other message blinks the LED once, so you can see the chat on the board too:
void onMessage() {
++received;
Serial.print(F("ARD2: "));
Serial.println(msg);
if (!strcasecmp(msg, "LED ON") || !strcasecmp(msg, "LED OFF")) {
setLed(!strcasecmp(msg, "LED ON"));
say(led ? "ESP-07 LED is ON" : "ESP-07 LED is OFF");
} else { // any other message: one blink of the LED
setLed(!led); delay(150); setLed(!led);
}
}
The client on the adapter is even simpler. With AT+CIPMUX=0 it has one link, opened with AT+CIPSTART to the ESP-07's address; if the ESP-07 is not ready yet, it tries again every 5 seconds:
void connect() {
char at[48];
snprintf_P(at, sizeof(at), PSTR("AT+CIPSTART=\"TCP\",\"%s\",%d"), SERVER_IP, CHAT_PORT);
linked = command(at, 5000);
if (linked) { Serial.print(F("Connected to the ESP-07 chat (")); Serial.print(SERVER_IP); Serial.print(':'); Serial.print(CHAT_PORT); Serial.println(')'); }
else Serial.println(F("The ESP-07 does not answer yet - trying again in 5 s"));
}
Press Run. Both modules join TEP-WiFi, the ESP-07 starts its server and the adapter connects. Then we typed a hello on ARD2:
LED ON typed in ARD2's monitor travels over Wi-Fi, ARD1 sends AT+SYSGPIOWRITE=4,1 to its ESP-07, and the LED lights; LED OFF puts it out again:
Here is the whole chat from the server's side. Lines with Me: are the ones typed here and sent; lines with ARD2: came over the link:
Joining TEP-WiFi... connected
Chat server ready on 192.168.1.101:5000 - waiting for ARD2
ARD2 joined the chat (link 0)
ARD2: Hello ARD1, the adapter is online
Hi ARD2, the ESP-07 hears you
Me: Hi ARD2, the ESP-07 hears you
ARD2: LED ON
ARD2: LED OFF
Thanks, LED is off again
Me: Thanks, LED is off again
ARD2: LED ON
STATUS
Link 0, received 4, sent 5, LED ON
And from the client's side - every LED command is confirmed by the ESP-07's Arduino:
ARD1: Hi ARD2, the ESP-07 hears you
LED ON
Me: LED ON
ARD1: ESP-07 LED is ON
LED OFF
Me: LED OFF
ARD1: ESP-07 LED is OFF
ARD1: Thanks, LED is off again
LED ON
Me: LED ON
ARD1: ESP-07 LED is ON
STATUS
Connected, received 5, sent 4
Both panels show the open link - one TCP link, opened once and still open:
Our earlier projects linked boards with HTTP requests and short TCP and UDP messages; this one keeps a TCP link open in both directions, the way a chat, a telemetry stream or a remote console works. Try it with two ESP-07 modules, or with any of our ESP32 boards on the other side.
Pins of the ESP-07
| Pin | What it is |
|---|---|
| RST | reset, low = in reset (pull it up on a real module) |
| ADC | the ESP8266's analog input (0 to 1 V) - not read by the AT firmware model |
| EN | CH_PD, the enable pin: high = on, low = off - pull it up with 10k |
| IO16, IO14, IO12, IO13 | GPIO pins for AT+SYSGPIO |
| VCC | 3.3 V supply - not 5 V |
| TXD | the module's UART TX, to the Arduino's RX |
| RXD | the module's UART RX, from the Arduino's TX (3.3 V logic) |
| IO5, IO4 | GPIO pins for AT+SYSGPIO (IO4 drives the LED of the demos) |
| IO0 | GPIO0: low at boot = flash mode |
| IO2 | GPIO2, the blue IO2 LED |
| IO15 | GPIO15: must be low at boot - pull it down with 10k |
| GND | ground |
Properties of the ESP-07
| Property | What it does |
|---|---|
| WIFISSID / WIFIPASS | the router in range (TEP-WiFi / 12345678) |
| BAUD | the ESP-07's factory UART speed (115200) |
| ANTENNA | the jumper at Run: CERAMIC or UFL |
| PANEL | the phone's tab at start (BROWSER, CLOUD, WIFI) |
| PAGEPORT | the port OPEN ESP PAGE opens (80) |
| CLOCK | the clock for SNTP: PC or a fixed start time |
Troubleshooting
- "No answer from the ESP-07": TXD must reach D8 and RXD D9 (AltSoftSerial's fixed pins), VCC 3.3 V and GND the supply - the panel says NO POWER without it, and "EN low - disabled" when EN is low.
- The panel says "SDIO boot (GPIO15 not low)": GPIO15 needs its pull-down; without it the AT firmware does not start. "flash mode (GPIO0 low)" means GPIO0 was low at boot.
- AT+SYSGPIOWRITE answers NOT OUTPUT!: send
AT+SYSGPIODIR=4,1first - the pins start as inputs. - "The ESP-07 does not answer yet" on the chat client: the ESP-07 must be on Wi-Fi with its server running first; the client tries again every 5 seconds.
- No panel: click the PANEL pad or the metal can, or turn "Open the panel at Run" back on in Settings.
Things to Know Before Using a Real ESP-07
- Power: the ESP-07 draws up to about 300 mA while it sends. Use a 3.3 V regulator that can deliver that - not the UNO's 3.3V pin.
- Levels: the ESP-07 is a 3.3 V part. Put a divider (for example 1k / 2k) between a 5 V Arduino's TX and the module's RXD; the module's TXD can go straight to the Arduino.
- The 2 mm pitch: the pins do not fit a breadboard. Solder the module to an adapter plate - many of them already carry the EN, RST and GPIO15 resistors.
- Boot resistors: on a bare module pull EN, RST, GPIO0 and GPIO2 up with 10k and GPIO15 down with 10k.
- The external antenna: check how your board selects it - both antennas wired at once, or a 0-ohm resistor to move. Never send with the u.FL selected and nothing plugged in.
- The firmware: most ESP-07 modules ship with the AT firmware at 115200 bps;
AT+GMRtells you the version, and the GPIO commands depend on it.
Limitations of the Simulation
- The ESP8266 runs our model of the AT firmware 1.7.4, not your own ESP8266 firmware; GPIO0 low gives the flash mode, but nothing can be flashed.
- In Proteus an open EN or a 10k pull-up to a 3.3 V terminal both count as on - only a low switches the module off. GPIO15 must really be low.
- Not modelled: the ADC pin, the soft access point (CWMODE 2 / 3 are accepted, but nothing can join it), SSL connections, the supply's voltage and current, the radio itself - the join and network times and the +7 dB of the external antenna are realistic values, not a radio simulation.
- The antenna colours, the PANEL pad, the panel, its phone, the router, the two neighbour networks and the internet host are TEP additions.
- ESP8266 and ESP-07 are names of Espressif and Ai-Thinker; this library is not made or endorsed by Espressif, Ai-Thinker, Arduino or Labcenter.
- Tested in Proteus 8.5 in October 2026 (the two demos as shipped, the switch demo 40 s of simulation in 78 s, about 0.5 x real time; the chat with its two UNOs about 0.25 x). Proteus 7 is not supported.
So, that was all about the ESP-07 Library for Proteus. I hope it helps you try the ESP-07 with its external antenna and its boot pins in Proteus before you solder the real one. Our series started with the ESP32 DevKit V1 Library for Proteus V2.0 - try linking the ESP-07 with any of our ESP32 boards too. If you use the ESP-07 Library for Proteus in a project, please share it 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