
ESP-01 Adapter Library for Proteus: ESP8266 ESP-01 on 5V Arduino

Hello friends, I hope you all are doing great. Today, I am going to share the ESP-01 Adapter Library for Proteus. It brings the famous ESP-01 adapter board to Proteus: the small 5 V board with a regulator and a level shifter that the ESP-01 plugs into, so that an Arduino UNO can use the ESP8266 Wi-Fi module with four wires and no extra parts. Your sketch sends AT+CWJAP, AT+CWLAP or AT+CIPSTART over a serial port, and the module scans, joins, serves pages and talks TCP and UDP, right inside the simulation.
ESP-01 Adapter 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 eighth library of our Wi-Fi series. After the ESP-01S, it is the classic blue ESP-01 again - this time sitting in its adapter, drawn at its real size next to our UNO, with its red power LED and the blue LED on TX. It runs the same AT firmware model as our ESP-01 Library for Proteus. As always, the demos end with a project that links this module with the previous one: the adapter becomes a Wi-Fi remote for the blue LED of the ESP-01S.
NOTICE: real ESP-01 adapters differ between makers: the regulator, the input voltage range and the order and labels of the header pins - some print RX and TX from the Arduino's side. Check the silkscreen of your board 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-01 Adapter 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-01 Adapter Library for Proteus:
What is the ESP-01 Adapter Board?
The ESP-01 is a tiny ESP8266 Wi-Fi module with the AT firmware - but it is a 3.3 V part. Its pins are not 5 V tolerant, and its supply must deliver peaks of about 300 mA, more than the UNO's 3.3V pin can give. On the bench that means a separate regulator and a resistor divider on the Arduino's TX line. The ESP-01 adapter does all of that on one small board: an AMS1117 regulator makes 3.3 V from the 5 V input, two small MOSFETs shift the TX and RX levels both ways, CH_PD is tied high, and a 2 x 4 socket holds the ESP-01. What is left for you is a 4-pin header: GND, RX, TX, VCC.
| Real ESP-01 adapter | This library in Proteus | |
|---|---|---|
| Supply | VCC 5 V (some boards up to 12 V), AMS1117 to 3.3 V | VCC on 5 V; the panel shows the regulator |
| Serial lines | TX / RX level-shifted with two MOSFETs | TX / RX straight to the Arduino pins |
| Module | an ESP-01 (ESP8266, AT firmware) in a 2 x 4 socket | the classic blue ESP-01, our AT firmware 1.7.4 model |
| Pins | GND, RX, TX, VCC (the order varies) | GND, RX, TX, VCC |
| LEDs | the ESP-01's red PWR and blue TX LEDs | the same two, live |
| Wi-Fi | 802.11 b/g/n, station and soft AP | a virtual router, DHCP, scans, TCP, UDP, SNTP, ping, a phone |
| Size | about 24 x 42 mm with the ESP-01 | drawn at the real size against our UNO V4.0 |
Why an Adapter and Not Just the ESP-01?
Because it makes the wiring the same as for any 5 V module. With a bare ESP-01 on an UNO you need a 3.3 V supply, a divider from the UNO's TX to the ESP-01's RX, and pull-ups on CH_PD and RST. With the adapter you connect VCC to 5V, GND to GND, the adapter's TX to an Arduino input and its RX to an Arduino output - done. The price is that GPIO0, GPIO2 and RST are not brought out, so the adapter cannot put the ESP-01 into its flash mode: it is for the AT firmware, which is exactly what an Arduino project needs.
How the Level Shifter Works
Each line of the level shifter is one small N-channel MOSFET with a pull-up resistor on each side: 3.3 V on the ESP-01's side, 5 V on the Arduino's side. When neither side pulls low, both pull-ups hold their line high - 3.3 V for the module, 5 V for the Arduino. When the ESP-01 pulls its TX low, the MOSFET turns on and pulls the 5 V side low too; when the Arduino pulls its side low, the MOSFET's body diode pulls the 3.3 V side down. So one part works in both directions, and neither chip ever sees the other one's voltage. In Proteus the lines are logic levels, so the model simply passes them through - the panel reminds you that the shifter is there.
AT Commands We Use in This Library
Besides the usual AT+CWJAP, AT+CIPSERVER and AT+CIPSEND, the demos use three commands our earlier Wi-Fi demos did not show: AT+CWLAP lists the networks in range with their signal and channel, AT+PING="host" measures the round trip to a server, and AT+CIPSNTPCFG=1,0 with AT+CIPSNTPTIME? gives the module the time from the internet (SNTP, here in UTC). In Proteus the router has two neighbours for the scan, and the internet host answers pings and HTTP requests.
Features of the ESP-01 Adapter Library for Proteus
- The adapter with the ESP-01 plugged in, drawn at the real size: the black adapter with its AMS1117, the two MOSFETs, the capacitors and the 4-pin header, and the blue ESP-01 with the ESP8266EX, the flash, the crystal and the antenna.
- The ESP-01's LEDs, live: the red PWR LED with the supply and the blue LED on TX, which flickers whenever the module sends - at boot and with every answer to the Arduino.
- A live antenna: orange while the module sends, green while it receives.
- The AT firmware 1.7.4 of our ESP-01 model: 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 for pings and HTTP, and TCP / UDP to every TEP Wi-Fi part in the design.
- Our pop-up panel: the phone, the module card with the adapter's supply, a Test page with four measuring tools, Settings and Help.
- Two demo projects with our Arduino UNO V4.0: a Wi-Fi clock and scanner with a web page, and a Wi-Fi remote that switches the ESP-01S's blue LED.
- A compact package: about 2.36 MB, without the C++ source code of the models.
The ESP-01 Adapter Part in Proteus
Search ESP-01 ADAPTER in Pick Devices; the device is in TEPESP01ADAPTER.LIB. The four pins point down: GND, RX, TX and VCC. The whole part is about 24 x 42 mm against our UNO, the size of the real board with the module in it. Click the PANEL pad or the ESP8266EX chip to open the panel.
Every State of the Adapter
We ran the clock demo and paused the simulation for each picture. At Run the ESP-01 powers up and prints its boot text, so both LEDs light at once:
While data flows, the antenna shows its direction, and the TX LED shows the module answering the UNO:
Download ESP-01 Adapter Library for Proteus
Click the button below to download ESP-01-Adapter-Library-for-Proteus-v1.0.zip (about 2.36 MB, without the C++ source code of the models):
ESP-01 Adapter Library for Proteus V1.0- README.txt: the device, installation, the two demos, the pins, the properties, troubleshooting and the limits.
- Proteus Library Files:
TEPESP01ADAPTER.LIB(the adapter),ArduinoV4TEP.LIB(our Arduino boards V4.0 - the UNO of the demos) andTEPESP01S.LIB(our ESP-01S, the lamp of the second demo). - Proteus Model Files:
TEPNET.DLL(the adapter 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-01 Adapter 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 and the WiFi Shield). - Delete
TEPESP01ADAPTER.IDX,ArduinoV4TEP.IDXandTEPESP01S.IDXfrom the LIBRARY folder if they are there. - Start Proteus, press P and search for ESP-01 ADAPTER.
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 Clock and Scanner
Open ESP-01-Adapter-WiFi-Clock.pdsprj. This is all the wiring the adapter needs: VCC to 5 V, GND to ground, the adapter's TX to the UNO's D8 and its RX from D9. The UNO is our Arduino UNO Library for Proteus V4.0, with its built-in serial monitor at 9600 baud - D0 / D1 stay free for the monitor, and the module talks to AltSoftSerial:
AltSoftSerial esp; // RX = D8 (from the adapter's TX), TX = D9 (to the adapter's RX)
SoftwareSerial espFast(12, 9); // only sends one command at 115200 on D9 (D12 unused)
The ESP-01 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 with SoftwareSerial and then talks at 9600 - the same trick as in our ESP-01S demos. Then it scans. Every +CWLAP line goes to a small parser that prints the network's name, signal and channel and remembers the strongest one:
void scan() {
networks = 0; strongestRssi = -127; strcpy(strongest, "-");
Serial.println(F("Scanning (AT+CWLAP)..."));
command("AT+CWLAP", 8000, onNetwork);
Serial.print(networks);
Serial.print(F(" network(s) in range, the strongest: "));
Serial.println(strongest);
}
After the join it asks for the time. AT+CIPSNTPCFG=1,0 turns SNTP on with the time zone 0 (UTC), and AT+CIPSNTPTIME? answers with the date and time as text; the sketch keeps only the hh:mm:ss part, and shows --:--:-- while the clock still says 1970 (not synced yet):
void onTime(const char* s) {
if (strncmp(s, "+CIPSNTPTIME:", 13)) return;
const char* colon = strchr(s + 13, ':');
if (!colon || colon - s < 15) return;
if (strstr(s, "1970")) { strcpy(clockText, "--:--:--"); return; }
memcpy(clockText, colon - 2, 8); clockText[8] = '\0';
}
Why UTC? Because it is the same everywhere, so the demo works for every reader. For your local time change the second number of AT+CIPSNTPCFG to your time zone in hours - for example AT+CIPSNTPCFG=1,5 for UTC+5. The CLOCK property of the part decides where the model's clock starts: PC uses the computer's clock, or give it a fixed start time to get the same pictures in every run.
Press Run and watch the UNO's monitor. The module is found, the three networks in range are listed, the UNO joins TEP-WiFi, pings the ThingSpeak server, reads the time and starts its web server:
UNO + ESP-01 on the 5 V adapter: Wi-Fi clock and scanner
www.TheEngineeringProjects.com
ESP-01 found on the adapter, now at 9600 bps
Scanning (AT+CWLAP)...
TEP-WiFi -45 dBm channel 6
Neighbour_WiFi -79 dBm channel 1
Guest_Network -88 dBm channel 11
3 network(s) in range, the strongest: TEP-WiFi
Joining TEP-WiFi... connected
Ping api.thingspeak.com: 128 ms
Time (UTC) 15:53:00
Clock page ready: open http://192.168.1.101/
Serial monitor: TIME, SCAN, PING, STATUS, AT..., HELP
Now open the module's panel and tap OPEN ESP PAGE on its phone. The page shows the time of the request, the Wi-Fi signal, the number of networks seen and the pot on A0, with two links:
TIME reads the clock again; SCAN makes the UNO scan again before it answers:
if (!strcmp(path, "/scan")) scan();
readTime(); // every page shows the time of the request
The monitor is also a small Wi-Fi tool. Type TIME, SCAN, PING or STATUS - and any line that starts with AT goes to the module as it is:
void ping() {
char at[48];
snprintf_P(at, sizeof(at), PSTR("AT+PING=\"%s\""), PING_HOST);
esp.print(at);
esp.print(F("\r\n"));
Serial.print(F("Ping "));
Serial.print(PING_HOST);
Serial.print(F(": "));
const unsigned long start = millis();
TIME
Time (UTC) 15:53:09
PING
Ping api.thingspeak.com: 128 ms
STATUS
IP 192.168.1.101, RSSI -46 dBm, time (UTC) 15:53:09, 3 pages served, A0 = 614, up 19 s
AT+CWJAP?
> AT+CWJAP?
< +CWJAP:"TEP-WiFi","c8:3a:35:a4:26:89",6,-46
< OK
The Adapter's Panel
The panel opens at Run, in the look of our TEP Serial Monitor Advance for Proteus. The Wi-Fi page holds the phone and three cards: ESP-01 ON THE 5 V ADAPTER (firmware, mode, UART, TCP, power and the adapter itself: VCC 5 V, AMS1117 3.3 V, level shifter), WI-FI and TRAFFIC.
The Test page measures the running model. The web request test opened the clock 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 - both LEDs lit, the antenna orange:
Demo 2: A Wi-Fi Remote for the ESP-01S
Now the adapter meets the previous library of the series, our ESP-01S Library for Proteus. In ESP-01-Adapter-and-ESP-01S-Remote.pdsprj the first UNO and the ESP-01S (U1, 192.168.1.101) are the lamp: they run the blue LED web page of the ESP-01S library, unchanged. The second UNO with the adapter (U2, 192.168.1.102) and a pot on A0 is the remote: it switches the ESP-01S's blue LED by opening the same pages a browser would.
The remote is an HTTP client written with AT commands: one TCP link to the ESP-01S, a three-line GET request, then it reads the answer and closes:
void request(const char* path) {
char at[48];
snprintf_P(at, sizeof(at), PSTR("AT+CIPSTART=\"TCP\",\"%s\",80"), LAMP_IP);
if (!command(at, 5000)) { Serial.println(F("The ESP-01S does not answer (no TCP connection)")); return; }
char get[64];
snprintf_P(get, sizeof(get), PSTR("GET %s HTTP/1.1\r\nHost: %s\r\n\r\n"), path, LAMP_IP);
snprintf_P(at, sizeof(at), PSTR("AT+CIPSEND=%d"), (int)strlen(get));
answerLength = 0; answer[0] = '\0'; inAnswer = false; keyAt = 0;
esp.print(at);
esp.print(F("\r\n"));
if (waitFor(">", 2000)) { esp.print(get); waitFor("SEND OK", 3000); }
++sent;
Serial.print(F("GET "));
Serial.print(path);
Serial.println(F(" sent to the ESP-01S"));
It does not keep the whole page - an UNO has little RAM. Every byte of +IPD data goes through a tiny matcher that looks for GPIO2) is <b> and keeps the word after it, ON or OFF:
void pageByte(char c) {
if (inAnswer) {
if (c == '<' || answerLength >= sizeof(answer) - 1) inAnswer = false;
else answer[answerLength++] = c;
answer[answerLength] = '\0';
return;
}
keyAt = (c == KEY[keyAt]) ? keyAt + 1 : (c == KEY[0] ? 1 : 0);
if (KEY[keyAt] == '\0') { keyAt = 0; inAnswer = true; answerLength = 0; answer[0] = '\0'; }
}
The pot is the switch. Five times a second the sketch reads A0: past 60 % it is in the "up" zone, below 40 % in the "down" zone, and in between nothing changes. It acts only when the pot moves into a zone, so an ON or OFF typed in the monitor stays until somebody turns the pot:
const int now = a0 > ON_ABOVE ? 1 : a0 < OFF_BELOW ? 0 : -1;
if (now >= 0 && now != zone) setLamp(now == 1, now ? "Pot up" : "Pot down");
if (now >= 0) zone = now;
RV1 starts at 70 %, so at Run the remote joins TEP-WiFi and switches the lamp on at once:
UNO + ESP-01 adapter: Wi-Fi remote for the ESP-01S blue LED
ESP-01 found on the adapter, now at 9600 bps
Joining TEP-WiFi... connected
The lamp: http://192.168.1.101/
Turn the pot up (above 60 %) or down (below 40 %), or type ON / OFF
Pot up: BLUE ON
GET /blue/on sent to the ESP-01S
The ESP-01S says: Blue LED (GPIO2) is ON
Turn RV1 below 40 % (click the pot's arrows) for BLUE OFF - or type the commands in ARD2's monitor, as we did for the pictures:
Monitor: BLUE OFF
GET /blue/off sent to the ESP-01S
The ESP-01S says: Blue LED (GPIO2) is OFF
BLINK
Monitor: BLINK
GET /blink sent to the ESP-01S
The ESP-01S says: Blue LED (GPIO2) is OFF
ON
Monitor: BLUE ON
GET /blue/on sent to the ESP-01S
The ESP-01S says: Blue LED (GPIO2) is ON
STATUS
Pot 70 %, lamp ON, requests 4, answered 4
Request: GET /blue/on HTTP/1.1
Request: GET /blue/off HTTP/1.1
Request: GET /blink HTTP/1.1
Request: GET /blue/on HTTP/1.1
Both panels show the exchange from their side:
Our earlier projects linked boards with HTTP between ESP32 boards, raw TCP and UDP; this one shows that an UNO with an ESP-01 can be a web client as well as a server - so it can control any device that has a web page, not only our own boards.
Pins of the ESP-01 Adapter
| Pin | What it is |
|---|---|
| GND | ground |
| RX | the ESP-01's RX through the level shifter - from the Arduino's TX |
| TX | the ESP-01's TX through the level shifter - to the Arduino's RX |
| VCC | the 5 V supply (the AMS1117 makes the ESP-01's 3.3 V) |
Properties of the Adapter
| Property | What it does |
|---|---|
| WIFISSID / WIFIPASS | the router in range (TEP-WiFi / 12345678) |
| BAUD | the ESP-01's factory UART speed (115200) |
| 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-01": TX must reach D8 and RX D9 (AltSoftSerial's fixed pins), VCC 5 V and GND the supply - the panel says NO POWER without it.
- Nothing answers on a real board: some adapters label RX / TX from the Arduino's side - swap the two wires.
- The time shows --:--:--: SNTP needs Wi-Fi and a moment after
AT+CIPSNTPCFG=1,0- type TIME again. - The sketch loses the module after a reset: a reset clears the server, CIPMUX and UART_CUR - set them up again, as the clock demo does every 30 s.
- "The ESP-01S does not answer": the lamp (U1) must be on Wi-Fi with its web server running before the remote sends.
- No panel: click the PANEL pad or the ESP8266EX chip, or turn "Open the panel at Run" back on in Settings.
Things to Know Before Using a Real ESP-01 Adapter
- Power: the ESP-01 draws up to about 300 mA while it sends. The UNO's 5V pin from USB is enough for a test; a project deserves its own 5 V supply.
- Check the input range: most adapters take 5 V, some up to 12 V - read your seller's notes before you connect more than 5 V.
- No flash mode: GPIO0 is not brought out, so you cannot load new firmware through the adapter - use a USB programmer for that, then put the ESP-01 back.
- The firmware: most ESP-01 modules ship with AT firmware at 115200 bps;
AT+GMRtells you the version. - Our ESP-01 and ESP-01S sketches work with the adapter unchanged - it only takes care of the supply and the levels.
Limitations of the Simulation
- The ESP8266 runs our model of the AT firmware 1.7.4, not your own ESP8266 firmware; the adapter has no GPIO0 pin, so there is no flash mode.
- Not modelled: the soft access point (CWMODE 2 / 3 are accepted, but nothing can join it), SSL connections, the regulator's current limit and the real voltages (the lines are logic levels), the radio itself - the join and network times are realistic values.
- 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-01 are names of Espressif and Ai-Thinker; this library is not made or endorsed by Espressif, Ai-Thinker, Arduino, ThingSpeak or Labcenter.
- Tested in Proteus 8.5 in October 2026 (the two demos as shipped, the clock demo 37.9 s of simulation in 93 s, about 0.4 x real time; the remote with its two UNOs 10.4 s in 38 s, about 0.25 x). Proteus 7 is not supported.
So, that was all about the ESP-01 Adapter Library for Proteus. I hope it helps you put the ESP-01 on a 5 V Arduino without worrying about the 3.3 V levels - first in Proteus, then on the bench. Our series started with the ESP32 DevKit V1 Library for Proteus V2.0 - try linking the adapter with any of our ESP32 boards too. If you use the ESP-01 Adapter 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