ESP32-C3 SuperMini modules are remarkably affordable, but with a significantly restricted WiFi range. A simple antenna mod can improve its performance
ESP32-C3 SuperMini: Unleashing WiFi Potential with a Simple Mod and ANNEX32-BASIC
The ESP32-C3 SuperMini modules are remarkably affordable, but the integrated PCB antenna significantly restricts WiFi range. However, a simple antenna modification can radically improve its performance.
The Simple Antenna Modification
This involves adding a wire antenna. A 31mm length of 1.5mm silver-plated wire is formed into a specific shape: a small loop at the bottom (approx. 5mm diameter) with the rest extending vertically. The loop fits around both ends of the original antenna.
[Image: ESP32-C3 SuperMini Modification - COMPLETE VIEW, showing the entire module and wire antenna clearly. This is the MOST important image.]
Testing and Results: Driven by ANNEX32-BASIC
To evaluate, a custom WiFi logger program, written specifically for the ESP32 hardware using ANNEX32-BASIC, was used. It directly compares the signal strength of modified versus unmodified modules.
Testing consistently showed an improvement of at least 6dB, and frequently exceeding 10dB! This makes WiFi much more reliable at a greater distance.
(See attached images for the close-ups of the construction, the testing setup, and a graph of the performance. The complete code for the program in ANNEX32-BASIC is also attached).
Conclusion:
This inexpensive modification offers a massive WiFi performance upgrade for the ESP32-C3 SuperMini. It's highly recommended for any project needing reliable WiFi! The whole code is written in Annex32-BASIC, which gives the user a very slim and effective software to measure the quality of the connection.
Attached Images/Files:
Close-up of the soldering points
The WiFi logger test setup
Performance graph
Complete ANNEX32-BASIC Code for the WiFi Logger
A more elaborated blog post aubout this modification can be found at my Blog
Forget all what you think to know about ancient BASIC dialects … It’s worth taking a look at the ANNEX32 Firmware.
The ANNEX32-BASIC code
'######## WIFI-GRAPH-LOGGER #################################### ' This program compares the WiFi signal strengths (RSSI) of two ESP32 modules. ' It aims to graphically display the impact of different antennas on signal quality. ' ' - Module 1 (local): Displays its own signal strength to the Access Point (AP). ' - Module 2 (remote): Sends its signal strength to Module 1. ' Operation modes: ' RX = 1: This module (local) regularly sends HTTP requests to the remote module. ' TX = 1: This module (remote) responds to HTTP requests with its signal strength. ' Author: Peter Neufeld (peter.neufeld@gmx.de, 03/2025)
' Configuration for the local module (ESP32 Module 1): RX = 1 ' This module sends requests to the remote module. TX = 0 ' This module does not respond to requests. ' Configuration for the remote module (ESP32 Module 2): 'RX = 0 ' This module does not send requests. 'TX = 1 ' This module responds to requests.
REMOTE_IP$ = "192.168.0.134" ' IP address of the remote module (Module 2)
X_Num = 100 ' Number of measurements to display in the graph. WIFI_REMOTE$ = "" ' Stores the received RSSI values from the remote module.
'onhtmlreload: Triggered when the webpage is reloaded. onhtmlreload WEBPAGE gosub WEBPAGE
' Enables URL handler for TX mode: IF TX = 1 onurlmessage RETURN_WIFI_STRING
' Enables asynchronous HTTP requests in RX mode: IF RX = 1 onwgetasync RECEIVE_REMOTE_STRING
' Timer to regularly measure local signal strength: timer0 500, LOG_MY_WIFI_CONNECTION
' Timer to regularly query remote signal strength: IF RX = 1 timer1 1000, GET_REMOTE_WIFI_LOG_STRING
WAIT
'############################################################### LOG_MY_WIFI_CONNECTION: ' Measures local WiFi signal strength and stores it in WIFI_LOCAL$.
w=0 for i = 1 to 50 w = wifi.rssi + w ' Accumulates RSSI values for averaging. next i w = W / (i-1) ' Calculates the average RSSI value.
WIFI_LOCAL$ = trim$(WIFI_LOCAL$ + " " + str$(wifi.rssi,"%2.1f")) c = word.count(WIFI_LOCAL$, " ") ' Counts stored values. p = instr(1, WIFI_LOCAL$, " ") ' Finds the first value in the string. p = len(WIFI_LOCAL$) - p ' Calculates the length of remaining values.
If c > X_Num then WIFI_LOCAL$ = right$(WIFI_LOCAL$, p) ' Limits the number of values.
' Updates the graph with local values: jscall |traceme(0,"| + WIFI_LOCAL$ + |");| ' Updates the graph with remote values if available: if WIFI_REMOTE$ <> "" jscall |traceme(1,"| + WIFI_REMOTE$ + |");|
return
'############################################################### RETURN_WIFI_STRING: ' Returns local RSSI values as a response to an HTTP request. URLMSGRETURN WIFI_LOCAL$ return
'############################################################### GET_REMOTE_WIFI_LOG_STRING: ' Sends an HTTP request to the remote module to query its RSSI values. wgetasync ("http://" + REMOTE_IP$ + "/msg?x=1") return
'############################################################### RECEIVE_REMOTE_STRING: ' Receives and stores the RSSI values from the remote module. WIFI_REMOTE$ = WGETRESULT$ return
Veuillez saisir votre adresse électronique. Les instructions de réinitialisation de votre mot de passe vous seront immédiatement envoyées par courriel.
Discussion (0 commentaire(s))